Ne oldu?
axios, JavaScript’te HTTP isteği atmak için kullanılan, on yıldır çok sevilen bir kütüphane. Google’ın tehdit istihbarat ekibine göre haftada yaklaşık 100 milyon kez indiriliyor. 31 Mart 2026’da, UTC ile gece 00:21’de axios@1.14.1 yayımlandı ve latest etiketini aldı. 39 dakika sonra eski sürüm hattı için axios@0.30.4 geldi. İkisi de zararlıydı. npm onları yaklaşık üç saat sonra kaldırdı.
Bu kısa süre bile yetti. Huntress, ilk bulaşmayı yayından 89 saniye sonra bir Mac’te gördü. Sadece kendi müşterileri arasında en az 135 cihazın saldırganın sunucusuyla konuştuğunu raporladı.
axios’un kodu temizdi
İşin ilginç yanı, axios’un kaynak kodunda tek bir zararlı satır yoktu. Saldırgan sadece package.json dosyasına yeni bir bağımlılık ekledi: plain-crypto-js. Bu paket, bilinen crypto-js kütüphanesinin kopyası gibi görünüyordu ve axios onu hiç kullanmıyordu. Tek görevi, kurulduğu anda bir postinstall betiği çalıştırmaktı.
Hazırlık da önceden yapılmıştı. StepSecurity’nin zaman çizelgesine göre saldırgan, yaklaşık 18 saat önce paketin temiz bir sürümünü yayımlayıp ona “geçmiş” kazandırdı. Zararlı sürümü ise axios’tan 22 dakika önce yükledi.
Betik şöyle çalışıyordu:
- İşletim sistemini tanıyıp saldırganın sunucusundan ona uygun ikinci parçayı indiriyordu. Mac’te Apple dosyası gibi adlandırılmış bir program, Windows’ta Windows Terminal kılığına girmiş bir PowerShell kopyası, Linux’ta
/tmpaltına bir Python betiği. - Bu parça bir RAT (remote access trojan, uzaktan erişim truvası). Dakikada bir sunucuya bağlanıp komut bekliyor, dosyaları listeliyor, istenen kodu çalıştırıyor.
- Sonra izlerini siliyordu. Kendi betiğini ve zararlı
package.json’u silip yerine temiz görünen, sürümü 4.2.0 yazan bir dosya koyuyordu.npm installhata vermeden bitiyordu.
Kurulum betiklerini neden kapatman gerektiğini bundan daha iyi anlatan bir örnek az bulunur.
Bakımcı nasıl kandırıldı?
Zararlı sürümler, axios’un baş bakımcısı Jason Saayman’ın npm hesabından elle yayımlanmıştı. Normalde axios, GitHub Actions üzerinden şifresiz trusted publishing (OIDC) ile yayın yapıyordu. Ama hesapta hâlâ eski, uzun ömürlü bir npm token’ı vardı ve saldırgan onu kullandı. GitHub deposunda bu sürümlere karşılık gelen bir commit de yoktu. Bu fark, araştırmacıların ilk yakaladığı işaretlerden biriydi.
Saayman’ın 2 Nisan’da yazdığı olay raporuna göre başlangıç bir sosyal mühendislik oyunuydu. Saldırganlar tanınmış bir şirketin kurucusu kılığında ona yazdı, onu şirketin markasıyla hazırlanmış bir Slack çalışma alanına davet etti. Ardından bir Teams görüşmesi ayarlandı. Görüşmede “sisteminde bir şey güncel değil” diyen sahte bir hata çıktı. O “güncelleme” RAT’ın kendisiydi. Hesabında iki aşamalı doğrulama açıktı, ama bilgisayarın kontrolü saldırgana geçince bunun pek önemi kalmadı.
Google, saldırıyı Kuzey Kore bağlantılı, para odaklı UNC1069 grubuna bağladı. Socket’in sonraki incelemesine göre aynı oyun Lodash, Fastify ve dotenv gibi projelerin bakımcılarına da denendi, ama onlar sahte güncellemeyi kurmayı reddetti.
Bende var mı?
- Kilit dosyanda
axios1.14.1 ya da 0.30.4, veya herhangi birplain-crypto-jsgirdisi ara. node_modules/plain-crypto-jsklasörü varsa, betik çalışmış demek. İçi temiz görünse bile.- Bulursan cihazı temizlemeye çalışma, sıfırdan kur. Tüm anahtar ve token’ları başka, temiz bir bilgisayardan yenile. CI makineleri için de aynısı geçerli.
Kalıcı önlemler için npm kurulum güvenliği yazımıza bak. Syntax ekibinin de bu bölümde altını çizdiği minimumReleaseAge gibi bir bekleme süresi, üç saat yaşayan bu sürümleri tamamen atlatırdı.
Paket yayımlıyorsan
npm’in kendi belgesi açık: Trusted publishing’i kurduktan sonra paket ayarlarında “2FA iste ve token’lara izin verme” seçeneğini aç. Yoksa güvenli kapının yanında açık bir arka kapı bırakmış olursun. axios raporunda bir ders daha var: Yetkisiz bir yayını otomatik fark edecek bir sistemleri yoktu, sorunu topluluk buldu.
Sonra ne oldu?
axios 8 Nisan’dan beri tüm sürümlerini yeniden sadece GitHub Actions üzerinden, OIDC ile yayımlıyor. npm Mayıs 2026’da staged publishing’i genel kullanıma açtı: CI paketi hazırlıyor ama yayına çıkması için bir bakımcının 2FA ile onay vermesi gerekiyor. axios’un Haziran’dan beri her sürümünde, npm kaydında onu onaylayan bakımcının adı da görünüyor. Bir ay sonra TanStack, token’ın bu kez CI’ın içinden çalındığı bambaşka bir zincirle vuruldu: TanStack yazımızda anlattık.
Düşün
- Senin npm hesabında hâlâ geçerli, uzun ömürlü bir token var mı? En son ne zaman kullandın?
- Biri sana “bu görüşme için şu güncellemeyi kur” dese, hangi işaret seni durdururdu?
Videoyu izle
Kaynaklar (11, İngilizce)
- Fireship: Millions of JS devs just got penetrated by a RAT… (video) (yeni sekmede açılır)
- Better Stack: Millions of JS Devs Just Got Hacked... (axios pwned) (video) (yeni sekmede açılır)
- Syntax #993: It's Been A Hell Of Week (yeni sekmede açılır)
- StepSecurity: axios compromised on npm, malicious versions drop remote access trojan (yeni sekmede açılır)
- Huntress: Supply chain compromise of axios npm package (yeni sekmede açılır)
- Google Threat Intelligence: North Korea threat actor targets axios npm package (yeni sekmede açılır)
- axios GitHub: Post Mortem, axios npm supply chain compromise (yeni sekmede açılır)
- The Hacker News: UNC1069 social engineering of axios maintainer (yeni sekmede açılır)
- npm Docs: Trusted publishing (yeni sekmede açılır)
- The Hacker News: npm adds 2FA-gated publishing (yeni sekmede açılır)
- npm: axios paket sayfası (yeni sekmede açılır)
Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.