Ektoplazma npm Kurulumu Hooks AWS Kimlik Bilgilerini Çalan

Ektoplazma: npm kurulumu hooks AWS kimlik bilgilerini yalnızca kapsayıcıya özgü bir tetikleyici aracılığıyla toplayan

TL; DR

Bir küme beş npm paketiİki hesap üzerinden yayınlanan, gönderilen bir postinstall Sunucudan bulut kimlik bilgilerini okuyan ve bunları sunucu dışına gönderen bir kanca. Paketler hayalet ve korsan isimler taşıyor. coral-wraith, ecto-corsair-whisper-6f3b9, ecto-corsair-flag-x9m4, ecto-rust-read-f3a9c1, ecto-nightly-spirit — ve topladıkları her şeyi sahte bir şeye dönüştürüyorlar. ecto_module: YAML manifestini iletmeden önce inceliyoruz. Küme takibini şu şekilde yapıyoruz: Ektoplazma.

Bu zararlı yazılım yalnızca belirli bir ortamı algıladığında çalışır: adı "a" olan bir ana bilgisayar. 12 karakterli onaltılık dize ve altında bir çalışma dizini /app/node_modules — kapsayıcılaştırılmış bir derleme veya CI çalışanının şekli. Bu engel aşıldığında, kanca sorguyu çalıştırır. AWS örnek meta veri hizmeti (IMDSv2) IAM rol kimlik bilgileri için listeler AWS Sırları Yöneticisi üç bölge genelinde ortam değişkenlerini kaydeder, dosyaları okur. /appve "ele geçirme" (capture-the-flag) dizelerini tarar. Ardından sonucu iki şekilde dışarı sızdırır: bir işaretçi aracılığıyla bir webhook.site Bir veri toplayıcı ve yerel sunucu öncelikli yedekleme seçeneklerinin listesini içeren, ham IP adresine sahip bir uç noktaya PUT isteği gönderen bir manifest dosyası.

Daha sonraki paket açıklamalarında "Verdaccio tedarik zinciri testi için CTF yükü" ifadesi yer almaktadır. Bu öz-açıklamayı gözlemlenebilir bir gerçek olarak rapor ediyoruz. Davranışın kendisi - halka açık bir IP adresine canlı çıkış, gerçek IMDS kimlik bilgisi okumaları, gerçek Secrets Manager çağrıları - etiketten bağımsız olarak aynıdır ve bu sürümlerin kötü amaçlı olarak sınıflandırılmasının nedenidir.

Kümedeki isimlerden biri, coral-wraithTek bir sürümle yetinmedi. Saatler içinde onlarca farklı sürümü art arda yeniden yayınladı. 1.0.0 tırmanmak 6.0.0 — ve aynı isimle yapılan önceki bir baskıda şişirilmiş bir içerik kullanılmıştı. 9999.0.x sürüm numaraları, klasik şekli bağımlılık-karışıklık girişimiBu süreçte, veri yükü gözle görülür şekilde olgunlaştı: tek seferlik bir sunucu numaralandırma sinyalinden, hedeflenen alanın dışında sessiz kalmasını sağlayan ortam kontrolleriyle sarmalanmış tam bir AWS kimlik bilgisi yönlendirme mekanizmasına dönüştü.

Paketler 5 isim; coral-wraith tek başına onlarca farklı versiyonda yeniden yayınlandı
Ekosistem npm
Vektörü yükle postinstall yaşam döngüsü betiği
Öncelikli hedef AWS IAM rol kimlik bilgileri + Secrets Manager gizli değerleri, ortam değişkenleri, /app Dosyaları
exfil webhook.site işaretçi + ham IP C2 PUT
Tetikleme kapısı 12-hex ana bilgisayar adı + /app/node_modules cwd'ye ek olarak, bu bağlamın dışında zararlı yazılımı bastıran bir ortam kontrolü de içeriyor.
Şiddet yüksek — bulut kimlik bilgilerinin ve yönetilen gizli bilgilerin ifşa edilmesi kapsayıcılaştırılmış derleme ve çalışma zamanı ortamları

Saldırı anatomisi

Kümedeki her paket aynı şekilde oluşturulur: neredeyse boş bir şekilde. index.js (modül.dışa aktaranlar = {}), tek satırlık paket.json senaryo - “postinstall”: “node postinstall.js” — ve içindeki yük postinstall.jsPaketi yüklemek, kancayı çalıştırmak için yeterlidir; herhangi bir içe aktarma veya çağırma işlemi gerekmez.

Hedefleme kapısı. Herhangi bir işlem yapmadan önce, ektoplazma ailesine ait yük, çevresini kontrol eder:

function isAppWorker():   host = os.hostname()   if host does NOT match /^[0-9a-f]{12}$/  -> exit   if cwd does NOT contain "/app/node_modules" -> exit   if cwd contains "/tmp/npm-safe"            -> exit   otherwise -> proceed

12 onaltılık basamaklı bir ana bilgisayar adı, Docker'ın bir kapsayıcıya atadığı varsayılan biçimdir ve /app/node_modülleri Bu, geleneksel bir konteyner içi kurulum yoludur. Üçüncü madde, yolun sanal ortamda çalışan bir çıkarma dizinine benzemesi durumunda işlemi durdurur. Sonuç olarak, yük geliştirici dizüstü bilgisayarında veya analiz sanal ortamında pasif kalır ve yalnızca konteynerleştirilmiş bir derleme veya çalışma zamanı çalışanı içinde etkinleşir; bu da canlı bulut kimlik bilgilerini taşıma olasılığı en yüksek olan ortam türüdür. Kümedeki en eski paket, mercan hayaletiBöyle bir kapısı yoktur ve (daha basit) toplama işlemini koşulsuz olarak yürütür.

KoleksiyonKapıdan geçildiğinde, kanca dışarı doğru fırlar. execFileSync(“/bin/sh”, [“-c”, …]) ve aşağıdaki adımları sırasıyla izleyen tek bir bileşik komut çalıştırır:

1. PUT /latest/api/token to 169.254.169.254          (IMDSv2 token request) 2. GET .../iam/security-credentials/                  (IAM role name) 3. GET .../iam/security-credentials/<role>            (temporary credentials) 4. dump env | sort                                    (environment variables) 5. list /app (excl. node_modules) + cat first 15      (application files) 6. aws secretsmanager list-secrets                    (us-east-1, eu-west-1, eu-central-1) 7. scrape readable files for HTB{...}                 (capture-the-flag strings)

1-3. adımlar, tipik bir IMDSv2 veri alma işlemidir: bir oturum belirteci isteyin, ardından bunu ekleyin. X-aws-ec2-metadata-token Örneklemeye ait IAM rolünü ve bu rolün geçici erişim anahtarlarını çekmek için başlık kullanılır. Daha basit ve kimlik doğrulaması gerektirmeyen IMDSv1 yerine IMDSv2'nin uygulanması tercih edilmiştir. GET Şunu belirtmekte fayda var: Bu, yükün, AWS tarafından önerilen güvenlik güçlendirme yöntemi olan belirteç tabanlı meta veri erişimi gerektirecek şekilde yapılandırılmış örneklerde bile çalıştığı anlamına gelir. 3. adımda döndürülen kimlik bilgileri kısa ömürlüdür. Erişim Anahtarı Kimliği/Gizli Erişim Anahtarı/Simge Üçlü anahtarlar, örneğin rolüne göre sınırlandırılmıştır; bu rolün yapabildiği her şeyi, bu anahtarların sahibi kimlik bilgisinin geçerlilik süresi boyunca yapabilir.

4-6. adımlar, alımı genişletir. env `dump` komutu, derleme veya çalışma zamanı sürecinin devraldığı her şeyi yakalar; pratikte kayıt defteri belirteçleri, veritabanı bağlantı dizeleri ve API anahtarları en sık burada bulunur. / uygulama File Walk, on beş adede kadar uygulama dosyasını dışarıdan okuyabilir. düğüm_modülleriBu, yüzey yapılandırması olabilir, .env Dosyalar veya kaynak. 6. Adım çağrıları aws secretsmanager list-secrets Üç bölgede; 1-3. adımlarda alınan kimlik bilgileri, bu çağrıları doğrulayan şeydir, bu nedenle IMDS okuması ve Gizli Bilgiler Yöneticisi numaralandırması tek bir yükseltme zinciri oluşturur: örnek rolü → yönetilen gizli bilgi envanteri. 7. adım, bayrağı ele geçirme çerçevesine bir göndermedir — bir HTB{…} Eğer bayrak bulunursa, tek başına gönderilir; aksi takdirde toplanan ham veri dört parçaya bölünerek gönderilir.

Kümenin sonraki sürümleri, bu aşamayı daha da ileriye taşıyor. Envanterde durmak yerine, IMDS yanıtını ayrıştırıyor ve geçici anahtarları dışa aktarıyorlar. AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN Çevresel değişkenlerle kimliği doğrulayın. aws sts get-caler-kimliğive ardından döndürülen her gizli bilgiyi tek tek kontrol edin. liste-sırları çağrı aws secretsmanager get-secret-value Her birinde — sadece isimlerini değil, gizli içeriklerini de alıyor. Aynı sürümler ayrıca işlemle değiştirilmiş bayrak ikili dosyalarını da okuyor (/okuma bayrağı ve arkadaşlar) ve bir deneme şarj çalışması Rust projelerinin herhangi birine karşı / uygulamaBu sayede, elde edilen veriler bulut kimlik bilgilerinin ötesine, derleme ortamının sunduğu her şeye kadar genişletiliyor.

Bu daha sonraki sürümler ayrıca kendilerini daha agresif bir şekilde kısıtlıyor. 12-hex-hostname'e ek olarak ve /app/node_modülleri Kontroller sırasında, zararlı yazılım etkin paket kayıt defteri yapılandırmasını ve çalışma dizini yolunu inceler ve canlı bir hedef yerine analiz veya yansıtma bağlamını gösterdiklerinde sessizce çıkar. Bunun birleşik etkisi, çoğu inceleme ortamında gözlemlenebilir hiçbir şey yapmayan ve yalnızca kendisini gerçek bir kapsayıcılaştırılmış sunucuda olduğuna karar verdiği yerlerde tam veri toplama işlemini gerçekleştiren bir zararlı yazılımdır.

dumpingToplanan veriler, ana cihazdan iki kanal üzerinden dışarı çıkar. Birincisi, bir işaret sinyali. POST sabit webhook.site İlk olarak, veri toplayıcı, ana bilgisayar adını, sayısal UID'yi, çalışma dizinini ve 120 KB'a kadar toplanan veriyi taşır. İkinci olarak, veriler sahte bir YAML "modül bildirimi"ne katlanır ve PUT için /api/modüller/ Hedef sunucuda:

ecto_module:   name: "<flag-or-chunk-0>"   version: "1.0.0"   power_level: "<chunk-1>"   ship_deck: "<chunk-2>"   cargo_hold: "<chunk-3>"

Bildirim dosyasındaki alan adları (güç_seviyesi, gemi güvertesi, kargo_tutu(Bunlar sadece birer süsleme; çalınan veriler dize değerlerinin içinde yer alıyor, bu yüzden bir ağ izleyici, bariz bir veri dökümü yerine zararsız bir paket kayıt defteri bildirimi yüklemesi gibi görünen bir şey görüyor.) İşaret kanalı daha fazlasını taşıyor: POST vücut webhook.site Ana bilgisayar adını, sayısal UID'yi, çalışma dizinini ve toplanan 120 KB'a kadar veriyi içerir; bu nedenle tek bir başarılı sinyal bile tüm verileri sağlar. webhook.site Ücretsiz bir istek inceleme hizmetidir; bunu bir toplayıcı olarak kullanmak, operatörün o kanal için kendi alım altyapısını kurmasına gerek kalmaması anlamına gelir ve kaydedilen istekler hizmetin arşivinde kalır.

Manifesto PUT Birkaç maddeyle başlayan bir yedek listeyi inceliyor. 127.0.0.1/localhost limanlara bağlanıyor ve ardından üç kamu adresine ulaşıyor.154.57.164.0/24` 2xx durum koduyla yanıt veren ilk uç noktada duran bir aralık. Yerel sunucu öncelikli sıralama, "verdaccio testi" kendi açıklamasıyla (yerel döngüde yerel bir kayıt defteri) tutarlıdır, ancak genel IP yedeklemeleri, yerel döngü dinleme yapmadığında verilerin sunucudan ayrıldığı anlamına gelir; yani, yazarın kendi test düzeneği olmayan herhangi bir makinede.

Tarihçesi

Bu küme, tek seferlik bir düşüşten ziyade kademeli bir yetenek artışını göstermektedir. Sıralamayı yayınlanma zamanına göre değil, gözlemlenen davranışa göre yapıyoruz:

Aşama Paketler / Sürümler Davranış
Erken koşu coral-wraith 9999.0.x Bağımlılık karışıklığı yaratma girişimine işaret eden şişirilmiş sürüm numaraları; kurulum sırasında numaralandırma ve veri sızdırma.
Tohum coral-wraith 1.0.0 postinstall işlemi kimlik/ortam/bayrak dosyalarını toplar; tek bir PUT işlemiyle 154[.]57[.]164[.]71:30782işaretleyici ECT-472839
Hızlı yineleme coral-wraith 1.0.1 → 6.0.0 Saatler içinde düzinelerce salınım; yük kapasitesi artıyor isAppWorker() gate, IMDSv2 kimlik bilgisi çekme, tam get-secret-value pivot, kayıt defteri/yol ortamı kontrolü ve çift havuz işaretleyicileri
Paralel isimler ecto-corsair-whisper-6f3b9 1.0.14–1.0.18 Aynı kapılı yük; webhook.site işaretçi ve çoklu uç nokta yedekleme listesi
Varyantlar ecto-rust-read-f3a9c1 1.0.1–1.0.2 Ekstra lavabo işaretleyicileri ekler. ECT-987654, ECT-654321, ECT-839201
Varyantlar ecto-corsair-flag-x9m4 1.0.0, ecto-nightly-spirit 1.1.0 Aynı kapılı yük, aynı C2 ve işaretçi

Kümenin belirleyici özelliği yayınlama hızıdır: tek bir paket ve tek bir sürüm yerine, aynı isim hızlı bir şekilde tekrar tekrar yayınlanır; her sürüm bir önceki sürümün küçük bir varyasyonudur ve aynı yükü taşıyan birkaç farklı isimli kardeş sürüm de bulunur. fısıltı Aile kodu, birbirine yakın iki parmak izine ayrılıyor — bir set iki kritik tespiti tetikliyor, diğeri üç (ek bir dosya okuma havuzu) — ancak her ikisi de aynı yükü çözümlüyor; fark, davranışsal bir çatallanma değil, kod kaymasıdır. Sürümleri fısıltı Analiz edilen aralığın ötesinde (yazım anında en az 1.0.25'e kadar) kayıt defterinde canlı olarak gözlemlenenler oldu ve mercan hayaleti İsim, aynı pencere üzerinden kendi versiyon merdiveninde yükselmeye devam etti.

Uzlaşma göstergeleri

Aşağıdaki tüm göstergeler diskteki paket kaynak kodundan çıkarılmıştır. Ağ göstergelerinin etkileri kaldırılmıştır.

Gösterge Rol
hxxp://154[.]57[.]164[.]71:30782 C2 PUT hedefi (coral-wraith)
hxxp://154[.]57[.]164[.]80:30543 C2 PUT yedekleme (ecto-*)
hxxp://154[.]57[.]164[.]82:31250 C2 PUT yedekleme (ecto-*)
hxxp://154[.]57[.]164[.]71:31289 C2 PUT yedekleme (ecto-*)
hxxps://webhook[.]site/602a4c72-7033-4e28-92ea-dc66e59206e5 Fener koleksiyoneri
169[.]254[.]169[.]254/latest/... IMDSv2 kimlik bilgisi okuma (hedef taraf, AWS meta verileri)

Davranışsal/dosya

Gösterge Rol
"postinstall": "node postinstall.js" Vektörü yükle
ecto_module: YAML ile power_level / ship_deck / cargo_hold anahtarlar Exfil manifest şeması
lavabo işaretleyicileri ECT-472839, ECT-987654, ECT-654321, ECT-839201 C2 yol segmenti /api/modules/<marker>
isAppWorker() kapı: ev sahibi /^[0-9a-f]{12}$/, mevcut çalışma dizini şunları içerir: /app/node_modules Aktivasyon koşulu
aws secretsmanager list-secrets tekrar us-east-1, eu-west-1, eu-central-1 Sırların numaralandırılması
HTB{...} regex kazıma Bayrak kapma hasadı

Dosya özetleri (sha256, analiz sırasında yakalanır)

fileto sha256
coral-wraith/postinstall.js ce5ff035cfdfed1d0015446424b352c27b66bcb77e9fdb0a51e4245199146824
ecto-corsair-whisper-6f3b9 1.0.18/postinstall.js b58432acba376aa6976f0490d9a1c04257ccdbc856d8390260c50322d63e31c3

Atıf ve gözlemlenen davranış

Beş paket adı iki farklı npm hesabı altında yayınlandı, ancak bunlar tek bir küme olarak ele alınabilecek kadar ortak altyapıya sahipler: aynı hesap. ekto_modülü tezahür şeması, aynı ECT-472839 birincil lavabo işaretleyici, aynı webhook.site Toplayıcı kimliği ve aynı C2 uç noktaları 154.57.164.0/24` bloğu. Tohum paketi (`coral-wraith`)(daha basit ve kilitsiz) ve kilitli ekto ailesi bu nedenle bağımsız çabalar yerine tek bir araç setinin yinelemeleri olarak okunabilir.

Paketler, daha sonraki sürümlerinde kendilerini şu şekilde tanımlıyorlar: “Verdaccio tedarik zinciri testleri için CTF yükü.” Bu etiketi gözlemlenebilir bir gerçek olarak ortaya koyuyoruz ve amacına dair bir bulgu olarak yeniden ifade etmiyoruz. Kodun yaptığı şey açık ve etiketlenme şeklinden bağımsızdır: örnek meta veri hizmetinden IAM rol kimlik bilgilerini okur, üç AWS bölgesinde yönetilen gizli bilgileri listeler ve sonuçları genel bir IP adresine ve üçüncü taraf bir webhook toplayıcısına iletir. Gerçekten yalnızca geri döngüye dayalı bir test ortamı, genel IP yedekleme listesine, IMDS kimlik bilgisi okumalarına veya bölgeler arası Secrets Manager çağrılarına ihtiyaç duymaz. Çıkış ve kimlik bilgisi erişimi gerçek olduğundan, kilitli sürümler kötü amaçlı olarak sınıflandırılmıştır.

Yalnızca konteyner tabanlı çalışma özelliği, operasyonel açıdan en dikkat çekici özelliktir. Bu hem bir kaçınma önlemi (dizüstü bilgisayarlarda ve analiz sanal ortamlarında sessiz kalma) hem de bir hedefleme önlemidir; yalnızca gerçek bir IAM rolünün ve canlı gizli bilgilerin bulunma olasılığının en yüksek olduğu yerlerde tetiklenir. Bu paketleri genel bir sanal ortamda çalıştıran analistler hiçbir şey gözlemlemez; davranış yalnızca Docker tarzı bir ana bilgisayar adı ve konteyner içi kurulum yolu altında ortaya çıkar.

Savunmacılar için etki, trendler ve rehberlik

Buradaki risk, derleme ve çalışma zamanı kapsayıcıları içindeki bulut kimlik bilgilerinin ve gizli bilgilerin ifşa edilmesidir. IMDS'den alınan bir IAM rol kimlik bilgisi, o rolün sahip olduğu tüm izinleri içerir; gizli yönetici:Sırları listele (ve herhangi bir devamı) GetSecretValueBu durum, uygulama sırlarının saklanmasına kadar kapsamı genişletiyor. Ortam değişkeni dökümleri sıklıkla kayıt defteri belirteçleri, veritabanı URL'leri ve API anahtarları içerir. Bir CI veya konteyner bağlamında — tam olarak kapının seçtiği şey bu — bu paketlerden birinin tek bir geçişli kurulumu bile bu materyalin sızmasına yeterlidir.

Ektoplazma, görmeye devam ettiğimiz bir kalıba uyuyor: yerel dosyalar yerine bulut meta verilerine ve yönetilen gizli bilgilere erişen ve yalnızca yüksek değerli ortamlarda tetiklenecek şekilde kendilerini kısıtlayan kurulum zamanı yükleri. İki savunma gözlemi şöyledir:

  • Şekil algılanabilir.. Çağrı grafiği hem bulut sırları API'sine (aws secretsmanager, gcloud sırları, az keyvault) veya IMDS adresi ve ağ çıkış alıcısı dar, yüksek sinyalli bir kalıptır; meşru bir yaşam döngüsü betiğinde neredeyse hiç görülmez. Statik akış analizi Belirli bir alan adına veya IP adresine bağlı kalmadan işaretleyebilir.
  • Çevre koşullarına uyum sağlamak bu etkiyi köreltir. IMDSv2'yi 1 atlama sınırı ile uygulamak, konteyner iş yüklerinin örnek meta verilerine ulaşmasını engeller; IAM rollerini en az ayrıcalık ilkesine göre sınırlandırmak, sızan herhangi bir kimlik bilgisinin etki alanını sınırlar; ve kurulumları çalıştırmak... - Komut dosyalarını yoksay CI'da, ihtiyaç duymayan paketler için install-hook vektörünü tamamen ortadan kaldırır.

Savunmacılar için pratik kontroller şunlardır: derleme/CI konteynerlerinden izin verilenler listesinde olmayan genel IP adreslerine giden giden bağlantılar için uyarı vermek. npm kurulumuPaket yaşam döngüsü komut dosyalarından kaynaklanan IMDS erişimlerine dikkat edin; ve bulut CLI'ya komut satırı aracıyla komut gönderen herhangi bir yükleme kancasını, aksi ispatlanana kadar şüpheli olarak değerlendirin.

Bu kümeye özgü iki ek not daha var. Birincisi, etkinleştirme kapsayıcılaştırılmış ortamlara bağlı olduğundan, bir iş istasyonunda doğrulandığında etkisiz görünen bir paket üretimde hala çalışıyor olabilir; doğrulama, "Kurdum ve hiçbir şey olmadı" yaklaşımına güvenmek yerine, kapsayıcı ana bilgisayar adını ve yol koşullarını yeniden üretmeli veya doğrudan kaynak kodunu okumalıdır. İkincisi, bir işaretçi toplayıcı olarak halka açık bir istek inceleme hizmetinin kullanılması, sızdırılan verilerin bir kısmının olay müdahalesi için kurtarılabilir olabileceği anlamına gelir: bağımlılık ağacında bu paketlerden birini bulan bir kuruluş, yükün toplama mantığından başarılı bir işaretçinin ne içereceğini anlayabilir ve etkilenen derleme veya çalışma zamanı ortamından erişilebilen tüm IAM rol kimlik bilgilerini, kayıt defteri belirteçlerini ve yönetilen gizli bilgileri döndürmelidir. Kimlik belgesi rotasyonuKurulum tamamlandıktan sonra uygulanacak işlem, paket kaldırma değil, işlemin kendisidir.

sca-tools-software-composition-analysis-tools
Yazılım risklerinizi önceliklendirin, giderin ve güvence altına alın.
Ücretsiz hesabınızı alın.
Hiçbir kredi kartı gerekmektedir.

Yazılım Geliştirme ve Teslimatınızı Güvence Altına Alın

Xygeni Ürün Paketi ile