· kaynak dev.to (home feed)
npm typosquatting ve dependency confusion nasıl CVE tarayıcılarının radarından kaçıyor
Bir dev.to açıklaması, kod hataları yerine paket adı çözümlemesini istismar eden iki tedarik zinciri saldırısı olan typosquatting ve dependency confusion ile bunları engelleyen tespit sinyallerini ve registry ayarlarını ele alıyor.

JavaScript geliştiricilerine yönelik tedarik zinciri saldırıları her zaman sömürülebilir bir hata gerektirmez. dev.to'da yayımlanan bir yazı, kodun kendisindeki bir kusur yerine paket yöneticilerinin adları çözümleme biçimini istismar eden iki saldırı sınıfını — typosquatting ve dependency confusion — açıklıyor; CVE veritabanları etrafında kurulan tarayıcıların tam da bu yüzden bunları gözden kaçırdığını ortaya koyuyor.
Yazı, bu tekniğin en bilinen gösterimiyle başlıyor. Şubat 2021'de güvenlik araştırmacısı Alex Birsan, Apple, Microsoft, PayPal, Shopify ve 32 şirketi daha hedef alarak kötü niyetli paketleri bu şirketlerin iç build sistemlerine nasıl taşıdığını anlatan bir yazı yayımladı. Hiçbir sunucuyu ele geçirmemiş, bilinen hiçbir açığı istismar etmemiş ve hiçbir kimlik avı e-postası göndermemişti; yalnızca bu şirketlerin bağımlı olduğu iç paketlerin adlarıyla eşleşen paketleri npm, PyPI ve RubyGems'e yayımladı ve build araçları onların herkese açık sürümlerini otomatik olarak kurdu.
Typosquatting klavyeyi hedefler
Typosquatting, geliştiricilerin paket adlarını elle yazması gerçeğinden yararlanır. Saldırgan, expresss gibi — fazladan tek harfli — bir ad kaydeder ve kurulum sırasında bu hatayı yapan herkes saldırganın kodunu indirir. Paketi makul bir README ve birkaç yüz bot kaynaklı haftalık indirmeyle süsleyin çevreye kolayca karışır. Yük genellikle bir postinstall script içinde bulunur; npm bunu kurulum sırasında, daha kimse kodu okuma şansı bulmadan çalıştırır. Böyle bir script, API anahtarı ve token yüklü ortam değişkenlerini okuyabilir, kalıcı arka kapılar yerleştirebilir veya node_modules içinde zaten mevcut diğer paketleri değiştirebilir.
dev.to yazısı, npm tarihindeki gerçek olaylara dikkat çekiyor: crossenv (ortam değişkenlerini toplayan cross-env taklidi), getcookies (tarayıcı çerezlerini dışarı sızdıran), loadsh (lodash'a çok yakın), reqeusts ve reqests ise Python'ın requests kütüphanesinin türevleri.
Dependency confusion registry'yi hedefler
Dependency confusion farklı bir mantık hatasında çalışır. Şirketler yaygın olarak herkese açık registry'nin yanı sıra özel bir npm registry — Artifactory, Nexus veya GitHub Packages — çalıştırır ve tipik yapılandırmalar, özel registry'de olmayan bir paket için herkese açık registry'ye düşer ya da daha yüksek sürüm numarasına sahip kopyayı seçer. Bir iç paket adını — çoğunlukla iş ilanlarından, sızdırılmış yapılandırma dosyalarından veya hata mesajlarından — öğrenen saldırgan, o ad altında 99.0.0 gibi şişirilmiş bir sürümle herkese açık bir paket yayımlar ve build sistemlerinin onu tercih etmesini bekler.
Yazının önerdiği çözüm, tüm iç paketleri özel bir scope altına koymak (örneğin internal-lib yerine @company/internal-lib) ve registry'yi, scope'lu paketlerin yalnızca özel registry'den çözülmesi şekilde yapılandırmaktır. Bu bilinçli bir yapılandırma işidir ve yazar, birçok ekibin buna hiç vakit ayırmadığını belirtiyor.
Herhangi bir CVE'den önce gelen sinyaller
İki saldırı da yayımlanmış bir paketteki bir açığı içermediğinden, eşleştirilecek bir CVE yoktur. Yazıya göre bunun yerine önemli olan göstergeler şunlardır:
- lodash, express veya react'tan bir tuş vuruşu uzakta duran ve yerleşik bir yayım geçmişi olmayan bağımlılıkları işaretleyen düzenleme mesafesi kontrolleri (Levenshtein veya Damerau-Levenshtein).
- Meşru paketlerin nadiren ihtiyaç duyduğu install script'leri; postinstall script taşıyan yeni ve bilinmeyen bir paket incelemeyi hak eder.
- Yenilik ve maintainer sinyalleri — popüler bir adı taklit eden, birkaç gün önce yayımlanmış ve hiç bağımlılığı olmayan bir paket neredeyse kesinlikle kötü niyetlidir ya da bir testtir; yerleşik bir pakette maintainer değişimi ise XZ Utils arka kapı mekanizmasını yankılar.
- 1.0.4'ten 99.0.0'a sıçrama gibi sürüm anomalileri — klasik bir dependency confusion parmak izi.
Yazarın kendi aracı DepWarden, her ekosistemdeki en popüler paketlerin özenle derlenmiş bir listesiyle Damerau-Levenshtein karşılaştırması uygular ve şüpheli bir paketin benzediği paketi adlandıran yüksek öneme sahip bir tedarik zinciri bulgusu ortaya koyar. Ayrıca OpenSSF Scorecard ve tedarik zinciri metaverilerinden aldığı install script'leri, maintainer değişikliklerini ve sürüm anomalilerini görünür kılar. Yazı, en popüler 30 npm ve PyPI paket adının her tek karakterli varyantını canlı registry'lerde kontrol eden ve bulguları OSV'nin kötü niyetli paket veritabanıyla çapraz eşleyen eşlik eden bir analizle bitiyor.
Neden önemli
Her iki saldırı sınıfı da bir CVE kaydedilmeden — hiç kaydedilirse — çalışır. Taklit bir paket CVE kazandığında, postinstall script'i zaten geliştirici makinelerinde ve CI runner'larında çalışmış olur. Bu, savunma yükünü açık veri tabanlarının yukarısına kaydırır: kurmadan önce adları doğrulayın, iç paketleri özel bir scope arkasına kilitleyin ve install script'leri, maintainer değişimlerini ve tuhaf sürüm sıçramalarını gürültü değil birinci sınıf bulgular olarak değerlendirin.
- #npm
- #supply-chain-security
- #javascript
- #package-management
- #security
İlgili yazılar
- docker grubu kullanıcılara neden root yetkisi verir ve rootless container'lar bunu nasıl önler
- React 19.3, View Transitions ve Fragment Refs özelliklerini kararlı hale getiriyor
- Dify'nin XLS ayrıştırıcısındaki tırnak kaçış hatası, hazırlanmış hücrelerin CSV satır ve sütunları enjekte etmesine izin veriyordu