· kaynak dev.to (home feed)
indexed-btree npm kötücül yazılımı install script olmadan çalıştı ve C2 adresini Ethereum Sepolia'dan çekti
Checkmarx'a göre indexed-btree npm paketi, normal bir kütüphane metodu çağrıldığında tetiklenen bir loader gizliyordu; ana makine verilerini Slack ve Telegram'a sızdırıyor, C2 adresini ve payload'ları bir Ethereum Sepolia akıllı sözleşmesi üzerinden alıyordu.

Ne yaşandı
Güvenlik firması Checkmarx Zero, meşru B-tree kütüphanesi sorted-btree gibi gösterilen ve firmanın hesabına göre haftada yaklaşık iki milyon indirme alan kötücül bir npm paketi olan indexed-btree'yi belgeledi. 17 Eylül 2026 tarihli araştırma dev.com'da özetlendi; BleepingComputer da kampanyayı ayrıca ele alarak install script'lere odaklanan savunmaların nasıl aşıldığını vurguladı.
Paket ikna edici bir kılıfa sahipti: makul bir GitHub deposu, commit geçmişi ve bir geliştirici hesabı. Checkmarx'a göre GitHub deposu, npm artefaktının içinde dağıtılan kötücül kodu içermiyordu; bu yüzden yayınlanan tarball yerine bağlantılı kaynağı inceleyen herkes temiz bir kod görecekti.
Install script olmadan çalıştırma
Çoğu npm supply-chain kampanyası preinstall, postinstall veya diğer yaşam döngüsü kancalarına yaslanır; birçok ekip ve registry artık bunları engelliyor veya denetliyor. indexed-btree bunların hiçbirini bildirmemişti. Bunun yerine payload, Checkmarx'ın bulduğu gibi, sıradan bir kütüphane metodu olan BTree.prototype.set(key, value, overwrite) içine gizlenmişti. Bu metot 100 değerine eşit bir key ile çağrıldığında ve extended/sharedLoad.min.js adında bir dosya mevcut olduğunda, kod Node.js child_process.spawn() kullanarak bu dosyayı detached bir child process olarak başlatıyor.
Checkmarx, sharedLoad.min.js'yi ağır şekilde obfuscate edilmiş, analiz ve müdahaleye direnmek için kendi bütünlüğünü doğrulayan ve dönen kodlanmış string dizileri etrafında kurulmuş olarak tanımlıyor.
Veri sızıntısı ve blok zinciri tabanlı C2 kanalı
Çalışmaya başladığında loader; işletim sistemi mimarisi, hostname, CPU, bellek ve uptime dahil ana makine ayrıntılarını topluyor ve bunları sabit kodlanmış Slack kanallarına iletiyor. Ardından, C2 adresini öğrenmek için Ethereum Sepolia'ya dağıtılmış bir akıllı sözleşmeyi yokluyor. Saldırgan sözleşmede saklanan değeri istediği zaman güncelleyebildiği için C2 endpoint'i yeni bir paket sürümü yayınlamadan değiştirilebiliyor ve yalnızca bir domain ya da IP'yi engellemek pek bir işe yaramıyor.
Sonraki aşama için loader bir X25519 anahtar çifti üretiyor ve saldırganın public key'ini aynı sözleşmeden okuyor. ECDH shared secret'ından bir AES anahtarı türetiyor, ardından sözleşmede tutulan iki şifreli metni çözüp ikinci aşama payload'ına dönüştürüyor. Loader ayrıca, dosyalarını silebilen ve tetikleyiciyi prototype metodundan çıkarabilen bir temizlik rutini de taşıyor; böylece geride bıraktığı adli izi küçültüyor.
Neler doğrulandı, neler doğrulanmadı
Olayı değerlendirirken iki noktaya dikkat etmek gerekiyor. Birincisi, Checkmarx'ın da belirttiği gibi indirme sayıları enfeksiyon sayısı değildir: kötücül mantık yalnızca gerçek bir uygulama set() metodunu eşleşen key ile çağırdığında çalışır; bu yüzden onu fiilen çalıştıran ana makine sayısı bilinmiyor. İkincisi, ikinci aşamanın içeriği kamuya açıklanmadı ve mağdur ortamlarında çalıştırıldığına, gerçek veri hırsızlığına ya da sonraki aşamalardan kaynaklanan bir ele geçirilmeye dair kamuya açık bir doğrulama yok.
Savunmacılar nelere bakabilir
Endpoint tarafında en net sinyal, sharedLoad.min.js dosyasını argüman olarak 100 ile çalışan detached bir Node.js child process'idir. Ağ tarafında ise Node.js iş yüklerinden Slack ve Telegram API'lerine ile Ethereum Sepolia RPC sağlayıcılarına giden trafiğin, ardından önceden görülmemiş hedeflere yapılan bağlantıların izlenmesi gerekir. Bağımlılık envanterleri, lockfile'lar, SBOM'lar ve npm proxy indirme geçmişi, indexed-btree ya da ilgili paketlerin ortama girip girmediğini gösterecektir.
Checkmarx'ın işaret ettiği karşı önlemler arasında onaylı paket ve sürümleri sabitlemek, kurulumdan önce lockfile'ları, registry metadata'sını ve tarball digest'lerini doğrulamak, geliştirici makinelerinden, CI runner'lardan ve üretim iş yüklerinden giden trafiği yalnızca gerekli servislerle sınırlamak ve incelemeyi yaşam döngüsü script'lerinden bağımlılıkların runtime davranışına ve child process etkinliğine genişletmek yer alıyor.
Neden önemli
Bu kampanya, JavaScript ekosisteminin en yaygın supply-chain denetiminin — install script'leri kısıtlamanın — her projenin er ya da geç çağırdığı normal kütüphane metotlarına gizlenmiş kötücül koda karşı hiçbir şey yapmadığının çalışan bir kanıtıdır. Bunu, değiştirilebilir ve engellenmesi zor bir C2 rehberi olarak bir Ethereum akıllı sözleşmesiyle birleştirmek, ele geçirme girişimlerini büyük ölçüde etkisiz kılıyor; çünkü altyapı kimsenin el koyabileceği bir sunucu değil. Temiz GitHub deposu ile zehirli npm artefaktı arasındaki bu uçurum ise kaynak bağlantılarını denetlemenin, fiilen dağıtılan kodu denetlemenin yerine geçmediğinin bir hatırlatıcısı. Node.js ekipleri için pratik ders, yalnızca kurulum davranışını değil, bağımlılıkların runtime davranışını da tehdit yüzeyinin bir parçası olarak görmektir.
- #npm
- #supply-chain
- #security
- #malware
- #node-js
- #ethereum