Shai-Hulud Geri Döndü: 300’den Fazla NPM Paketi Enfekte Oldu
(helixguard.ai)- NPM kayıt defterinde 1.000’den fazla bileşen, birkaç saat içinde aynı yöntemle enfekte edildi ve kötü amaçlı kod içeren yeni sürümler yayımlandı
- Kötü amaçlı paketler, Bun runtime kurulum betiği gibi davranarak
setup_bun.jsve obfuscate edilmişbun_environment.jsdosyasını ekledi; çalıştırıldığında TruffleHog kullanarak yerel kimlik bilgilerini çaldı - Toplanan AWS/GCP/Azure·GitHub·NPM token’ları gibi hassas bilgiler,
SHA1HULUDadlı bir GitHub Action runner üzerinden dışarı aktarıldı - Kötü amaçlı betik,
npm publishkomutunu otomatik çalıştırarak solucan benzeri kendi kendini çoğaltma gerçekleştirdi; sonuç olarak 27.000’den fazla GitHub deposu enfekte oldu - Bu olay, açık kaynak ekosisteminin geneline yayılan tedarik zinciri güvenliği tehdidini yeniden gündeme getiren bir örnek olarak değerlendiriliyor
Saldırıya genel bakış
- 24 Kasım 2025’te HelixGuard, NPM kayıt defterinde 1.000’den fazla paketin birkaç saat içinde aynı yöntemle enfekte edildiğini tespit etti
- Yeni sürümler, Bun runtime ekliyormuş gibi davranıyor ve
preinstall: node setup_bun.jsbetiğini içeriyordu - Birlikte dağıtılan
bun_environment.jsdosyası obfuscate edilmiş kötü amaçlı koddu; çalıştırıldığında TruffleHog’u indirip yürütüyordu
- Yeni sürümler, Bun runtime ekliyormuş gibi davranıyor ve
- TruffleHog, yerel ortamda NPM token’ları, AWS/GCP/Azure kimlik bilgileri, ortam değişkenleri gibi verileri tarayarak çaldı
- Çalınan bilgiler,
SHA1HULUDadlı GitHub Action runner’ı oluşturupSha1-Hulud: The Second Coming.açıklamasına sahip bir GitHub deposu üzerinden dışarı sızdırıldı - HelixGuard, bu saldırının Eylül 2025’te yaşanan “Shai-Hulud” olayıyla aynı saldırgan tarafından gerçekleştirilmiş olabileceğine işaret ediyor
Kötü amaçlı kodun çalışma analizi
- Örnek olarak
@asyncapi/specspaketi incelendiğinde, NPM’de yayımlanan sürümün enfekte olduğu ancak GitHub’daki kaynak deponun güvenli olduğu görüldü - Saldırgan,
package.jsondosyasını değiştirereksetup_bun.jsekledi ve bu betiğinbun_environment.jsdosyasını çağırmasını sağladı bun_environment.js, 10 MB’tan büyük yüksek derecede obfuscate edilmiş bir JavaScript dosyası ve başlıca işlevleri şunlar:- Ortam değişkenlerinden bulut kimlik bilgileri ve token toplama
- TruffleHog kullanarak gizli anahtar taraması yapma
- GitHub Actions üzerinden veri sızdırma
- Ayrıca
package.jsondosyasını değiştirip enfeksiyon kodunu ekliyor venpm publishkomutunu otomatik çalıştırarak solucan benzeri yayılma gerçekleştiriyordu
GitHub enfeksiyonu ve veri sızdırma
- Kötü amaçlı betik,
.github/workflows/formatter_123456789.ymldosyasını oluşturupSHA1HULUDrunner’ını kaydediyor - Bu workflow, deponun gizli anahtarlarını çift Base64 kodlamasıyla
actionsSecrets.jsondosyası halinde paketliyor - Ardından
Sha1-Hulud: The Second Coming.açıklamasına sahip rastgele adlı bir GitHub deposu oluşturup verileri yüklüyor - HelixGuard, 27.000’den fazla GitHub deposunun enfekte olduğunu doğruladı
- Çalınan gizli bilgiler arasında
AWS_ACCESS_KEY_ID,SLACK_WEBHOOK_URL,CODECOV_TOKEN,WEBFLOW_TOKENgibi çeşitli hizmet kimlik bilgileri bulunuyor
Enfekte paketlerin listesi
- HelixGuard, yüzlerce NPM paketinin enfekte olduğunu bildirdi
- Bunlar arasında
@asyncapi,@ensdomains,@posthog,@zapier,@postman,@voiceflowgibi önemli kuruluşların paketleri de yer alıyor - Her paket içinde birden fazla sürümün enfekte olduğu görüldü (ör.
@asyncapi/specs@6.8.2,@postman/csv-parse@4.0.5)
- Bunlar arasında
- Enfekte paketlerin çoğu meşru açık kaynak projeleri gibi görünüyordu ve otomatik dağıtım sürecine kötü amaçlı kod enjekte edilmişti
Güvenlik açısından çıkarımlar
- Bu saldırı, tedarik zinciri güvenliğindeki zayıflıkları istismar ederek büyük ölçekli açık kaynak ekosistemini enfekte eden bir vaka
- NPM·GitHub·bulut kimlik bilgileri dahil geliştirme altyapısının genelinde güvenlik yönetiminin güçlendirilmesi gerekliliğini ortaya koyuyor
- HelixGuard, enfekte paketlerin kurulumunun derhal durdurulmasını ve ilgili token’lar ile kimlik bilgilerinin hemen iptal edilmesini tavsiye ediyor
5 yorum
JS ekosisteminin gerçekten tam bir çöplük olduğu yorumu doğru.
https://github.com/search/…
Gerçek zamanlı bir tarayıcı betiği oluşturdum.
Şüpheli deponun path'inde
npx sha1-hulud-scannerkomutunu girmeniz yeterli.
Kaynak kodu: https://github.com/developerjhp/sha1-hulud-scanner
Hacker News yorumu
Bir ipucu paylaşayım: NPM yerine PNPM kullanmak daha iyi
PNPM 10.x birçok saldırı vektörünü engelliyor
1️⃣ Varsayılan olarak post-install scriptlerini çalıştırmıyor ve manuel onay istiyor
2️⃣ Yeni bir sürüm yayınlandıktan sonra belirli bir süre geçmeden (ör. 4 gün) kurulmayacak şekilde ayarlanabiliyor
NPM, production CLI ortamında fazla istikrarsız
Publisher anahtarlarını en az ayrıcalıkla sınırlamak, yalnızca belirli paketlere bağlamak ve IP’yi CI/CD runner’larına sabitlemek iyi olur
Publish anahtarlarını lokalde tutmayın; gerekirse OIDC Trusted Publisher ya da token tabanlı erişimi değerlendirin
Sadece lockfile için bile beş kez denediler ama hâlâ kusursuz değil
Yapıya ve commit geçmişine bakınca ekibin ciddi şekilde iyileştirmeye çalıştığı belli ama sanki işe çok derin bir çukurdan başlamışlar
Hâlâ dosya aktarımı sırasında erken EOF’yi algılayamıyor ve cache’te eksik dosyalar bırakıyor; bu da yavaş internet ortamlarında update hataları yüzünden ciddi zaman kaybına yol açıyor
Başta karmaşık ama secret’ları lease kavramıyla yönetebiliyorsunuz
Her CI build’i için bir lease oluşturuluyor ve bittiğinde otomatik olarak iptal ediliyor; ayrıca TTL ve otomatik rotasyon da destekleniyor
Bu sayede uzun ömürlü kimlik bilgilerini saklamak yerine yalnızca build anında kısa ömürlü token’lar verebiliyorsunuz
Böyle saldırılar sayesinde şirket içinde gerçek bir güvenlik tartışması başlaması olumlu
npm cikullanmak yeterliÇünkü package-lock.json’da belirtilen sürümler kuruluyor, bu da otomatik güncellemelerden kaynaklanan saldırı riskini azaltıyor
Önemli olan yalnızca bilinçli güncelleme yapmak
pip install --only-binary=:all:seçeneğiyle benzer koruma elde edebilirsinizSource distribution’ları tamamen engelliyor ve yalnızca wheel kuruyor
Ama bunun bazı sürüm kısıtları olabilir
uviçinde--exclude-newerseçeneğiyle PNPM’in “minimum release age” özelliği taklit edilebilirBen tüm dependency’leri sabitliyorum ve dependabot bildirimlerini manuel inceliyorum
Bunun aşırı mı yoksa doğru bir alışkanlık mı olduğundan hâlâ emin değilim
Bugün özellikle ilgili bir yazı var: “We should all be using dependency cooldowns”
Otomatik dependency güncellemeleri, bir günlük bir açıktan daha tehlikeli olabilir
Çünkü zaten binlerce lockfile’a yayılmış bulaşmış paketleri geri almak çok daha zor
Bir şey düzgün çalışıyorsa durduk yere dokunmaya gerek yok
uvaracındauv lock --exclude-newer $(date --iso -d "24 hours ago")komutuyla benzer bir etki elde edilebilirİlgili tartışma issue #14992 içinde var
npx npm-check-updates -c 7komutuyla 7 günlük cooldown ayarlanabilirAyrıntılar için npm-check-updates dokümanı
Cooldown, 0-day açıkların yayılma süresini uzatabilir
Herkes aynı cooldown’ı kullanırsa sadece tespit gecikmesi yaratır
PostHog kurucu ortaklarından biriyim
Bu saldırının mağdurlarından biriydik
Bulaşmış sürümler posthog-node 4.18.1, 5.13.3, 5.11.3 / posthog-js 1.297.3 / posthog-react-native 4.11.1 / posthog-docusaurus 2.0.6
Anahtarların ve parolaların hepsini değiştirdik, ayrıca yeni sürümler yayınladık
Kök neden analizi yapıyoruz ve status.posthog.com üzerinde güncelleme paylaşacağız
Eğer web sitesi bulaşmış sürümü dağıttıysa ziyaretçilere zarar verip vermediğini bilmek isterim
Ciddi bir soru: Node ile yeni proje başlatmak doğru mu
Astro ile bir SaaS frontend’i yapıyorum ve dependency güncellemesi yaparken her seferinde tedirgin oluyorum
npm ekosistemindeki güvenlik eksikliği fazla ciddi hissettiriyor
Rust gibi sayısız alt pakete bağımlı ekosistemler de bir gün aynı şeyi yaşayacaktır
C, C++ ya da Odin gibi package manager olmayan yaklaşımlar güvenlik açısından daha akıllıca olabilir
Son zamanlarda Deno’nun JSR yapısına daha çok güveniyorum
JSR tabanlı paketler npm’e de çapraz olarak yayınlanıyor ve Deno’ya özel paketler de var
Örneğin Lume yavaş ama istikrarlı bir SSG olarak etkileyiciydi
npm en büyük repository olduğu için saldırganlar açısından sadece daha değerli
Aynı şey RubyGems ya da Cargo’da da rahatlıkla olabilir
Sadece en çok kullanılan ekosistem olduğu için saldırılar oraya yoğunlaşıyor
Dependency’leri dikkatli yönetin, her gün update etmeyin, yeter
Sayfa render etmek için 100’den fazla dependency gerekmemesi önemli bir avantaj
Proje bağlantısı
Bu aralar tüm geliştirmeyi sadece Podman container içinde yapıyorum
Okumadığım kodu mutlaka izole bir ortamda çalıştırıyorum
Mükemmel değil ama en azından temel bir güvenlik alışkanlığı bence
Güvenlik genelde uzmanlara devredilen bir alan olduğu için bunu pratikte değiştirmek zor
12 yıl önce NPM bir kez tamamen çökmüştü
O zamanlar yalnızca bir açık kaynak projesiydi ama şimdi Microsoft’un elinde
Dünyanın en büyük şirketlerinden biriyse bu tür sorunları çözmesi gerekmez mi?
Ama hâlâ pek bir şey değişmiş değil
Enterprise lisansıyla para getirmeyen şeyleri ihmal ediyor
Bu yüzden Windows 11 daha çok bir pazarlama paketi gibi geliyor
Şu anda saldırı faaliyetini izliyoruz ve bulaşmış paket listesini Wiz blogunda güncelliyoruz
Kötü amaçlı payload’u reverse engineer ediyoruz ve birkaç saat içinde sonuçları paylaşmayı planlıyoruz
PostHog’un “Talk to a human” sohbeti gerçekte robot yanıtları verdiği için rahatsız ediciydi
Acil destek bağlantısı da düzgün yönlendirmiyor
O yüzden sormak istiyorum — hangi sürümlerden kaçınmalıyız?
Bulaşmış sürümler posthog-node 4.18.1, 5.13.3, 5.11.3 / posthog-js 1.297.3 / posthog-react-native 4.11.1 / posthog-docusaurus 2.0.6
En son sürüme güncellerseniz güvendesiniz
Bu paket karmaşasının neden hep Node ekosisteminde yaşandığını merak ediyorum
Bu topluluğun neden karmaşık install hook’larını ve otomatik güncellemeleri iyi mühendislik saydığını anlamıyorum
Node’un yaratıcısının neden çoktan ayrıldığını anlıyorum
Devasa bir ekosistem, acemi geliştirici ağırlığı, düşük güvenlik farkındalığı ve en küçük işlev için bile kütüphane bağımlılığı
Debian’daki gibi güvenilir bakımcılar doğrulama yapmalı ama JS topluluğu bunu gatekeeping diye reddediyor
Bu yüzden bu tür olaylar tekrar tekrar yaşanıyor
Böyle bir tavırla hiçbir şey değişmez
Konudan biraz sapacağım ama HelixGuard’ın kim olduğunu merak ediyorum
Web sitesi berbat ve neredeyse hiç bilgi yok
Müşterileri bir kripto borsasıymış gibi görünüyor, bu da biraz şüpheli
HelixGuard X hesabı
2️⃣ Yeni bir sürüm yayımlandıktan sonra belirli bir süre (ör. 4 gün) geçmeden kurulmayacak şekilde ayarlanabiliyor.
Çok iyi bir özellikmiş. Google da bazen hatalı ya da çalışmayan sürümleri NPM'e yüklüyor; o zaman da sorun bende mi diye paniklediğim oluyor.