Shai-Hulud temalı kötü amaçlı yazılım, PyTorch Lightning AI eğitim kütüphanesinde tespit edildi
(semgrep.dev)- Derin öğrenme çatısı
lightningin 2.6.2 ve 2.6.3 sürümleri tedarik zinciri saldırısında kötüye kullanıldı — yalnızcapip install lightningkomutunu çalıştırmak bile gizli_runtimedizinindeki obfuscate edilmiş JavaScript yükünün otomatik olarak çalışmasına neden oluyor - Görüntü sınıflandırıcı oluşturma, LLM fine-tuning, difüzyon modelleri ve zaman serisi tahmini gibi alanlarda yaygın kullanılan bir çatı olduğundan, birçok AI/ML ekibinin bağımlılık ağacında zaten yer alıyor olma ihtimali yüksek
- Kötü amaçlı yazılım çalıştığında yerel dosya sisteminde 80'den fazla yolu tarayarak GitHub token'larını (
ghp_,gho_), npm token'larını (npm_), ortam değişkenlerini ve bulut gizli anahtarlarını çalıyor; dosya başına en fazla 5 MB işliyor - AWS (kimlik bilgisi dosyaları·IMDSv2·ECS·Secrets Manager·SSM), Azure (Key Vault), GCP (Secret Manager) dahil üç büyük bulut sağlayıcısının tamamında gizli değerleri enumerate edip alıyor
- GitHub Actions ortamında yerleşik Python ile
Runner.Workersüreç belleğini dump ederek"isSecret":trueolarak işaretlenmiş tüm gizli değerleri ve depo·workflow bilgilerini çıkarıyor - Giriş noktası PyPI (Python) olsa da worm yayılımı npm (JavaScript) üzerinden genişliyor — çalınan npm token'larıyla yayımlama yetkisi olan tüm paketlere dropper (
setup.mjs) ve kötü amaçlı yazılımı (router_runtime.js) enjekte ediyor, patch sürümünü artırıp yeniden yayımlıyor; bu paketleri kuran alt geliştiricilerin makinelerine kadar zincirleme bulaşıyor - Veri sızdırma, tek bir yolu engelleyerek durdurulamasın diye 4 paralel kanal kullanıyor: ① HTTPS POST ile C2 sunucusuna gönderim, ② GitHub commit arama API'sini kullanan dead drop (commit mesajına çift Base64 kodlanmış token yerleştirme), ③ Dune evrenindeki isimleri taşıyan herkese açık GitHub depolarına
results-<timestamp>.jsonolarak commit etme, ④ doğrudan kurban deposuna push etme - Depoya sızdıktan sonra geliştirme araçlarına kalıcılık hook'ları yerleştirerek yeniden bulaşmayı garanti ediyor — Claude Code'un
.claude/settings.jsondosyasına oturum başında otomatik çalışan birSessionStarthook'u yazıyor, VS Code'un.vscode/tasks.jsondosyasına ise klasör her açıldığında çalışanrunOn: folderOpengörevi ekliyor- Her iki hook da self-contained dropper
setup.mjsyi çağırıyor; Bun runtime yoksa GitHub'dan sessizce indirip 14.8 MB'lıkrouter_runtime.jsyükünü çalıştırıyor
- Her iki hook da self-contained dropper
- Yazma yetkisine sahip bir GitHub token'ı ele geçirirse kurban deposuna
Formatteradlı kamufle edilmiş bir workflow push ediyor — her push işleminde${{ toJSON(secrets) }}ile depo gizli değerlerini dump edip Actions artifact olarak yüklüyor - Etkilenen dönem içinde bu sürümleri kurmuş tüm makineler tam olarak ele geçirilmiş kabul edilmeli; GitHub token'ları, bulut kimlik bilgileri ve API anahtarları derhal değiştirilmeli, ayrıca
.claude/ve.vscode/dizinlerinde beklenmeyen dosyalar olup olmadığı denetlenmeli - Saldırı göstergeleri arasında commit mesajlarında
EveryBoiWeBuildIsAWormyBoiöneki, depo açıklamasında"A Mini Shai-Hulud has Appeared"ifadesi ve depo içinde_runtime/dizininin bulunması yer alıyor; bunlar GitHub aramasıyla doğrudan doğrulanabilir
2 yorum
Artık güncelleme yapmamak gerekecek...
Hacker News görüşleri
Bu sadece bir sıklık yanılgısı da olabilir ama son zamanlarda büyük paketlerde ses getiren tedarik zinciri saldırıları epey fazla görünmeye başladı
Şu an bile HN’in ilk birkaç sayfasında farklı vakaları ele alan birden çok yazı var
10 yıl önceki
left-padolayını düşününce, bugün başarılı saldırıların eskisine göre daha fazla olup olmadığını merak ediyorum; muhtemelen öyleBaşarılı saldırıların değeri de kesinlikle artmıştır, ama topluluk olarak paket yayınlanmadan önce bunları tespit etme becerimiz gerçekten gelişiyor mu, onu merak ediyorum
Ticari yazılım şirketleri daha iyisini yapmak zorunda, ama hobi/amatör kod olarak başlayıp sonra pek çok projenin bağımlılığına dönüşen durumlar için genel geçer ve kolay araçlar hâlâ eksik görünüyor
Aynı yorumu mevcut SAP tedarik zinciri saldırısı başlığında da yazdım: https://news.ycombinator.com/item?id=47964003
Eskiden
npm installdaha çok elle çalıştırılırdı; muhtemelen build bozulduğunda ya da çok nadiren çalıştırılıyorduTedarik zinciri saldırıları, insanların ya da daha doğrusu pipeline’ların yeni sürüm çıkar çıkmaz paketleri düşünmeden otomatik güncellemesine dayanıyor
Bunun iyi bir iş modeli olup olmadığını bilmiyorum; muhtemelen pek değil
left-padbir saldırı değil, NPM hatasıydıBaşka herkese açık paketlerin zaten bağımlı olduğu bir paket sürümünü silebilmek mümkün olmamalıydı; buna karşılık yeni bir sürüm olup kimsenin bağımlı olmadığı belirli paket sürümleri silinebilmeliydi
left-padyazarı hizmetten ayrılma niyetiyle tüm verilerini silmeye çalıştığında NPM bir hata kodu döndürmeliydiWikipedia’ya göre Koçulu, npm, Inc.’in kararlarından hayal kırıklığına uğrayıp platformun parçası olarak kalmak istemediğini söyleyince, NPM yazarı Schlueter ona kayıtlı 273 modülü silmeye yarayan komutu vermiş
Garip olan şu ki 4 güvenlik sorunu açılmış, ama hepsine
pl-ghostadlı bot otomatik yorum yazıp kapatmış [1][2][3][4]Sonunda bunlardan yalnızca [4] düzgün ele alınmış ve bot yorumlarının hepsi silinmiş
Bot yorumlarını başka bir raporda [5] görebiliyorsunuz; orada özgün metinden daha fazla bilgi var
[1] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[2] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[3] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[4] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[5] https://socket.dev/blog/lightning-pypi-package-compromised
Saldırgan bu hesapla yeni bir Actions workflow’u oluşturdu ve çalıştırılan workflow içinden PyPI secret’larını parse edip dışarı çıkardı
Paketi yayımladıktan sonra da aynı hesapla yorum yazarak bizimle biraz alay etti
Keşke hiç bağımlılık olmayan günler bir an önce gelse
Uç bir örnek olarak, bu aralar kızım için etkileşimli eğitim uygulamaları yaparken Opus’a yalnızca saf JavaScript ve HTML kullandırıyorum
Çift sarkaçtan akışkan simülasyonuna kadar her şey tek seferde gayet iyi çalışıyor; eskiden bunun için yüzlerce bağımlılık olurdu
Kod MIT lisanslıysa, Opus’a sadece gereken kısımları tam olarak çekip benim kullanım amacım için değiştirerek projeye dahil etmesini söyleyebiliyorum
Hobi projelerinde şu ana kadar iyi işledi; ileride prodüksiyon yazılımında da bağımlılıklardan kurtulabilsek keşke
Chrome bir API biçimini değiştirirse gidip kendiniz bulup düzeltmeniz gerekir; Fas yaz saati başlangıç zamanını değiştirirse tarih/saat işleme kodunu da kendiniz güncellemeniz gerekir
Bunlar, kütüphanelerin bizim yerimize hallettiği için doğal karşıladığımız şeyler
Kızınızın gelecek hafta ilgisini kaybedeceği bir çift sarkaç simülatörü için büyük mesele değil, ama süresiz çalışması gereken bir şey yapan şirket için sorun olur
Sanırım uzaktan erişim sağlayan MIT lisanslı bir kod yayımlayıp Opus eğitim verisine girmesini sağlamalıyım
Fast.AI derin öğrenme kursunu alırken, makine öğrenmesi projelerinin beraberinde getirdiği Python bağımlılıklarının sayısına şaşırmıştım
Web frontend projelerinin her zaman çok sayıda üçüncü taraf bağımlılığına sahip olduğu düşünülür, ama bana göre makine öğrenmesi ekosistemi çok daha fazla birbirine dolanmış durumda
Üstelik web geliştirme güvenliğe duyarlı kabul edildiği için uzun zamandır güvenlik bilgeliği ve pratikleri birikti, ama makine öğrenmesi geliştirme çok daha geçici çözümlerle ilerliyor gibi ve genel yazılım mühendisliği pratiklerinin çoğu da uygulanmıyor
Örneğin o dönemde makine öğrenmesi modeli dağıtım yollarından biri Python pickle’dı; bu da temelde kısıtsız çalıştırılabilir nesne demek
Bu biçimdeki modeller, içe aktarıldıkları makinede her şeyi yapabiliyordu; böylesi erken dönem kanunsuz ekosistemler güvenlik ihlallerini ve tedarik zinciri saldırılarını kolaylaştırabiliyor
Kimisi süreç içinde biraz kod yazmayı öğrendi, kimisi matematikçi, kimisi de AI’a fazlasıyla kapılmış geliştirici türünden
“Kod artık önemli değil, çalışsın yeter” zihniyeti de var
Pek çok kişi için düzgün bağımlılık yönetimi, uğraşmak istemedikleri sıkıcı bir angarya sadece
Çeşitli makine öğrenmesi projelerinde bütün bu unsurlar birleşiyor; oysa aslında yeniden üretilebilirliğe en çok odaklanması gereken alanlardan biri makine öğrenmesi olmalı
Repo araması yaptım; son bir gün içinde oluşturulan depolarda
"A Mini Shai-Hulud has Appeared"metnini içeren 2,2 bin depo çıktı: https://github.com/search?q=A%20Mini%20Shai-Hulud%20has%20Ap...Bu, hesapların, muhtemelen GitHub auth/Actions token’larının, ele geçirildikten sonra depo oluşturmak için kullanıldığına işaret ediyor gibi
Bu daha önce de oldu; ders almış olurlar sanıyordum
Bu malware pek çaba göstermemiş, Microsoft da pek çaba göstermiyor gibi
Sorumluluktan kaçmak için söylemiyorum; pytorch’u hiç kullanmadım ve yazılım güvenliği pratiklerini de çok iyi bilmiyorum
Ama pytorch’un ağ erişimine ihtiyaç duyduğu bir senaryoyu gözümde pek canlandıramıyorum
Kod tabanının herhangi bir yerinde rastgele bir modülün içe aktarılıp bu API’yi kullanabilmesi yanlış geliyor
İlave import kısıtlamaları ya da statik analiz gerekli gibi görünüyor
Dilin bu sorunları ele almak için doğru soyutlamalara sahip olmadığı hissine kapılıyorum
Karşılaştırma için, Rust’ta bir fonksiyon imzasına bakıp iç kodu anlamadan değiştirilebilirliği ve lifetime’ları görebilmeyi seviyorum
Bağımlılıklar için de benzer bir şeye ihtiyaç var gibi
Geliştirici, alt düzey koda bakmak zorunda kalmadan tüm bağımlılıkları kolayca denetleyebilmeli ve “aa, bu bağımlılık
eval()kullanıyor” ya da “ağ erişimi var” diyebilmeliMobil uygulamalarda izinler zorunlu; geliştiriciler de yalnızca belirli işlevleri allowlist’e alabilmeli ve her şeyi toptan kabul etmek zorunda kalmamalı diye düşünüyorum
Genelleme yapmak istemem ama özellikle AI geliştirici topluluğu, diğer tüm kaygıların önüne kolaylığı koyuyor gibi
Örneğin projelerin ilk çalıştırmada büyük modelleri otomatik indirmesi neredeyse standart olmuş durumda
Genelde kapatılabiliyor ama birçok kütüphaneye yayılan kod sınıflarının derin katmanları yüzünden doğru parametreyi bulmak gerçekten çok acı verici
Karmaşık, çoğu zaman oyuncağa yakın şeylere başlamayı bu kadar kolaylaştırmak güzel, ama bu aşırı izin verici kültür epey rahatsız edici
İlk sorun çözme adımı hep “
pip install …” gibi geliyor; bazı ortamlarda, örneğin MacOS’ta, GPU erişimi sanallaştırması da pek iyi değilBu hafta Python sürüm yönetimi için uv kullanmanın iyi bir fikir olup olmadığını düşünüyordum
Web sitesinde [1] “Python resmî dağıtım için binary sağlamadığından uv, Astral python-build-standalone projesinin dağıtımlarını kullanır” yazıyor
Bu da şu GitHub reposuna işaret ediyor: https://github.com/astral-sh/python-build-standalone, orası da https://gregoryszorc.com/docs/python-build-standalone/main/r... bağlantısını veriyor
Doğru anladıysam, Python build için kaynak kodu doğrudan python.org’dan almıyorlar gibi; bunun ne kadar güvenli olduğundan emin değilim
asdf [2] için de aynı kaygım var ama asdf, pyenv [3] kullanıyor ve o taraf daha resmî hissettiriyor
Python kurulumunda uv ile asdf arasında hangisi daha iyi ve daha güvenli, bunu açıklayabilecek var mı?
[1] https://docs.astral.sh/uv/guides/install-python/
[2] https://github.com/asdf-community/asdf-python
[3] https://github.com/pyenv/pyenv/tree/master/plugins/python-bu...
Zaten başka nereden alacaktı ki?
[1]: https://github.com/astral-sh/python-build-standalone/blob/a2...
uvvecpythonkonusunda pek endişelenmiyorum. Süreç sağlam, müdahale hızlı ve artık ciddi finansmanları da varAsıl kaygı verici olan, örneğin
mdformatgibi yaygın kullanılan ama esasen bir kişinin boş zamanında bakımını yaptığı formatter’lar ya da yıllardır güncellenmemiş ve bağımlılık ağacında üç seviye aşağıda duran çok spesifik bağımlılıklarAktif geliştirilen bir uygulamada bütün güncellemeleri sabitleyip elle onaylamak istemezdim, ama ciddi bir uygulama için artık bu zorunluymuş gibi görünmeye başlıyor
Bu arada şifrelenmemiş
.envdosyalarından API anahtarı çıkarmaya devam edebilirim sanırımBüyük ölçekli tüketici web uygulamasında olursa utandırıcı ama anlaşılabilir; ama aynı host ve sistemde tesadüfen duran oyuncak bir demo reposunun dolaylı bağımlılığı yüzünden yüzlerce ya da binlerce dolar kaybetmek çok can yakıcı
Anahtarlar böyle çalınırsa OAI ya da Anthropic geri ödeme yapıyor mu bilen var mı? Yoksa bu tamamen kullanıcı hatası mı sayılıyor?
Python binary’lerini onların mı yoksa bir başkasının mı derlediğinin riski ne kadar değiştirdiğinden emin değilim
Son zamanlarda yaptığım
pip installişlemlerinin çoğu Claude Code önerisiyle oluyor; ben de sadece Enter’a basıyorumModel birkaç ay öncesinin verileriyle eğitildiği için bu hafta nelerin ele geçirildiğini bilmesi mümkün değil
“Bu paket şu anda güvenli mi?” sorusunu değerlendirmek için olabilecek en kötü filtreyi yaratmış oldum
Claude Code’un internetten kurulacak yazılımı önermesine izin verip sonra da aynen kurduğunu söylemiş oldun
Claude Code’un ya da herhangi bir LLM’in “bu paket şu anda güvenli mi” sorusunu cevaplayan bir filtre olduğunu öne süren birini hiç duymadım; söylediğin nedenle de bu çok kötü bir sezgisel yöntem gibi görünüyor
setup.pydosyasının benim makinemde ne çalıştıracağını bilemezÇünkü çalıştırmadan önce paketi gerçekten inceleyen bir şey yok
İhtiyaç duyulan şey, çalıştırmadan önce metadata’yı çekip hangi hook’ların olduğunu gösteren bir araç
Claude Code neredeyse her gün, bazen günde birkaç kez güncelleniyor
Bir gün Anthropic ele geçirilirse hepimiz çok kötü etkileniriz
Ama bugünlerde her şey YOLO
GitHub’da 20 Nisan’da gönderilmiş şu mesajı gördüm, biraz kafam karıştı
"deependujha hi @thebaptiste, thanks for inquiring. Release of 2.6.2 is blocked due to some internal reasons. Will notify once release is made."Eğer o zamandan beri sorunu biliyorlardı da şimdiye kadar uyarı vermedilerse, bu gerçekten hoşuma gitmezdi
Daha fazla bilen biri net bir açıklama yaparsa iyi olur
https://github.com/Lightning-AI/pytorch-lightning/issues/216...
Ondan önce etkilenmiş dağıtım yoktu ve sızıntıdan da haberimiz yoktu
GitHub’daki orijinal release’de sorun yoktu, ama kafa karışıklığını önlemek için onu da yayından kaldırdık