Bu hafta sahte bir müşteri gelen kutuma kötü amaçlı bir GitHub deposu sızdırdı ve sadece başlangıç betiğini çalıştırmak iki günlük çalışmamı silip tarayıcımda tuttuğum tüm şifreleri ifşa etti.

"Müşteri" yüksek maaşlı bir kıdemli mühendis rolü paylaştı, hızlıca mesaj attı ve profesyonel görünen bir depo (repo) gönderdi. İstek basitti: depoyu klonla, npm run dev komutunu çalıştır ve demonun çalıştığını kanıtlamak için bir ekran görüntüsü gönder; sözleşme yok, geçmiş kontrolü yok. Geliştirme sunucusu başlar başlamaz, bir yapılandırma dosyasındaki gizli kod bir komuta ve kontrol (C2) sunucusuna ulaştı, ikinci aşama yükünü (payload) çekti ve yerel makineden kimlik bilgilerini sızdırmaya başladı.

Saldırı nasıl gerçekleşti

Kötü amaçlı yük postcss.config.js dosyasında bulunuyordu; bu dosya genellikle birkaç basit CSS işleme kuralı içerdiği için çoğu geliştiricinin gözünden kaçar. Bu vakada saldırgan, meşru bir ifadenin çok sağ tarafına, araya karışması için boşluklarla doldurulmuş, karmaşıklaştırılmış (obfuscated) bir JavaScript satırı eklemişti. npm run dev komutu PostCSS hattını (pipeline) çalıştırdığında, gizli satır fark edilmeden çalıştı.

Kötü amaçlı yazılım hızlı bir şekilde üç adım gerçekleştirdi:

  • C2 bağlantısı – saldırgan tarafından kontrol edilen bir sunucuya ağ bağlantısı açtı ve ele geçirilen ana bilgisayarı bildirdi.
  • İkinci aşama indirme – gerçek veri sızdırma mantığını içeren ek kodları çekti.
  • Tarayıcı kimlik bilgilerinin çalınması – macOS üzerinde, sistem anahtarlığında (keychain) saklanan Chrome Safe Storage anahtarını sorguladı. Kullanıcı anahtarlık uyarısını onaylarsa, saldırgan Chrome'da kayıtlı olan her şifreyi topladı.

Doğrudan hırsızlığın ötesinde, yük kendini VS Code, npm ve Discord gibi birkaç yaygın geliştirici aracına yazdı; böylece bu uygulamaların gelecekteki her başlatılması kötü amaçlı kodu yeniden devreye sokuyordu. Basit bir yeniden başlatma enfeksiyonu temizlemedi; bir sonraki npm install işlemi veya editörün açılması arka kapıyı (backdoor) yeniden canlandırdı.

Genellikle gözden kaçan kırmızı bayraklar

  • Herhangi bir sözleşme imzalanmadan kod çalıştırma talepleri. Meşru işe alım süreçleri, mülkiyet hakkı olan herhangi bir çalışma paylaşılmadan önce genellikle resmi bir anlaşma gerektirir.
  • "Proje özeti" kılığına girmiş sıkıştırılmış dosyalar. Zip veya RAR arşivleri, yürütülebilir betikleri veya kötü amaçlı ikili dosyaları (binaries) gizleyebilir.
  • "Platform filtrelerini atlamak" için kişisel e-posta adresi talepleri. Bu hile, konuşmayı suistimalin raporlanabileceği korumalı platformun dışına taşır.
  • Adaydan bir kripto cüzdanını finanse etmesini veya test tokenları satın almasını isteyen iş tanımları. Bu tür talepler, gerçek geliştirme işleri için alışılmadık durumlardır.

Güvende kalmak için pratik adımlar

  1. Yabancı birinin kodunu incelemeden asla çalıştırmayın. Depoyu salt okunur bir görünümde (örneğin GitHub'daki raw dosya görünümü üzerinden) açın ve her betiği, özellikle yapılandırma dosyalarını ve package.json içindeki scripts girişlerini tarayın.
  2. Tüm ekleri düz metin olarak ele alın. Bir zip dosyası gönderilirse, bir sandbox (kum havuzu) ortamında çıkartın ve herhangi bir şeyi açmadan önce içeriği inceleyin.
  3. Tarayıcı depolaması yerine özel bir şifre yöneticisi kullanın. Tarayıcının anahtarlığı ele geçirilse bile, yöneticinin kasası izole kalır.
  4. Güvenilmeyen kodları, ağ erişimi olmayan izole bir sanal makinede veya konteynerda çalıştırın. Bu, saldırganın bir C2 sunucusuna ulaşma yeteneğini engeller.
  5. Tüm hesaplarda iki faktörlü kimlik doğrulamayı (2FA) etkinleştirin. Bir şifre çalınırsa, ikinci faktör yetkisiz girişleri durdurur.
  6. Geliştirici araçlarını güncel tutun ve mevcut olan yerlerde otomatik bütünlük kontrollerini etkinleştirin. Bazı editörler artık temel dosyalar beklenmedik şekilde değiştirildiğinde uyarı veriyor.

Kötü amaçlı bir kod çalıştırdığınızdan şüpheleniyorsanız, sistemin ele geçirildiğini varsayın. Önemli verileri yedekleyin, sürücüyü silin ve işletim sistemini yeniden yükleyin. Basit bir yeniden başlatma, yaygın uygulamalardaki dosyaları yeniden yazan bir kalıcılık mekanizmasını (persistence mechanism) ortadan kaldırmayacaktır.

Özetle: Tek bir gizli JavaScript satırı, rutin bir demoyu tam teşekküllü bir kimlik bilgisi hırsızlığı operasyonuna dönüştürebilir. Doğrulamadığınız sürece her depoyu güvenilmez olarak kabul edin ve izolasyonu iş akışınızın varsayılan bir parçası haline getirin. Bir anlık aceleciliğin maliyeti, bir dosyayı iki kez kontrol etmek için harcanan çabadan çok daha fazladır.