- npm ekosistemi genelinde yıkıcı kötü amaçlı yazılım varyantları yayılıyor ve GitLab güvenlik ekibi bunu tespit etti
- Kötü amaçlı yazılım, Shai-Hulud'un evrimleşmiş bir biçimi; enfekte geliştiricinin diğer paketlerini de otomatik olarak bulaştıran solucan benzeri yayılma yapısına sahip
- GitHub, AWS, GCP, Azure vb. ortamlardan kimlik bilgileri çalındıktan sonra veriler, saldırganın kontrolündeki GitHub depolarına sızdırılıyor
- GitHub ve npm erişimi aynı anda engellenirse kullanıcı verilerini anında silen bir “deadman switch” içeriyor
- GitLab, kendi sistemlerinin enfekte olmadığını doğruladı ve Dependency Scanning ile GitLab Duo Chat üzerinden tespit ve müdahale yöntemleri sundu
Saldırıya genel bakış
- GitLab Vulnerability Research ekibi, npm ekosisteminde büyük ölçekli bir tedarik zinciri saldırısı tespit etti
- Dahili izleme sistemi birden fazla enfekte paketi keşfetti
- Kötü amaçlı yazılımın Shai-Hulud varyantı olduğu doğrulandı
- Kötü amaçlı yazılım, solucan benzeri yayılma yoluyla enfekte geliştiricinin diğer paketlerine de otomatik olarak bulaşıyor
- GitLab, kendi bünyesinde kötü amaçlı paketler kullanmadığını doğruladı ve bilgileri güvenlik topluluğuyla paylaştı
Saldırının iç yapısı
- Dahili izleme sisteminin tespit ettiği kötü amaçlı npm paketleri şu işlevleri yerine getiriyor
- GitHub, npm, AWS, GCP ve Azure'dan kimlik bilgisi toplama
- Ele geçirilen verileri saldırgan kontrolündeki GitHub depolarına gönderme
- Kurbanın diğer paketlerini otomatik olarak enfekte etme
- Altyapıya erişim engellenirse yıkıcı payload çalıştırma
- Birden fazla enfekte paket doğrulandı ve soruşturma sürüyor
Teknik analiz: saldırının işleyişi
İlk enfeksiyon vektörü
- Kötü amaçlı yazılım sisteme çok aşamalı bir yükleme süreciyle sızıyor
- Enfekte paketin
package.json dosyasına setup_bun.js betiği ekleniyor
- Görünüşte Bun JavaScript runtime'ını kurmak için gizlenmiş durumda
- Gerçekte ise
bun_environment.js (10MB, obfuscate edilmiş payload) çalıştırılıyor
- Küçük bir loader dosyası ve büyük bir obfuscate payload kombinasyonuyla tespitten kaçıyor
Kimlik bilgisi toplama
- Çalıştırıldığı anda çeşitli kaynaklardan token ve gizli bilgileri topluyor
- GitHub token'ları (
ghp_, gho_)
- AWS, GCP, Azure kimlik bilgileri
- npm token'ları (
.npmrc ve ortam değişkenleri)
- Trufflehog aracıyla tüm home dizinini tarayarak API anahtarları, parolalar, Git geçmişi vb. bilgileri arıyor
Veri sızdırma ağı
- Ele geçirilen GitHub token'larıyla açıklamasında “Sha1-Hulud: The Second Coming.” bulunan herkese açık depolar oluşturuyor
- Bu depolar veri bırakma kutusu işlevi görüyor
- Kalıcılık için GitHub Actions runner kuruluyor
- Yetki yetersiz olduğunda, aynı işareti taşıyan diğer depoları arayarak başka sistemlerin token'larını yeniden kullanıyor
- Böylece dağıtık bir token paylaşım ağı oluşuyor
Tedarik zinciri boyunca yayılma
- Ele geçirilen npm token'larıyla kurbanın tüm paketleri enfekte ediliyor
- Orijinal paketi indirme
setup_bun.js dosyasını preinstall script'i olarak ekleme
bun_environment.js payload'unu ekleme
- Sürüm numarasını artırma
- Enfekte paketi npm'e yeniden yayımlama
Deadman switch
- Kötü amaçlı yazılım GitHub'a (veri sızdırma) ve npm'e (yayılma) erişimi sürekli izliyor
- Her iki kanal da engellenirse hemen veri imhası başlatıyor
- Windows: kullanıcı dosyalarını silme ve disk sektörlerinin üzerine yazma
- Unix türevleri:
shred komutuyla dosyaların üzerine yazıp ardından silme
- GitHub depolarının topluca silinmesi veya npm token'larının toplu olarak iptal edilmesi durumunda, enfekte sistemlerin aynı anda veri silme işlemi yapma riski bulunuyor
İhlal göstergeleri (IoC)
- Başlıca tespit göstergeleri
- Dosya:
bun_environment.js (kötü amaçlı post-install script'i)
- Dizin:
.truffler-cache/, .truffler-cache/extract/
- Süreçler:
del /F /Q /S "%USERPROFILE%*", shred -uvz -n 1, cipher /W:%USERPROFILE%
- Komutlar:
curl -fsSL https://bun.sh/install | bash, powershell -c "irm bun.sh/install.ps1|iex"
GitLab'in tespit ve müdahale desteği
- GitLab Ultimate kullanıcıları, yerleşik güvenlik özellikleriyle maruziyet durumunu hemen kontrol edebilir
- Dependency Scanning etkinse
package-lock.json veya yarn.lock içindeki enfekte paketleri otomatik olarak tespit eder
- Enfekte paket içeren merge request'lerde uyarı gösterilir
- GitLab Duo Chat entegrasyonuyla sorgu tabanlı hızlı tespit yapılabilir
- Örnek: “Shai-Hulud v2 kampanyasından etkilenen bağımlılıklar var mı?”
- Security Analyst Agent, proje zafiyet verilerini sorgulayıp doğrudan yanıt verir
- Birden fazla depo yöneten ekipler için CI/CD tabanlı otomatik tespit ile ajan tabanlı hızlı müdahalenin birlikte kullanılması öneriliyor
Geleceğe bakış
- Bu saldırı, saldırı altyapısını korumak için kurban verilerini yok etmeyi kullanan yeni bir tedarik zinciri saldırısı biçimi olarak değerlendiriliyor
- GitLab, toplulukla iş birliği içinde güvenli kurtarma stratejileri geliştiriyor ve otomatik tespit sistemleriyle varyantları sürekli izliyor
- Amaç, erken bilgi paylaşımı sayesinde deadman switch kaynaklı ikincil zararları önlemek
1 yorum
Hacker News yorumları
Yaklaşık bir ay önce can sıkıcı bir iş yapmam gerekti ve bir NPM paketi aradım
brew install npmkomutunu çalıştırınca bağımlılık şelalesi üzerime aktı; bir an durup riskleri ve getirileri düşündüm, sonra sonundabrew uninstall npmile geri aldımBunun yerine eski bir Unix yardımcı programı boru hattı ve awk ile çözdüm; şimdi dönüp bakınca verdiğim en iyi kararlardan biri buydu
NPM, tarayıcı uyumluluğu sorunlarını çözmek için yapılmış bir araç; tarayıcının olmadığı ortamlarda gereksiz karmaşıklık yaratıyor
Node ya da Python gibi bağımlılığı bol ekosistemlerin kodunu ana sistemde doğrudan çalıştırmak, tedarik zinciri saldırılarına maruz kalma riskini artırıyor
Bu yüzden ben varsayılan sisteme Python ya da JS yorumlayıcısı kurmuyorum
Sonunda vazgeçtim ama şimdi bakınca doğru olan oymuş gibi geliyor
“GitHub kötü amaçlı depoları topluca silerse, binlerce sistem aynı anda kullanıcı verilerini yok edebilir” denmişti,
Bu biraz rehine krizine benziyor — bu yüzden “rehineyi vur” şakası yapıldı
Ben de bu npm saldırısının kurbanlarından biriyim
GitHub CLI'ın HOME dizininde düz metin OAuth token'ı sakladığını öğrenince şoke oldum
Bir saldırgan buna erişse hesabımla neredeyse her şeyi yapabilirdi
macOS'ta güvenli biçimde işletim sistemi anahtar zincirinde tutuluyor — ilgili tartışma
Chrome işletim sistemi koruma özelliklerini kullanıyor ama Firefox hâlâ kullanmıyor
Sonuçta asıl çözüm sandbox tabanlı erişim denetimi
Ama platformlar arasında tutarlı bir çözüm yok ve macOS'ta bile kusursuz bir yöntem bulunmuyor
~/.dev-envdizini oluştu ve dizüstü bilgisayarım bir GitHub runner'ına dönüştüBluefin Linux'un salt okunur dosya sistemi sayesinde hasar azalmış olabilir
Herkes sadece npm'i suçluyor ama GitHub'ın da sorumluluğu büyük
Kötü amaçlı depoları yeterince hızlı tespit edemedi ve zararlı yazılım deposu sorunu zaten ciddi boyutta
Eğer gizlice harici bir sunucuya gönderilseydi çok daha korkunç olurdu
Topluluk düzeyinde araçlara ve uygulamalara ihtiyaç var
Ticari düzenleme ya da build iş akışı kısıtları gelirse bu büyük bir soruna dönüşebilir
Neden hep NPM'in hedef alındığını merak ediyordum
Python ya da Java da çok popüler ama son zamanlarda sessizler
sürüm aralığı bağımlılığı kültürü nedeniyle enfeksiyon hızla yayılıyor
Java'da belirli sürümlere sabitlemek yaygın olduğundan bu tür olaylar daha nadir
Bu yüzden tek bir paket onlarca alt bağımlılığı beraberinde getiriyor
deneyimi az geliştirici sayısı fazla olduğundan güvenlik zayıf kalıyor
Diğer dil ekosistemleri güncellemeyi doğruladıktan sonra yaparken, JS tarafında hemen yükseltme yapılıyor
Kurulum sırasında betikleri serbestçe çalıştırabiliyor; JVM ya da Python tarafı böyle değil
.npmrcdosyasınaeklemek saldırı vektörünü azaltabilir
ilgili yazı
devre dışı bırakıldığında bağımlılıkların bozulması riski yok mu, diye de düşünüyorum
Bu saldırıda beni en çok endişelendiren şey kimlik bilgilerinin çalınması
Enfekte paketi kurduysanız ortam değişkenleriniz ya da
.npmrctoken'larınız sızdırılmış olabilirToken'ları ve API anahtarlarını derhal döndürmek gerekir
Düzenli döndürme, ihlal sonrası müdahale değil, önleyici bir tedbirdir
Kimlik bilgileri ortam değişkenlerinde ya da dosyalarda saklanmamalı; güvenlik anahtarı veya şifrelenmiş dosyalar kullanılmalı
Biraz dağıtık deftere kötü amaçlı işlem yerleştirmeye benziyor
Sorun, hâlâ birçok hizmetin varsayılan olarak düz metin saklaması
Bu tür saldırılar tekrar edip dururken neden yapay zeka tabanlı tespit sistemlerinin çalışmadığını merak ediyorum
Microsoft yapay zekayı bu kadar öne çıkarıyor ama GitHub güvenliğinde kullanmıyor gibi görünüyor
Güvenlik duvarının engellediği her denemeye saldırı dendiği dönem gibi, anlamı aşınmış durumda
İçeride bunu SonaType IQ Server destekliyor
Nitekim curl projesinin AI üretimi güvenlik raporu spam'i ile uğraştığı bir örnek de var
postinstall script'lerine izin vermek için hâlâ bir gerekçe olup olmadığını merak ediyorum
Kullanıcıya çalıştırılsın mı diye sormak daha iyi olmaz mı?
CI sunucularında etkileşimsiz kurulum gerektiği için bunun pratikte zor olduğunu düşünüyorum
Yazı çok içgörülüydü ama sonunda GitLab güvenlik özellikleri reklamıyla bitmesi biraz hayal kırıklığı yarattı