← Radar

Konu: Güvenlik3 dk okuma

npm install seni hacklemesin: Birkaç ayarla tedarik zinciri saldırılarına karşı önlem

Bu neden önemli?

Bir paket kurduğunda, o paketin ve onun bağımlılıklarının yazarlarına bilgisayarında kod çalıştırma izni vermiş oluyorsun. Saldırganlar da tam bunu kullanıyor. Buradaki önlemlerin çoğu bir satırlık ayar ve kurulumu birkaç dakika sürüyor.

Saldırı nasıl işliyor?

Tedarik zinciri saldırısında saldırgan senin koduna değil, kullandığın bir pakete giriyor. Genelde bir paket sahibinin hesabını ele geçirip zararlı bir sürüm yayınlıyor. Sen ya da bağımlılıklarından biri o sürümü kurduğu anda zararlı kod bilgisayarında çalışıyor, anahtarlarını ve token’larını topluyor.

İyi haber: Zararlı sürümler çoğu zaman birkaç saat içinde fark edilip kaldırılıyor. Önlemlerin çoğu da bu gerçeğe dayanıyor.

Bu ayarların neden önemli olduğunu gösteren yakın bir örnek: TanStack paketleri, CI önbelleği zehirlenerek ele geçirildi.

1. Yeni sürümleri hemen kurma

Paket yöneticilerine “şu kadar süreden yeni sürümleri kurma” diyebiliyorsun. Bekleme süresinde biri zararlı sürümü yakalamış oluyor. Üç büyük paket yöneticisi aynı ayarı üç farklı birimle sunuyor:

  • npm: .npmrc içinde min-release-age=7 (gün).
  • pnpm: pnpm-workspace.yaml içinde minimumReleaseAge: 10080 (dakika).
  • Bun: bunfig.toml içinde [install] altında minimumReleaseAge = 604800 (saniye).

Videoya göre npx ve bunx bu ayarı dikkate almıyor. Bir de kodlama ajanlarına dikkat: Ajanın ayarı komut satırından atlayıp en yeni sürümü kurduğu görülmüş.

Bu bekleme süresinin neden işe yaradığını axios saldırısında gördük: Zararlı sürümler npm’de sadece üç saat kaldı.

2. Kurulum betiklerini kapat

Bir paket kurulduğu anda kendi betiğini (postinstall gibi) çalıştırabiliyor. Bu, yerel kod derlemek gibi meşru işler için var, ama saldırıların büyük kısmı da bu kapıdan giriyor.

pnpm 10 ve Bun bu betikleri zaten varsayılan olarak çalıştırmıyor. İzin vermek istediğin paketleri tek tek seçiyorsun: pnpm’de pnpm approve-builds, Bun’da package.json içindeki trustedDependencies listesi. npm’de ise ignore-scripts=true ayarını kendin açman gerekiyor. Bu ayarın yetmediği, kurulum betiği kullanmayan bir saldırıyı Shai-Hulud yazımızda anlattık.

3. Git bağımlılıklarını engelle

Bir bağımlılık, kayıt defteri yerine doğrudan bir git adresinden gelebiliyor. Bu yol, kayıt defterindeki kontrolleri atlatmak için kullanılabiliyor. npm’de allow-git=none bunu tamamen kapatıyor, root ise sadece senin package.json dosyana kendin yazdıklarına izin veriyor. pnpm’deki karşılığı blockExoticSubdeps: true.

pnpm’in bir ayarı daha var: trustPolicy: no-downgrade. Bir paket önceki sürümlerde güvenilir bir yayın sürecinden geçmişken yeni sürüm bu kanıt olmadan geliyorsa kurulum duruyor.

4. Paketi kurmadan önce taratan araçlar

Paket yöneticini bir aracın arkasına koyabiliyorsun:

  • npq: Kurmadan önce bilinen açıkları, paketin yaşını, isim benzerliğiyle kandırma (typosquatting) ihtimalini ve kurulum betiklerini kontrol edip sana soruyor.
  • Socket Firewall: Kötü olduğu doğrulanmış paketleri engelliyor. Python ve Rust paket yöneticilerini de destekliyor.

5. Kilit dosyasına sadık kal

Kilit dosyası her paketin tam olarak nereden indirileceğini yazıyor. Kimse PR’larda bu dosyayı okumadığı için, saldırgan bir adresi kendi sunucusuna çevirebiliyor. lockfile-lint bu adreslerin güvenilir kaynaklardan geldiğini kontrol ediyor.

CI’da ve üretimde npm install yerine npm ci kullan (pnpm ve Bun’da --frozen-lockfile). Bu komut sadece kilit dosyasındakini kuruyor, uyuşmazlık varsa tahmin yürütmek yerine duruyor. Tabii kilit dosyasını git’e eklemek şartıyla.

Alışkanlıklar

Her şeyi tek komutla güncelleme, her güncellemenin sebebini sor. Daha az paket kullan: Birkaç satırlık bir iş için koca bir bağımlılık eklemek, saldırı yüzeyini büyütüyor.

Peki zaten kurduysan? Bumblebee

Bir saldırı duyurulduğunda ilk soru şu oluyor: Bu sürüm bizim bilgisayarlarımızın herhangi birinde var mı? Perplexity’nin açık kaynak yaptığı Bumblebee tam bunu cevaplıyor. Go ile yazılmış tek bir program. npm, PyPI, Go, Homebrew paketlerini, editör ve tarayıcı eklentilerini, MCP ayar dosyalarını diskteki bilgilerden listeliyor.

Önemli olan nokta: Hiçbir paket yöneticisini çalıştırmıyor, sadece dosya okuyor. Zararlı bir paketi ararken onu yanlışlıkla tetiklemek istemezsin. Sonuçları satır satır JSON olarak veriyor ve bilinen kötü sürümlerin listesiyle eşleştirebiliyor. Şimdilik macOS ve Linux’ta çalışıyor. Kötü bir paket içeri girse bile zararı sınırlamanın yollarını kod izolasyonu yazımızda anlattık.

Düşün

  • Bugün bir paket ele geçirilse, ekibinde onu kimin kurduğunu ne kadar sürede bulabilirsin?
  • Projendeki bağımlılıklardan hangisini birkaç satır kodla değiştirebilirsin?

Videoyu izle

Tıklayınca video YouTube'dan yüklenir; o ana kadar bu sayfa YouTube'a hiçbir istek göndermez.
Kaynaklar (9, İngilizce)

Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.