Güvenlik araştırmacıları, Joyfill ekosistemine ait iki npm paketinde import edilir edilmez çalışan ve Node.js süreçlerine uzaktan erişim truva atı indiren kötü amaçlı kod bulunduğunu açıkladı. Etkilenen paketler, @joyfill/layouts@0.1.2-2773.beta.0 ve @joyfill/components@4.0.0-rc24-2773-beta.4 sürümleri oldu.
İncelemeye göre bu paketler, klasik npm yaşam döngüsü kancalarına bağlı bir saldırı değil; CommonJS giriş noktası Node.js tarafından yüklendiği anda devreye giren bir JavaScript implantı içeriyor. Kötü amaçlı kod, şifrelenmiş ikinci aşama yükleri Tron, Aptos ve BNB Smart Chain üzerindeki işlemlerden çözerek çekiyor.
Socket, iki paketin de import anında çalışan JavaScript implantı taşıdığını ve bu yapının npm ekosistemindeki diğer kötü amaçlı paketlerden ayrıldığını bildirdi. Şirket, kodun npm yaşam döngüsü kancası yerine Node.js CommonJS giriş noktası yüklendiği anda çalıştığını vurguladı. Bu nedenle yük, paket içeriği belleğe alınır alınmaz devreye giriyor.
Çok katmanlı blokzincir altyapısı ve DEV#POPPER izi
Güvenlik şirketi Socket, implantın yapısının daha önce DEV#POPPER ailesiyle ilişkilendirilen örüntülere benzediğini belirtti. Aynı çoklu blokzincir çözümleme mimarisinin Tron, Aptos ve BNB Smart Chain üzerinden çalışması, PolinRider adıyla izlenen tehdit kümesiyle de bağlantılı görülüyor; bu kümenin Contagious Interview ile ilişkili olduğu değerlendiriliyor.
Socket’in analizinde, çoklu blokzincir çözümleyici yapısının yalnızca kodu gizlemek için değil, operasyonu daha dayanıklı kılmak için kullanıldığı ifade edildi. Tron, Aptos ve BNB Smart Chain’den oluşan yapı, tehdit kümesi PolinRider ile ilişkilendiriliyor. Bu kümenin Contagious Interview ile bağlantılı olduğu değerlendiriliyor.
Araştırmacıların aktardığına göre bulaşan paketler iki paralel akış yürütüyor. İlk akış, çalışma süreci içinde 77 KB büyüklüğünde bir JavaScript yükünü geri getiriyor. Bu yükün DEV#POPPER ailesine benzerlik taşıdığı ifade ediliyor. İkinci akış ise ayrıştırılmış bir Node.js süreci başlatıyor, 23.27.13[.]43 adresinden ayrı bir başlangıç yükü istiyor, yanıtı çözüp çalıştırıyor.
İlk akışta elde edilen 77 KB’lık JavaScript yükü, in-process bir yol üzerinden çalışıyor. İkinci akış ise ayrı bir Node.js süreci açıyor ve bu süreç 23.27.13[.]43 adresinden boot payload talep ediyor. Gelen yanıt çözümleniyor ve yürütülüyor.
Paket yüklendikten sonra sistem önce sabitlenmiş bir Tron adresinin en son giden işlemini tarayıp buradan bir BSC işlem hash’i çıkarmaya çalışıyor. Bu adım başarısız olursa Aptos hesabı yedek kaynak olarak sorgulanıyor; elde edilen BSC işlem verisinden JavaScript kodu çözülüp yürütülüyor. Aynı mekanizma, farklı cüzdan adresleri, hesaplar ve işlemlerle hem Tron hem Aptos hem de BSC tarafında ayrı ayrı uygulanıyor.
Socket’in analizinde, blockchain kullanımının saldırganlara operasyonel dayanıklılık sağladığı ve paketlerin yeni bir sürüm yayımlamaya gerek kalmadan farklı yükleri dağıtmasına imkân verdiği vurgulandı. İlk in-process yük, yine blokzincir çözümleme tekniğiyle “clientCode” adı verilen ikinci aşama zararlı yazılımı çekiyor. Ayrılmış süreç ise doğrudan IP üzerinden JavaScript kodu indirip çalıştırıyor.
Şirket bu ikinci yolu “zararsız bir yedekleme mekanizması değil, yinelenmiş bir dağıtım kanalı” diye tanımladı. Ayrılmış sürecin Node.js’i import eden ana süreçten kopuk çalıştığı, bu nedenle bir build, test ya da komut satırı işlemi tamamlandıktan sonra da yaşamaya devam edebildiği aktarıldı.
Son aşamadaki “clientCode” yükü yoğun biçimde gizlenmiş durumda ve bir Node.js RAT olarak çalışıyor. Saldırı, github-runner, buildbot, buildkitsandbox ve microsoft-standard-WSL2 gibi ana makine adlarını görürse geliştirme ortamlarında, sürekli entegrasyon sistemlerinde veya sanal kutularda çalışmaktan kaçınıyor. Kötü amaçlı yazılımın dosya yükleme, ek JavaScript çekme, temel sistem bilgisi toplama, durum bildirimi gönderme, panoda bulunan verileri okuma ve Windows’ta PowerShell, macOS’ta pbpaste, Linux’ta ise xclip ya da xsel üzerinden clipboard verisini alma yetenekleri bulunuyor.
Bu yüklerden biri, hedef sistemden dosya sızdırabilen “clientCode” RAT olarak tanımlandı. Diğeri ise çok çeşitli verileri toplayabilen Python tabanlı bir infostealer. Araştırmacılar bunu, ilk kez Nisan başında eSentire tarafından ayrıntılandırılan OmniStealer ailesinin bir varyantı olarak değerlendiriyor.
Toplanan veriler arasında ortam ve ana makine bilgileri, Windows Credential Manager ve Linux Secret Service verileri, Chromium ve Firefox tarayıcı verileri, cüzdanlar ile parola yöneticileri için tarayıcı eklentisi depolamaları, Git kimlik bilgileri, GitHub CLI yapılandırması, GitHub Desktop günlükleri ve Microsoft Visual Studio Code depolaması yer alıyor.
Socket, hem ViteVenom hem de son npm paketi setinin ayrı kampanyalar değil, Kuzey Koreli tehdit aktörlerinin yürüttüğü aynı operasyonun parçaları olduğunu bildirdi. Şirkete göre kötü amaçlı sürümlerin ikisi de aynı npm kimliği kullanılarak, Node.js 18.20.0 ve npm 10.5.0 ile yayımlandı; kodun paketleme anında hazır bulunduğu görüldü. Ancak bu enjeksiyonun bir geliştirici iş istasyonunun, kaynak deposunun, CI ortamının ya da yayınlama kimlik bilgilerinin ele geçirilmesiyle mi gerçekleştiği henüz net değil.
Earlier this month, Checkmarx and OpenSourceMalware de ViteVenom adıyla izlenen bir dizi kötü amaçlı npm paketini gündeme getirmişti. Bu paketlerin Vite frontend tooling ekosistemini hedef aldığı, aynı katmanlı blokzincir tabanlı komuta-kontrol altyapısını kullandığı ve ters kabuk, kimlik bilgisi toplama, dosya sızdırma ile kalıcı arka kapı enjeksiyonu özellikleri taşıyan bir RAT dağıttığı belirtildi. Socket, mevcut paketin de aynı operasyon zincirinin devamı olduğunu ifade etti.
İncelemede, etkilenen sürümleri kuran geliştiricilerin bunları lockfile’lardan, önbelleklerden, dahili aynalardan, build imajlarından ve dağıtım çıktılarından silmesi gerektiği belirtildi. Ayrıca doğrulanmış bir sürüme sabitleme yapılması ve etkilenen Node.js sürecinden geçen kimlik bilgilerinin döndürülmesi tavsiye edildi.
Socket, @joyfill/layouts sürümünün onu yükleyen her süreç bağlamında keyfi kod çalıştırabilecek durumda görülmesi gerektiğini de ifade etti. Bu kapsamda geliştirme ortamları, CI çalıştırıcıları, test araçları, sunucu tarafı render süreçleri ve derleme adımları yer alıyor. Şirket, son geri kazanılan kodun ana makine bilgisi toplayabildiğini, Socket.IO üzerinden uzaktan kontrol kanalı kurabildiğini, verilen JavaScript ya da shell komutlarını çalıştırabildiğini, dosya yükleyebildiğini, panodaki verileri okuyabildiğini ve geliştirici araçlarına ait dosyaları değiştirebildiğini aktardı.
