Yayınlamadan Önce Her Geliştirici'nin Kontrol Etmesi Gereken APM Güvenlik Denetim Listesi
npm Paketleri Yayınlamadan Önce Yapılması Gereken Güvenlik Kontrolleri
npm ekosisteminde kod yayınlamak demek, potansiyel olarak binlerce uygulamaya erişim sağlamak demek. Bu da elbette tehdit aktörlerinin ilgisini çekiyor. Sadece kimlik bilgileri çalmak değil, yapı sürecinde yüksek yetkilerle çalışan ortamlara yerleşmek istiyorlar. İyi haber şu: çoğu saldırı planlı bir yaklaşımla ve doğru araçlarla engellenebilir.
Neden Yayınlamadan Önce Güvenlik İncelemesi Gerekli?
npm paketleri bir yanda JavaScript'in en güçlü yanlarından biri, diğer yanda en savunmasız noktalarından biri. Tek bir paket yüzbinlerce proje içine girip kur olabilir. Bu erişim alanı saldırganlar için altın değerinde. Özellikle CI/CD ortamlarında çalıştığında, iş değiştiri.
npm Paketlerini Tehdit Eden 12 Ana Saldırı Vektörü
1. Hesap Ele Geçirilmesi ve Kötü Amaçlı Yayın
Kâbusun adı: birisi senin npm hesabını ele geçirip arka kapı içeren bir sürüm yayınlıyor. Kullanıcılar otomatik olarak yüklüyor, canlı ortamda kötü amaçlı kod çalışıyor.
Korunma yolları:
- npm hesabında 2FA açmak (zorunlu)
- Ana şifresi yerine kısıtlı erişim belirteçleri kullanmak
- Hassas paketler için yayın onayı sistemi kurmak
- Yayın kayıtlarını düzenli kontrol etmek
2. Yaşam Döngüsü Kancaları: Kurulum = Kod Çalıştırma
preinstall, postinstall gibi kancalar npm'de kullanılabiliyor. Saldırgan paket denetimini ele geçirirse, gerçek kodunuz yüklenene dahi bitmeden keyfi bir kodun çalışmasını sağlayabilir.
Azaltma stratejisi:
- package.json dosyasındaki her kancayı gözden geçirmek
- Kurulum sırasında gerçekten kod çalıştırmanız gerekip gerekmediğini sorgulamak
- Eğer zorunluysa, şeffaf ve minimal tutmak
- Yapı aşamasında alternatif çözümleri tercih etmek
3. Kendi Kendini Çoğaltan npm Solucanları
Paket node_modules içindeki diğer paketleri değiştirerek kötü amaçlı kodu tüm ağaca yaysa nasıl olurdu? İşte bu vektör: kendi kendini çoğaltan saldırılar.
Koruma yöntemi:
- Kurulum sırasında dosya sistemi üzerinde değişiklik yapmamak
- Başka paketlerin koduna dokunmamak
- Bağımlılıkları izole tutmak
- npm audit ve bağımlılık taramasını rutin hale getirmek
4. CI/CD Kimlik Tabakası Saldırıları
CI/CD işlem hattında dağıtım tokenleri, kayıt defteri erişimi, GitHub anahtarları var. Bir paket bu işlem hattına girerse, saldırgan bu tüm kimlik katmanına erişim kazanır.
Çoklu savunma:
- Her CI/CD adımı için en düşük yetkiye sahip tokenleri kullanmak
- Tokenleri sık sık yenilemek
- package.json dosyasındaki script'lere asla sırları yazmamak
- OpenID Connect gibi çözümleri değerlendirmek
- Yayın sırlarına kimlerin erişebildiğini denetlemek
5. Git Tabanlı Bağımlılık Kaçakçılığı
Git depoları aracılığıyla direkt kurulum, npm'nin güvenlik kontrollerini atlatır. Saldırgan sahte bir fork barındırıp kullanıcıları buradan kuruma ikna edebilir.
Karşı önlemler:
- Bağımlılıkları Git değil npm kayıt defteri sürümlerine sabitleme
- Git bağımlılığı gerekiyorsa commit hash'ini doğrulama
- Güvenilmeyen kaynaklardan
latestveya dal referanslarını kullanmama - Her Git bağımlılığının nedenini belgeleyebilme
6. Çalışma Zamanında Dinamik Bağımlılıklar
Bazı paketler çalışırken kod indirir ve çalıştırır. Bu görünmeyen bir tehdit ortamı oluşturur; paketiniz potansiyel kötü amaçlı yüklerin sadece yükleyicisi olur.
İyi uygulama:
- Tüm bağımlılıklar package.json dosyasında statik tanımlanmalı
- Asla dinamik kod çalıştırılmamalı
- Dinamik require'leri tespit etmek için statik analiz araçları kullanmak
- Esneklik gerekiyorsa kod çalıştırma olmadan tasarlaması
7. Kimlik Avı Altyapısı Açık Göz Önünde
Saldırganlar npm'nin barındırma alanını kullanıp sahte giriş sayfaları ve kimlik bilgisi toplama sistemi kuruyor. Paket meşru görünüyor ancak arka planda sahte sayfaya yönlendiriyor.
Kullanıcıları koruma:
- Paketinizin ne yaptığını açık söylemek
- Resmi alanlarını ve dokümanları belirtmek
- Bağlantılı web sayfalarında CSP başlıkları uygulamak
- Paket adınızın yazım hatası versiyonlarını izlemek
- Kuşkulu paketleri hemen npm'ye bildirmek
8. Kimlik Bilgisi ve Sır Hasadı
Arka kapılı paket ortam değişkenlerini, API anahtarlarını, tokenleri çalabilir. Kurulum sırasında .env dosyalarını, Docker ayarlarını veya CI/CD değişkenlerini okuyabilir.
Sertleştirme:
- Sırlara versiyon kontrolünde yer vermemek
- Sır yönetim sistemleri kullanmak
- Kimlik bilgileri için en düşük yetki prensibini uygulamak
- Paketinizin hangi ortam verilerine eriştiğini denetlemek
- Hassas bilgileri loglamamak
9. Veri Çıkartma ve Gizli İletişim Kanalları
Çalınan verinin bir yerde olması gerekir. Saldırganlar DNS sorgularını, resim isteklerini, gizlenmiş API çağrılarını kullanarak veriyi fark edilmeden sızdırıyor.
Tespit ve önleme:
- Paketlerin giden bağlantılarını izlemek
- Kurulum öncesi davranış analiz eden araçlar kullanmak
- Ağ çıkışı kontrolleri uygulamak
- Paketinizin yapacağı harici çağrıları sorgulamak
- Tüm ağ bağımlılıklarını belgelemek
10. Kalıcılık ve Gözden Kaçırma Teknikleri
İleri saldırılar tek bir kez veri çalmakla kalmaz; sistem dosyalarını, cron işlerini, ortam yapılandırmasını değiştirerek ilk bulaşın ötesinde kalıcılık sağlarlar.
Savunma stratejisi:
- Kurulum sonrası dosya sistemi değişikliklerini gözden geçirmek
- Üretimde dosya bütünlüğü izlemesi uygulamak
- Paket kurulum kayıtlarını immutable formatta tutmak
- Konteynerizasyonla kalıcılık vektörlerini sınırlandırmak
- Mümkünse salt okunur dosya sistemleri kullanmak
11. Karmaşıklaştırma ve Yük Paketlemesi
Kod okunamazsa güvenlik incelemesi imkânsızlaşır. Saldırganlar minification, encoding, şifreleme gibi yöntemlerle kötü amaçlı kodu gizliyorlar.
Kod inceleme en iyi uygulamaları:
- Kodunuzu okunabilir ve karmaşıklaştırılmamış tutmak
- Minify ediyorsan kaynak harita yayınlamak
- Kurulum kodunda gereksiz encoding/şifreleme yapmamak
- Denetim sırasında kod deşifreleme araçlarını kullanmak
- Unutma: meşru kod gizlenmeye ihtiyaç duymaz
12. Paket Adlandırması ve Keşif Suistimali
Yazım hatası avı, benzer isimler, kayıt defteri manipülasyonu paketleri yanlış kişilerin bulmasını sağlıyor. Saldırgan expresss yayınlayarak geliştiricilerin yazım hatasını bekliyorlar.
Koruma taktikleri:
- Paket adınızın yaygın yazım hatalarını kaydetmek
- Ad alanı tabanlı paket kullanarak çarpışma riskini düşürmek
- Resmi paket adını belirgin şekilde belgelemek
- Taklit paketleri izlemek
- npm'ye yazım hatası avlarını bildirmek
Yayınlamadan Önceki Kontrol Listesi
Yayını basarken bu kontroller yapılsın:
Güvenlik Kontrolleri:
- [ ] npm hesabında 2FA aktif
- [ ] package.json veya kodda sabit sırlar yok
- [ ] Gereksiz yaşam döngüsü kancaları minimize edilmiş
- [ ] Kurulum sırasında dinamik kod yükleme yok
- [ ] node_modules klasörü değiştirilmemiş
- [ ] Tüm bağımlılıklar npm kayıt defterinden sabitlenmiş
- [ ] Açıklanamayan harici çağrılar yok
- [ ] Kod okunabilir ve karmaşıklaştırılmamış
- [ ] Kötü amaçlı paket taraması yapılmış (socket.dev, snyk vb.)
- [ ] Güvenlik bilinci olan başka bir geliştirici incelemiş
- [ ] Yayın işlemi için denetim kaydı hazırlanmış
Süreç Kontrolleri:
- [ ] Değişim günlüğü yazılmış
- [ ] Güvenlik politikası tanımlanmış
- [ ] Bakıcı iletişim bilgisi eklemiş
- [ ] Lisans açıkça belirtmiş
- [ ] Depo bağlantısı doğrulanmış
- [ ] README paket amacını açıklamış
Daha Geniş Görüş: Güvenliği Başlangıçtan Düşünmek
En etkili savunma güvenliği geliştirme sürecine başlangıçtan dahil etmektir, son anda eklememektir:
- Saldırgan zihniyetiyle düşünmek: Paketinizde neyi hedef alırdınız?
- Taramaları otomatikleştirmek: Şüpheli kalıpları tespit eden araçlar kullanmak
- Güncel kalmak: npm güvenlik uyarılarını ve en iyi uygulamaları takip etmek
- Topluluk güvenini inşa etmek: Sürecin detaylarını açık tutmak
- İhlal olabileceğini varsaymak: Paketiniz tehlikeye girebileceğini düşünerek tasarlamak
Son Söz
npm ekosistemi güçlü çünkü erişilmesi kolay. Bu kolay erişim sorumluluk getiriyor. Yayınladığınız her paket önemli yetkilerle çalışır—kurulum sırasında devreye girer, dosya sistemine erişir, yapı sürecini değiştirebilir.
Güvenliği ciddiye alan, yayınlamadan önce kodlarını inceleyen ve bu önlemleri uygulayan geliştiriciler paranoid değil, ortak altyapının sorumlu bekçileridir.
Paketiniz önemlidir. Kullanıcılarının güvenliği bunu doğru yapmaya bağlıdır.