Modern bir projeyi açıp bağımlılık sayısına baktığınızda, kodunuzun yüzde doksanının sizin yazmadığınızı görürsünüz. Bu elbette bir başarı hikâyesi: tekerleği yeniden icat etmiyoruz. Ama aynı denklemi saldırgan da seviyor, çünkü onun için de kapı sayısı arttı — ve kapıları sizin yerinize siz seçiyorsunuz. Tedarik zinciri saldırısının en can alıcı özelliği budur: zararlı kod, kendi sunucunuza sizin komutunuzla, sizin paket yöneticiniz tarafından kurulur.

Bu saldırı sınıfı yeni değil; yeni olan, hedefin büyümesidir. Bir kez ele geçirilen popüler paket, onu kuran her şirkete aynı anda sızmış olur. Yani saldırının maliyeti sabit, getirisi ise kurban sayısıyla orantılı.

Üç klasik senaryo

Birincisi ele geçirme: bakımcısı kaybolmuş, ama milyonlarca indirili bir paket; hesabı devralan biri sürüm yayınlar ve haftalarca kimse fark etmez. İkincisi yazım benzerliği: lodash yerine 1odash; küçük bir yazım hatası, büyük bir kazanç. Üçüncüsü ve en aşağılayıcısı sürüm devri: bakımcı, paketi iyi niyetli birine devreder; yeni sahip, sürüm numarasını büyütüp içerikle oynar. Üçünde de hata geliştiricinin paket yöneticisini fazla güvenilir bulmasında.

# Yeni bağımlılık eklemeden önce 30 saniye: kim bu, ne zaman değişti?
npm view left-pad maintainers time --json
npm audit --omit=dev
npx @socketsecurity/cli npm install onceki-sorumlusu-yok --lockfile-only

Kilit dosyası bir sözleşmedir

package-lock.json veya benzeri bir kilit dosyası, "bu depoda bu sürümler" cümlesinin imzalı halidir. Sürekli entegrasyonunuzda --frozen-lockfile ile kurulum yapmıyorsanız, saldırganın paket kayıt defterine yukarı sürümlemek için erişimine gerek yok; sizin derleme makineniz yeter. Kilit dosyasını geriye doğru kırmak, yani bir bağımlılığı elle "yamalamak" ise bir sonraki kurulumda çözülür — kalıcı çözüm, kilit dosyasını değiştirmekten geçer.

Aynı sözleşme, kod incelemesinin de parçası olmalıdır: bağımlılık değiştiren istek kolları ayrı bir gözle incelenir, sürüm atlamanın gerekçesi açıklanır. "Güncelledim, çalışıyor" cümlesi inceleme notu değil, gelecek bir olay soruşturmasının ilk satırıdır.

Kimliğe bak, sürüme değil

Pratikte işi saniyelerle değil alışkanlıklarla kazanmak mümkündür. Yeni bir paket eklerken önce kimliğine bakın: kim bakıyor, son sürüm ne zaman, depo adresi gerçek mi? Sürüm neredeyse hiç değişmeyen bir pakette birden bire çıkan sürüm, soru sormayı hak eder. Kurulduktan sonra ağdan veri çeken, şifreli yük açan ya da kurulum betiği olan paketler ayrı bir gözle taranır; bunların hiçbiri zararlı olduğu anlamına gelmez ama soruyu hak eden davranışlardır. Büyük ekipler bunu otomatikleştirir: değişiklik öncesi derlemelerde bağımlılık davranışı karşılaştırılır, sürüm farkları tek tek listelenir, ağ trafiği beklenmedik bir ucu varsa işaretlenir.

Bunların hepsini tek seferde yapın demiyorum; sırayı öneriyorum. Kritik bir açık, hiç değil; yüksek olan, hafta sonundan önce; diğerleri, sıradan bakım penceresine. Unutulmamalıdır ki bağımlılık güncellemesi, yeni özellik geliştirmenin rakibi değil, onu koruyan sigortadır. Sigortasız çalışmak mümkündür; ama kazaya kadar. Kilit dosyası, düzenli gözden geçirme ve otomatik denetim üçlüsü, günlük geliştirme ritmini bozmadan zinciri sağlamlaştırır.

Tedarik zinciri güvenliği, yazılım geliştirmenin yeni bir vergisidir ve kimsenin lehine istisnası yoktur. Ödeyen herkes kazanır: bir dakikalık alışkanlıklar, saatler süren olay müdahalelerinden ucuzdur. Unutmayın, saldırgan sizin kodunuza değil, sizin seçtiğiniz kapıya bakıyor; kapıları iyi seçin.