Olay raporu: CVE-2024-YIKES
(nesbitt.io)- CVE-2024-YIKES, JavaScript bağımlılığı ele geçirilmesinin Rust ve Python tedarik zincirine yayıldığı bir olaydır
left-justifykimlik avı ile.npmrc,.pypirc, Cargo ve Gem kimlik bilgileri sızdırıldıvulpine-lz4içindeki kötü amaçlıbuild.rs, CI ana makinelerinde bir shell betiği indirip çalıştırdısnekpack3.7.0 kötü amaçlı yazılımı yaklaşık 4,2 milyon cihaza yayıldı ve SSH anahtarı ile ters shell ekledi- cryptobro-9000 kurdu, tesadüfen
snekpacki 3.7.1'e yükselterek kötü amaçlı yazılımı kaldırdı
Olay özeti
- CVE-2024-YIKES, JavaScript ekosistemindeki ele geçirilmiş bir bağımlılığın kimlik bilgisi hırsızlığına yol açtığı, bunun da Rust sıkıştırma kütüphanesi tedarik zinciri saldırısına ve Python derleme aracı üzerinden kötü amaçlı yazılım dağıtımına dönüştüğü bir güvenlik olayıdır
- Olay 03:47 UTC'de kayda geçti; durum “tesadüfen çözüldü” olarak, ciddiyet seviyesi ise “Critical → Catastrophic → Somehow Fine” olarak değiştirildi
- Süre 73 saat olarak kaydedildi ve etkilenen sistemler alanı “Yes” olarak kaldı
- Ele geçirilen paketler ve araç zinciri
left-justify,vulpine-lz4vesnekpackboyunca ilerledi ve yaklaşık 4 milyon geliştiriciye kötü amaçlı yazılım dağıtıldı - Sonunda ayrı bir kripto para madenciliği kurdu olan
cryptobro-9000, enfekte makinelerde güncelleme çalıştırırkensnekpacki normal sürüme yükseltti ve kötü amaçlı yazılım tesadüfen kaldırıldı
Olayın gelişimi
-
1. gün: JavaScript paketinden kimlik bilgisi hırsızlığı başladı
- 03:14 UTC'de
left-justifybakımcısı Marcus Chen, Twitter'da ulaşım kartının, eski dizüstü bilgisayarının ve “Kubernetes'in kusmuş gibi görünen önemli bir şeyin” çalındığını yazdı, ancak bu hemen paket güvenliği sorununa bağlanmadı - 09:22 UTC'de Chen, nmp kayıt sistemine giriş yapmaya çalışırken donanım 2FA anahtarının kayıp olduğunu fark etti; Google arama sonuçlarının en üstündeki AI Overview onu 6 saat önce kaydedilmiş kimlik avı sitesi
yubikey-official-store.nete yönlendirdi - 09:31 UTC'de Chen bu kimlik avı sitesine nmp kimlik bilgilerini girdi; site satın alma için teşekkür etti ve 3-5 iş günü içinde teslimat vaat etti
- 11:00 UTC'de
[email protected], “performance improvements” değişiklik notuyla yayımlandı - Bu paket kurulum sonrası çalışan bir betik içeriyordu ve
.npmrc,.pypirc,~/.cargo/credentials,~/.gem/credentialsdosyalarını saldırganın seçtiği sunucuya sızdırıyordu - 13:15 UTC'de
left-justifyiçin “why is your SDK exfiltrating my .npmrc” başlıklı bir destek bileti açıldı, ancak “low priority - user environment issue” olarak işaretlenip 14 gün etkinlik olmayınca otomatik kapatıldı
- 03:14 UTC'de
-
1. gün: Rust kütüphanesine tedarik zinciri saldırısının sıçraması
- Sızdırılan kimlik bilgileri arasında Rust kütüphanesi
vulpine-lz4bakımcısının bilgileri de vardı vulpine-lz4, “blazingly fast Firefox-themed LZ4 decompression” için bir kütüphane olup GitHub'da 12 yıldıza sahipti, ancakcargonun kendisinin geçişli bağımlılığıydı- 22:00 UTC'de
vulpine-lz40.4.1 yayımlandı ve commit mesajı “fix: resolve edge case in streaming decompression” oldu - Gerçek değişiklik, ana makine adında “build”, “ci”, “action”, “jenkins”, “travis” veya “karen” geçerse bir shell betiği indirip çalıştıran
build.rsbetiğinin eklenmesiydi
- Sızdırılan kimlik bilgileri arasında Rust kütüphanesi
-
2. gün: Tespit ve müdahale başarısız oldu
- 08:15 UTC'de güvenlik araştırmacısı Karen Oyelaran, payload kendi kişisel dizüstü bilgisayarında çalıştıktan sonra kötü amaçlı commit'i fark etti
- Karen Oyelaran, “your build script downloads and runs a shell script from the internet?” başlıklı bir issue açtı ama yanıt alamadı
- Meşru bakımcı bu sırada EuroMillions'ta €2.3 million kazanmış ve Portekiz'de keçi çiftliği araştırıyordu
- 10:00 UTC'de Fortune 500 listesindeki bir
snekpackmüşterisinin VP of Engineering'i olayı “Is YOUR Company Affected by left-justify?” başlıklı bir LinkedIn gönderisinden öğrendi; neden kendisinin daha önce dahil edilmediğini öğrenmek istedi ama aslında daha önce zaten dahil edilmişti - 10:47 UTC'de
#incident-responseSlack kanalı kısa süreliğine “compromised” kelimesinin Amerikan yazımındazkullanılıp kullanılmaması üzerine 45 mesajlık bir tartışmaya dönüştü
-
2. gün: Python derleme aracı
snekpackenfekte oldu- 12:33 UTC'de shell betiği,
snekpackin CI hattını belirli bir kurban olarak hedefledi snekpack, adında “data” geçen PyPI paketlerinin %60'ı tarafından kullanılan bir Python derleme aracıdırsnekpack, “Rust is memory safe” gerekçesiylevulpine-lz4yi vendor olarak içeri almıştı- 18:00 UTC'de
snekpack3.7.0 yayımlandı ve kötü amaçlı yazılım dünya çapındaki geliştirici makinelerine kurulmaya başladı - Kötü amaçlı yazılım
~/.ssh/authorized_keysiçine bir SSH anahtarı ekliyor, yalnızca salı günleri etkinleşen bir ters shell kuruyor ve kullanıcının varsayılan shell'inifisholarak değiştiriyordu - Varsayılan shell'in
fishe çevrilmesi bir bug olarak değerlendirildi - 19:45 UTC'de başka bir güvenlik araştırmacısı, “I found a supply chain attack and reported it to all the wrong people” başlıklı 14.000 kelimelik bir blog yazısı yayımladı; içinde “in this economy?” ifadesi 7 kez geçiyordu
- 12:33 UTC'de shell betiği,
-
3. gün: Tesadüfi yama ve olayın kapanışı
- 01:17 UTC'de Auckland'daki bir junior geliştirici, başka bir sorunu debug ederken kötü amaçlı yazılımı fark etti ve
snekpackiçindeki vendor edilmişvulpine-lz4yi geri alan bir PR açtı - Bu PR için 2 onay gerekiyordu, ancak iki onaylayıcı da uyuyordu
- 02:00 UTC'de
left-justifybakımcısıyubikey-official-store.netten YubiKey'ini teslim aldı; gelen şey, içinde “lol” yazan bir README bulunan 4 dolarlık bir USB sürücüydü - 06:12 UTC'de ayrı bir kripto para madenciliği kurdu olan
cryptobro-9000,jsonify-extremeaçığı üzerinden yayılmaya başladı jsonify-extreme, “makes JSON even more JSON, now with nested comment support” paketi olarak tanımlanıyorducryptobro-9000payload'ının kendisi sıradışı değildi, ancak gelecekteki saldırı yüzeyini artırmak için enfekte makinelerdenpm updatevepip install --upgradeçalıştırmayı içeren bir yayılma yöntemi kullanıyordu- 06:14 UTC'de
cryptobro-9000,snekpacki tesadüfen 3.7.1'e yükseltti snekpack3.7.1, kafası karışık bir yardımcı bakımcı tarafından yayımlanan meşru bir sürümdü ve vendor edilmişvulpine-lz4yi önceki sürüme geri aldı- 06:15 UTC'de salı gününe özel ters shell etkinleşti, ancak komuta-kontrol sunucusu
cryptobro-9000tarafından ele geçirildiğinden yanıt veremedi - 09:00 UTC'de
snekpackbakımcıları 4 cümlelik bir güvenlik duyurusu yayımladı; içinde “out of an abundance of caution” ve “no evidence of active exploitation” ifadeleri yer aldı - “no evidence of active exploitation” ifadesi, kanıt aranmamış olduğu için teknik olarak doğru kabul edildi
- 11:30 UTC'de bir geliştirici “I updated all my dependencies and now my terminal is in fish???” diye tweet attı ve 47.000 beğeni aldı
- 14:00 UTC'de
vulpine-lz4için ele geçirilmiş kimlik bilgileri değiştirildi - Meşru bakımcı, yeni keçi çiftliğinde e-postayı görünce “2 yıldır o depoya dokunmadım” ve “Cargo'da 2FA'nın isteğe bağlı olduğunu sanıyordum” diye yanıt verdi
- 15:22 UTC'de olayın çözüldüğü ilan edildi; retrospektif toplantısı planlandı ve sonra üç kez ertelendi
- 01:17 UTC'de Auckland'daki bir junior geliştirici, başka bir sorunu debug ederken kötü amaçlı yazılımı fark etti ve
CVE ataması ve hasarın boyutu
- 6. haftada CVE-2024-YIKES resmen atandı
- Duyuru, MITRE ile GitHub Security Advisories'nin CWE sınıflandırması üzerine tartışması sırasında embargo altında kaldı
- CVE yayımlanana kadar olay zaten 3 Medium yazısında ve bir DEF CON sunumunda ayrıntılı biçimde ele alınmıştı
- Toplam hasar bilinmiyor olarak kaldı
- Ele geçirilen makine sayısı 4,2 milyon olarak tahmin edildi
- Kripto para kurdunun kurtardığı makine sayısı da 4,2 milyon olarak tahmin edildi
- Net güvenlik duruşu değişimi “rahatsızlık” olarak kaldı
Kök neden ve katkıda bulunan etkenler
-
Kök neden
- Kubernetes adlı köpeğin YubiKey'i yemesi kök neden olarak kabul edildi
-
Katkıda bulunan etkenler
- nmp kayıt sistemi, haftalık indirme sayısı 10 milyonun altında olan paketlerde hâlâ sadece parola ile kimlik doğrulamaya izin veriyor
- Google AI Overviews, var olmaması gereken URL'lere büyük bir güvenle bağlantı veriyor
- Rust ekosistemindeki “küçük crate” felsefesinin npm ekosisteminde taklit edilmesi, GitHub'da 3 yıldızı olan
is-even-number-rsgibi paketlerin kritik altyapının dört seviye derinliğinde geçişli bağımlılığına girebilmesine yol açıyor - Python derleme araçları, “performans” gerekçesiyle Rust kütüphanelerini vendor edip sonra güncellemiyor
- Dependabot, CI geçtikten sonra PR'ları otomatik birleştirdi; CI ise kötü amaçlı yazılım
volkswagenkurduğu için geçti - Kripto para kurdu, çoğu startup'tan daha iyi CI/CD hijyenine sahip
- Tek bir sorumlu yok, ancak söz konusu Dependabot PR'ını o cuma son iş günü olan bir sözleşmeli çalışan onayladı
- Olay günü salıydı
İyileştirme adımları ve geriye kalan seçenekler
- Artifact imzalama uygulaması, 2022'nin 3. çeyreğindeki olaydan kalan bir aksiyon maddesi olmasına rağmen hâlâ backlog'da
- Zorunlu 2FA uygulaması zaten istenmişti ama işe yaramadı
- Geçişli bağımlılık denetimi hedef sayısı 847 olduğu için üstü çizilerek iptal edildi
- Tüm bağımlılık sürümlerini sabitlemek güvenlik yamalarının alınmasını engelliyor
- Bağımlılık sürümlerini sabitlememek ise tedarik zinciri saldırılarını mümkün kılıyor
- Rust ile yeniden yazma seçeneği
vulpine-lz4yi işaret ederek üstü çizildi - Geriye kalan seçenekler, iyi niyetli bir kurt beklemek ya da keçi çiftçiliğine geçmeyi düşünmek oldu
Müşteri etkisi ve kurumsal yanıt
- Bazı müşteriler “optimal olmayan güvenlik sonuçları” yaşamış olabilir
- Etkilenen paydaşlara durumsal görünürlük sağlamak için proaktif iletişim kuruldu
- Müşteri güveni “north star” olarak korunuyor
- Güvenlik duruşunu gözden geçirmek için çapraz fonksiyonlu bir çalışma grubu oluşturuldu, ancak henüz toplanmadı
- Hukuk incelemesinin ardından,
fishshell'inin kötü amaçlı yazılım olmadığı, sadece bazen öyle hissettirdiği ifadesi eklendi - Bu olay raporu, ilgili çeyrekteki üçüncü olay raporu oldu
- Güvenlik ekibinin personel talebi 2023'ün 1. çeyreğinden beri backlog'da bekliyor
Teşekkürler
- Karen Oyelaran, ana makine adı regex ile eşleştiği için sorunu fark etti
- Auckland'daki junior geliştiricinin açtığı PR, olay zaten çözüldükten 4 saat sonra onaylandı
- Bazı güvenlik araştırmacıları sorunu daha önce buldu ama yanlış kişilere bildirdi
cryptobro-9000yazarı adının açıklanmasını istemedi, ancak SoundCloud hesabının anılmasını rica etti- Kubernetes adlı köpek yorum yapmayı reddetti
- Güvenlik ekibi, her şeye rağmen bu raporun SLA'sini karşıladı
1 yorum
Hacker News yorumları
Kafası karışanlar için söyleyeyim, bu yazı tedarik zinciri olayı hakkında yazılmış, oldukça iyi bir kurgu
Üstünkörü bakınca gerçek sandım, epey endişelenip daha dikkatli okumaya başladım :)
nmpAlıntıdaki “GitHub’da 12 yıldızlı vulpine-lz4’ün cargo’nun kendi transitif bağımlılığı olması” kısmını merak edip, cargo derlemesine sızabilecek ve zaten daha az dikkat çeken bir
build.rsdosyası bulunan bazı crate’leri kabaca çıkardım:flate2,tar,curl-sys,libgit2-sys,openssl-sys,libsqlite3-sys,blake3,libz-sys,zstd-sys,ccBonus olarak,
xz2ele geçirilirse rustup da kirletilebilirYine de en azından
Cargo.locktakip ediliyor-syscrate’leri sadece binding olmalı; orada başka işler dönüyorsa oldukça şüpheli görünürDiğerlerinin de
alexcrichtongibi Rust bakımcılarına ya da doğrudanrustlange ait olduğunu sanıyorumAlaycı olmak kolay, çünkü sorun ve çözüm geriye dönüp bakınca fazla bariz görünüyor
Ama uzun süre, belki hâlâ da, hacker kültürünün mantrası move fast and break things oldu
npmgibi tedarik zinciri sistemlerinin bariz sorunlarını düzeltmeye yönelik ivmenin büyümesi iyi, ama büyük ölçüde ajan tabanlı geliştirmenin tetiklediği yeni güvenlik problemleri çağına giriyor olmamız beni endişelendiriyorSadece Mythos/Glasswing’in dokunduğu neredeyse her şeyde açık bulunmasından söz etmiyorum; yazılım üretme, bağımlılık çekme ve karmaşık sistemlere dair insani zihinsel modellerimizi kaybetme biçimimiz, insanların gerçekten anlamadığı yama işi yazılım ve altyapıdan bolca üretmemize yol açacak gibi geliyor
Umarım birkaç yıl sonra bugüne dönüp, nasıl bu kadar saf olabildiğimize ve karmaşık sistemleri AI ile yeniden kurmaya çalışmak gibi yöntemlerle sorunu çözmeden yapay zeka geliştirmenin uzun kuyruğuna neden yeterince hazırlanmadığımıza hayıflanmayız
Yine de yazı komikti
Bir Fish hayranı olarak, şu ifade hem hedef alınmış hem de anlaşılmış hissettirdi: “fish shell’in kötü amaçlı yazılım olmadığını, sadece bazen öyle hissettirdiğini netleştirelim”
Shell’den bağımsız olarak, “güvenlik ekibine ek kadro talebi 2023’ün 1. çeyreğinden beri backlog’daydı” kısmı da fazlasıyla tanıdık geldi
apt-getya dadnfilefigletkurup,/etc/motdiçeriğini dev ASCII art fontuyla yazılmış all your base are belong to us ifadesiyle değiştirebilirsinizleft-justify bakımcısının
yubikey-official-store.net’ten bir YubiKey aldığı ve içindenREADMEdosyasında “lol” yazan 4 dolarlık bir USB sürücü çıktığı kısımda gerçekten kahkaha attımTam bir trolleme
Oltalama sitesinden gelen USB cihazını takmanın başlı başına başka bir saldırı vektörü olması hoşuma gitti
Gerçek bir SCP değil ama son zamanlarda okuduklarım arasında en SCP hissi veren şey buydu
Karen kısmında bayağı güldüm :D ;)
Bir zamanlar sınıf arkadaşımın projesini gözden geçirirken elime geçen
maketabanlı build script’i hatırlattı; hostname içindebpavukgeçiyorsa benim home klasörümderm -rfçalıştırmaya kalkıyorduHem de bu ortaokul birinci sınıftayken olmuştu!!
Tedarik zinciri olayları gerçekten baş belası ve bu konuda daha iyi olmamız gerekiyor
Şahsen Rust tarafında vakfın bazı çekirdek crate’leri destekleyip bunların Rust dilinin kendisiyle aynı denetim süreçlerinden geçmesini ve projelere tedarik zinciri zafiyetlerini azaltacak finansman sağlamasını destekliyorum
Cevabın
cratesya danpmgibi sistemleri ortadan kaldırmak olduğunu düşünmüyorum.cratesvenpm, birçok geliştirici için çok faydalıcratestarafındarustsecentegrasyonu için zaten çaba var, ama bunun yanında topluluğun çok sayıda küçük bağımlılık yerinetokiogibi daha az sayıda büyük bağımlılığa yönelmesini de isterimcrates.ioüzerindeki en popüler crate’lerin önemli bir kısmı zaten Rust organizasyonunun sağladığı birinci taraf crate’lerRust crate grafiğiyle ilgili endişelerde bu nokta sık sık gözden kaçıyor
crates.ioana sayfasındaki indirme sayısına göre ilk 10’a bakarsanız, Rust organizasyonu ya da çekirdek Rust bakımcıları tarafından yapılmamış tek cratebase64crate’inpmhemnmpgerekli mi“Resmî bakımcı EuroMillions’da 2,3 milyon euro kazandı ve şu sıralar Portekiz’de keçi yetiştiriciliğini araştırıyor” ve “kök neden: Kubernets adlı köpek YubiKey’i yedi” denmesi
Ah evet, klasik ve iyi bilinen bir saldırıya yakalanmışlar; ne sorumsuzluk
Hani şu “birini piyango ikramiyesiyle dikkatini dağıtıp başka birinin evcil hayvanına dongle’ı karşı konulmaz derecede lezzetli göstermek” tekniği var ya
İnsanlar ne zaman öğrenecek
npmya dapipkullanmayıp önerilen yöntem olancurl ... | bashile yetindiğim için mutluyumcurl | sudo basholacaktıAcemilik etmişsin