1 puan yazan GN⁺ 2 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • CVE-2024-YIKES, JavaScript bağımlılığı ele geçirilmesinin Rust ve Python tedarik zincirine yayıldığı bir olaydır
  • left-justify kimlik avı ile .npmrc, .pypirc, Cargo ve Gem kimlik bilgileri sızdırıldı
  • vulpine-lz4 içindeki kötü amaçlı build.rs, CI ana makinelerinde bir shell betiği indirip çalıştırdı
  • snekpack 3.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-lz4 ve snekpack boyunca 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ırken snekpacki 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-justify bakı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/credentials dosyalarını saldırganın seçtiği sunucuya sızdırıyordu
    • 13:15 UTC'de left-justify iç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ı
  • 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-lz4 bakı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, ancak cargonun kendisinin geçişli bağımlılığıydı
    • 22:00 UTC'de vulpine-lz4 0.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.rs betiğinin eklenmesiydi
  • 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 snekpack müş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-response Slack kanalı kısa süreliğine “compromised” kelimesinin Amerikan yazımında z kullanılıp kullanılmaması üzerine 45 mesajlık bir tartışmaya dönüştü
  • 2. gün: Python derleme aracı snekpack enfekte 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ır
    • snekpack, “Rust is memory safe” gerekçesiyle vulpine-lz4yi vendor olarak içeri almıştı
    • 18:00 UTC'de snekpack 3.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_keys içine bir SSH anahtarı ekliyor, yalnızca salı günleri etkinleşen bir ters shell kuruyor ve kullanıcının varsayılan shell'ini fish olarak 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
  • 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 snekpack iç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-justify bakı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-extreme açığı üzerinden yayılmaya başladı
    • jsonify-extreme, “makes JSON even more JSON, now with nested comment support” paketi olarak tanımlanıyordu
    • cryptobro-9000 payload'ının kendisi sıradışı değildi, ancak gelecekteki saldırı yüzeyini artırmak için enfekte makinelerde npm update ve pip 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
    • snekpack 3.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-9000 tarafından ele geçirildiğinden yanıt veremedi
    • 09:00 UTC'de snekpack bakı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-lz4 iç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

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-rs gibi 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 volkswagen kurduğ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, fish shell'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-9000 yazarı 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

 
GN⁺ 2 시간 전
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 :)

    • left-justify kısmında tamamen koptum :)
    • Başta dürüst olmak gerekirse ayırt edemedim ve his şu şekildeydi: https://github.com/bitcoin/bips/blob/master/bip-0042.mediawi...
    • CVE-2024-YIKES diye aratırsanız, bu yazının içeriğini yapay zekayla yeniden yazıp tamamen ciddiymiş gibi sunan AI çöp bloglardan oluşan bir galeri de çıkıyor
    • nmp
  • Alı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.rs dosyası bulunan bazı crate’leri kabaca çıkardım: flate2, tar, curl-sys, libgit2-sys, openssl-sys, libsqlite3-sys, blake3, libz-sys, zstd-sys, cc
    Bonus olarak, xz2 ele geçirilirse rustup da kirletilebilir
    Yine de en azından Cargo.lock takip ediliyor

    • -sys crate’leri sadece binding olmalı; orada başka işler dönüyorsa oldukça şüpheli görünür
      Diğerlerinin de alexcrichton gibi Rust bakımcılarına ya da doğrudan rustlange ait olduğunu sanıyorum
  • Alaycı 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
    npm gibi 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şelendiriyor
    Sadece 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

    • Bu gerçekten çok uzun süredir mantra mıydı? O korkunç sözü Zuckerberg’in uydurduğunu sanıyordum
  • 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

    • Alternatif olarak apt-get ya da dnf ile figlet kurup, /etc/motd içeriğini dev ASCII art fontuyla yazılmış all your base are belong to us ifadesiyle değiştirebilirsiniz
  • left-justify bakımcısının yubikey-official-store.net’ten bir YubiKey aldığı ve içinden README dosyasında “lol” yazan 4 dolarlık bir USB sürücü çıktığı kısımda gerçekten kahkaha attım
    Tam bir trolleme

    • Evet, gerçekten çok iyiydi
      Oltalama sitesinden gelen USB cihazını takmanın başlı başına başka bir saldırı vektörü olması hoşuma gitti
    • İnsanların oltalama sitelerinden aldığı şeylere kıyasla çok daha fazlasını almış. Çalışan bir USB sürücü sonuçta!
  • Gerçek bir SCP değil ama son zamanlarda okuduklarım arasında en SCP hissi veren şey buydu

    • Ah tabii, son derece nadir bir Supply Chain Problem (SCP) vakası
  • 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 make tabanlı build script’i hatırlattı; hostname içinde bpavuk geçiyorsa benim home klasörümde rm -rf çalıştırmaya kalkıyordu
    Hem 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 crates ya da npm gibi sistemleri ortadan kaldırmak olduğunu düşünmüyorum. crates ve npm, birçok geliştirici için çok faydalı

    • crates tarafında rustsec entegrasyonu için zaten çaba var, ama bunun yanında topluluğun çok sayıda küçük bağımlılık yerine tokio gibi daha az sayıda büyük bağımlılığa yönelmesini de isterim
    • crates.io üzerindeki en popüler crate’lerin önemli bir kısmı zaten Rust organizasyonunun sağladığı birinci taraf crate’ler
      Rust crate grafiğiyle ilgili endişelerde bu nokta sık sık gözden kaçıyor
      crates.io ana 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 crate base64 crate’i
    • Değerli crate’leri standart kütüphaneye taşımak daha mantıklı olmaz mı?
    • Ama gerçekten hem npm hem nmp gerekli mi
    • Dürüst olmak gerekirse blessed.rs’in nihai hedefinin bu olduğunu sanıyordum
  • “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

  • npm ya da pip kullanmayıp önerilen yöntem olan curl ... | bash ile yetindiğim için mutluyum

    • O curl | sudo bash olacaktı
      Acemilik etmişsin