· kaynak dev.to (home feed)
vite.config.js içine gizlenen kötü amaçlı yazılım, sahte merge commit sonrası npm run build ile çalışıyor
Bir dev.to araştırması, saldırganların meşru bir GitHub merge commitini kopyalayıp vite.config.js içine obfuscate edilmiş kötü amaçlı yazılım yerleştirdiğini ve force-push ettiğini; böylece payload'un, herkes npm run build çalıştırdığı anda devreye girdiğini belgeliyor.

dev.to'da yayımlanan bir yazı, kötü amaçlı bir paket gerektirmeyen ve şüpheli bir dosya barındırmayan bir tedarik zinciri saldırısını belgeliyor: saldırgan rutin bir GitHub merge commitini taklit ediyor, obfuscate edilmiş kötü amaçlı yazılımı vite.config.js içine enjekte ediyor ve force-push ediyor; böylece payload, herhangi birisi git pull sonrasında npm run build çalıştırdığı anda devreye giriyor.
Bulguları gerçek bir araştırmadan genelleştiren yazara göre, birkaç güvenlik firması ilgili faaliyeti npm ve Vite ekosistemine yönelik ChainVeil, ViteVenom ve PolinRider gibi adlar altında bir kampanya olarak izliyor; GitHub kullanıcıları da build config'lerinin force-push ile yeniden yazıldığını bağımsız olarak bildirmiş durumda.
Nasıl yayılıyor
Zincir, bir ekip üyesinin makinesindeki kötü amaçlı yazılımın Git hosting kimlik bilgilerini çalmasıyla başlıyor. Ardından bir script, o kimlik bilgilerinin erişebildiği her repository'nin her branch'ine zehirli bir commit force-push ediyor. Yalnızca tek bir dosya değiştiriliyor — bir build config'i — package. ve node_modules dokunulmadan kaldığı için bağımlılık denetim araçları hiçbir şey işaretlemiyor.
Burada hız önem taşıyor. Gözlemlenen olayda, meşru bir pull request merge edildikten 14 dakika sonra, o merge'in sahte bir kopyası develop branch'ini ezdi; yaklaşık bir dakika içinde bir düzine branch daha izledi, bazıları iki saniye arayla. Production ve staging branch'leri de yeniden yazıldığı için, aktif bir CI/CD pipeline'ı payload'u deploy aşamasına kadar taşıyabilirdi.
Diff içinde gizlenmek
Payload, vite.config.js dosyasının sonuna uzun bir boşluk dizisinin ardına ekleniyor. Diff'te yalnızca kapanış satırı değişmiş gibi görünüyor ve stat özeti iki satırlık bir değişiklik bildiriyor — neredeyse kimsenin açıp bakmadığı türden bir değişiklik. ESM config'lerinin başına, require çalışmaya devam etsin diye küçük bir shim ekleniyor. Obfuscation iki katman derinlikte: bir karakter değişimi bir string tablosunu geri getiriyor, sözlük genişletmesi kodu yeniden oluşturuyor ve sonuç Function constructor'ından geçirilerek tanınabilir anahtar kelimelerin statik aramalarda görünmesi engelleniyor.
Blockchain üzerinde bir C2 adresi
Kötü amaçlı yazılımın ikinci aşamasının tek amacı command-and-control sunucusunu bulmak ve bunu kamu blockchain'ini okuyarak yapıyor. Genel bir Ethereum RPC endpoint'ine bağlanıyor, son bloklarda geriye doğru yürüyor, gönderici adresinde belirli bir işaretleyici içeren bir transaction buluyor ve C2 adresini alıcıdan oluşturuyor. Yedek olarak sırayla üç RPC endpoint'i deneniyor.
Yazı bu tekniği EtherHiding olarak tanımlıyor ve TRON, Aptos ve BNB Smart Chain üzerinde bildirilen varyantlara dikkat çekiyor. Buna karşı koymak zor: sunucuyu ele geçirmek pek bir şey kazandırmıyor çünkü saldırgan zincir üzerinde yeni bir adres yayınlayabilir; trafik meşru kamu RPC altyapısını hedeflediğinden hedef engelleme pratik değil; üstelik zincir üzerindeki kayıt silinemiyor.
Keyfi kod, iz yok
Bir kez başlatıldığında, resident process -skipwarn başlangıç bayrağıyla kendini devre dışı bırakabiliyor, iki kez çalışmaya karşı koruma içeriyor, C2'den bir başlatma payload'u çekiyor ve onu doğrudan eval'e geçiriyor. require global olarak maruz kaldığından gelen her şey dosyaları okuyup yazabilir, veri sızdırabilir veya kalıcılık kurabilir. Yazarın belirttiği gibi eval bellekte çalıştığından diske hiçbir şey inmiyor — sonrasında ne çalındığını belirlemek esasen imkânsız.
Sahte merge commit
Giriş tekniği en çarpıcı olan. Saldırgan gerçek bir merge commitini bütünüyle kopyaladı — aynı yazar, yazar tarihi, parent commitler ve merge mesajı — payload ile birlikte yeniden oluşturdu ve branch üzerine force-push etti. GitHub'ın web arayüzü sıradan tek bir merge gösterdi. Üç ayrıntı onu ortaya çıkardı: committer alanında GitHub <[email protected]> yerine üyenin adı +0100 saat dilimiyle duruyordu, PGP imzası yoktu ve vite.config.js 963 bayttan 9.510 bayta çıkmıştı.
Sahte commit üzerindeki isim, ele geçirilmemiş farklı bir üyeye aitti. Yazar alanları serbest metin; push'u gerçekleştiren kimlik bilgisi ise taklit edilemeyen kısımdır ve GitHub bunu repository'nin event log'una kaydeder; API üzerinden PushEvent kayıtlarıyla incelenebilir.
Nasıl tespit edilir
Kontroller bu ipuçlarından doğrudan çıkıyor. GitHub'ın butonu üzerinden yapılan merge'ler committer olarak her zaman GitHub'ı listeler; bir kişiye atfedilen merge commit web'de merge edilmemiştir. İmza durumu git log'un %G? format yer tutucusuyla denetlenebilir; G iyi bir imza, N ise hiç imza olmadığı anlamına gelir. Adı geçen geliştiricinin makinesinin asla üretemeyeceği bir committer saat dilimi — +0900 ortamında +0100 — ek bir kırmızı bayraktır.
Neden önemli
Bu saldırı, ekiplerin izlediği yüzeyleri atlıyor. Paket registry'sinden hiçbir şey geçmediği için lockfile'lar ve bağımlılık tarayıcıları kördür; enfeksiyon fiilen her JavaScript projesinin sahip olduğu bir config dosyasında ve tetikleyici, geliştiricilerin ve CI sunucularının sürekli çalıştırdığı bir komuttur. Git'in insan tarafından okunabilir üst verisi — yazar, tarih, mesaj — kolayca taklit edilebilir; geriye yalnızca imzalar, committer kimliği ve platformun push kayıtları güvenilir sinyal olarak kalır. Tasarımı gereği sunucu ele geçirmelerinden kurtulan bir C2 kanalıyla birleşince, repository kimlik bilgileri production secret muamelesini hak ediyor: force-push'lere karşı branch koruması, zorunlu imzalı commitler ve periyodik committer alanı denetimleri ucuzdur ve bu saldırıyı yakalayabilirdi.
- #supply-chain
- #security
- #npm
- #git
- #vite
- #malware
İlgili yazılar
- Plugin4Shell: doğrulanmayan git pinleri, AI ajan plugin mağazalarında sıfır tıklamayla RCE'ye yol açtı
- Açık kaynaklı Godmode Bot, tarayıcı girişlerini ve 2FA kodlarını gizli bilgileri modele göstermeden dolduruyor
- Gemini 3.8 Flash'ın fiyatı Ocak'ta ikiye katlanıyor, Meta'nın Muse Spark 1.3'ü ise eğitim verisi karşılığı ucuz token satıyor