Dependency Confusion Saldırısı Nedir?
Dependency confusion, yazılım tedarik zincirinde özel paket isimlerinin açık kaynak depolarına yüklenerek sistemin zararlı kodu çekmeye zorlandığı bir siber saldırı türüdür.

İÇİNDEKİLER
%0 okundu
- Dependency Confusion (Bağımlılık Karmaşası) Nedir?
- Bir Tedarik Zinciri Tehdidi: Dependency Confusion Nasıl Çalışır?
- Kurumsal Ekosistemler İçin Yarattığı Siber Güvenlik Riskleri
- Hedefteki Başlıca Paket Yöneticileri ve Geliştirme Ortamları
- Gerçek Dünya Vakaları: Zafiyetin Ortaya Çıkışı
- Kurumlar İçin Proaktif Dependency Confusion Korunma Stratejileri
- DevSecOps ve Sürekli Güvenlik Entegrasyonu
- Güvenli ve Dirençli Bir Yazılım Tedarik Zinciri İnşa Etmek
Dependency confusion, yazılım tedarik zincirinde özel paket isimlerinin açık kaynak depolarına yüklenerek sistemin zararlı kodu çekmeye zorlandığı bir siber saldırı türüdür.
Modern yazılım geliştirme süreçlerinde şirketler, kendi iç ihtiyaçları için geliştirdikleri özel (private) kütüphaneler ile açık kaynaklı genel (public) paketleri birlikte kullanır. Dependency Confusion Saldırısı Nedir sorusunun temel yanıtı; geliştiricilerin veya CI/CD boru hatlarının paket yöneticisi yapılandırmalarındaki öncelik hatalarını suistimal ederek, şirket içi özel kütüphaneler yerine harici saldırganlar tarafından genel depolara yüklenen daha yüksek sürümlü zararlı paketlerin indirilmesini sağlayan bir tedarik zinciri saldırısı (supply chain attack) mekanizmasıdır. Bu rehber, işletme sahipleri, bilgi güvenliği yöneticileri ve yazılım mimarları için zafiyetin teknik işleyişini, yarattığı kurumsal riskleri ve uçtan uca savunma stratejilerini ele almaktadır.
Dependency Confusion (Bağımlılık Karmaşası) Nedir?
Dependency confusion (bağımlılık karmaşası) ya da diğer adıyla isim alanı karışıklığı (namespace confusion), yazılım projelerinde kullanılan paket yöneticilerinin (package managers) dahili ve harici kütüphaneleri ayırt etme biçimindeki mantıksal bir tasarım zafiyetidir. Kurumsal yazılım mimarilerinde ekipler, harici dünyaya kapalı olan özel kütüphaneler (örneğin şirket içi kimlik doğrulama, loglama veya veri tabanı adaptörleri) geliştirir ve bunları şirket içi özel kayıt defterlerinde (private registry) barındırır. Aynı zamanda proje, açık kaynak topluluğunun sunduğu standart kütüphaneleri de genel kayıt defterlerinden (public registry) indirir.
Bu saldırı vektöründe siber saldırganlar, hedef şirketin dahili projelerinde kullandığı özel paket isimlerini keşfeder. Ardından, NPM, PyPI veya RubyGems gibi halka açık genel depolarda bu özel paketle birebir aynı ada sahip zararlı bir paket oluşturur. Açık depoya yüklenen bu zararlı paketin sürüm numarası (örneğin @@CODE0@@), şirketin kendi deposundaki mevcut sürümden (örneğin @@CODE1@@) kasten çok daha yüksek tutulur. Paket yöneticisi her iki depoyu da tarayacak şekilde yapılandırılmışsa, varsayılan sürüm çözümleme algoritması en yüksek sürümü tercih eder ve şirket kod tabanına saldırganın kötü amaçlı yazılımını (malware / malicious code) dahil eder.
Geleneksel yazılım güvenliği yaklaşımları genellikle bilinen güvenlik açıkları (CVE) veya kod kalitesi üzerine yoğunlaşırken, dependency confusion doğrudan geliştirme ve derleme ortamlarının bağımlılık çözümleme mantığına odaklanır. Kod incelemeleri (code review) veya statik analiz araçları bazen bu durumu yakalayamaz; çünkü kaynak kodda belirtilen bağımlılık ismi meşrudur, ancak derleme anında çekilen ikili dosya veya betik dış kaynaktan gelmektedir. Bu durum, zafiyeti modern yazılım tedarik zinciri güvenliği (software supply chain security) alanındaki en kritik tehditlerden biri haline getirir.
Bir Tedarik Zinciri Tehdidi: Dependency Confusion Nasıl Çalışır?
Dependency confusion saldırısının teknik temeli, paket yöneticilerinin birden fazla kaynak tanımlandığında izlediği öncelik sırası ve sürüm kontrol algoritmalarına dayanır. Sürecin derinlemesine anlaşılması için özel-genel depo çatışması, semantik sürümleme istismarı ve sistemin zararlı kodu çalıştırma adımlarının ayrı ayrı incelenmesi gerekir.
Özel (Internal) ve Genel (Public) Paket Depoları Arasındaki Çatışma
Kurumsal yazılım geliştirme ortamlarında birden fazla paket kaynağı tanımlamak yaygın bir pratiktir. Örneğin bir Node.js projesinde geliştirici hem genel @@CODE0@@ adresinden kütüphane çeker hem de şirketin iç ağında barınan @@CODE1@@ adresini kullanır. Paket yöneticileri (NPM, Pip, Bundler vb.), bir paketi ararken her iki depoya da eşzamanlı veya ardışık sorgular gönderir.
Birçok paket yöneticisinin varsayılan davranışı, paketin hangi depodan geldiğine bakılmaksızın, bulunan en yüksek sürümü indirmektir. Genel depo ile özel depo arasında açık bir kapsam (scope) veya isim alanı (namespace) ayrımı tanımlanmadığında, paket yöneticisi hangi kaynağın güvenilir olduğunu bilemez. Bu belirsizlik, dışarıdan kontrol edilen genel deponun şirket içi deponun önüne geçmesine zemin hazırlar.
Sürüm Numaralandırma (Versioning) Zafiyetinin İstismarı
Çoğu modern paket ekosistemi Semantik Sürümleme (SemVer: @@CODE0@@) prensibini kullanır. Proje bağımlılık dosyalarında (örneğin @@CODE1@@, @@CODE2@@ veya @@CODE3@@) bağımlılıklar genellikle sabit bir sürüm yerine esnek aralıklarla tanımlanır:
NPM:
^1.2.0(1.x.x altındaki en güncel yamayı çek)Pip:
company-lib>=1.0.0(1.0.0 veya daha yeni herhangi bir sürümü çek)
Saldırgan, özel kütüphanenin adını tespit ettikten sonra genel kayıt defterine @@CODE0@@ adıyla @@CODE1@@ sürümünü yükler. Proje derlendiğinde veya bir geliştirici @@CODE2@@ / @@CODE3@@ komutunu çalıştırdığında, paket yöneticisi @@CODE4@@ sürümünün mevcut yerel @@CODE5@@ sürümünden daha yeni olduğunu varsayar. Katı bir kısıtlama bulunmadığı için paket yöneticisi genel depodaki zararlı sürümü otomatik olarak projeye dahil eder.
Sistemin Zararlı Kodu Çekmeye Zorlanma Süreci
Zararlı paketin indirilmesi tek başına yeterli değildir; asıl tehlike paketin kurulum anında çalıştırdığı betiklerden (pre-install / post-install scripts) kaynaklanır. Paket yöneticileri, kütüphanelerin sistem üzerinde derlenebilmesi için paket yüklendiği anda otomatik komut çalıştırma mekanizmalarına sahiptir.
Kurumsal Ekosistemler İçin Yarattığı Siber Güvenlik Riskleri
Dependency confusion saldırısı basit bir içerik değiştirme eylemi değildir; doğrudan geliştirici makinelerini, sürekli entegrasyon/sürekli dağıtım (CI/CD) sunucularını ve dolayısıyla üretim ortamlarını hedefleyen yüksek seviyeli bir siber güvenlik zafiyetidir.
Fikri Mülkiyet Hırsızlığı ve Kurumsal Veri İhlalleri
CI/CD sunucuları ve geliştirici iş istasyonları, şirketlerin en kritik sırlarını barındırır. Bu ortamlarda ortam değişkenleri (environment variables), API anahtarları, bulut sağlayıcı erişim belirteçleri (AWS, GCP, Azure token'ları), veri tabanı şifreleri ve kaynak kod depolarına erişim sağlayan SSH anahtarları bulunur.
Zararlı paket kurulum betiği çalıştığı anda şu işlemleri gerçekleştirebilir:
Sistemdeki tüm ortam değişkenlerini okuyup saldırganın kontrolündeki bir C2 (Command and Control) sunucusuna gönderme (exfiltration).
/etc/passwd, SSH anahtarları ve yerel yapılandırma dosyalarını dışarı sızdırma.Dahili kaynak kodları ve şirket içi fikri mülkiyeti saldırganın sunucularına kopyalama.
Üçüncü Taraf (Third-Party) Yazılımlar Üzerinden İç Ağlara Sızma
Geliştiricilerin iş istasyonları veya şirket içi derleme sunucuları genellikle kurumsal VPN'ler ve iç ağ segmentleri ile doğrudan bağlantılıdır. Dependency confusion ile derleme sunucusuna yerleşen bir saldırgan, bu sunucuyu bir atlama tahtası (pivot point) olarak kullanarak şirket içi ağlarda yatayda ilerleme (lateral movement) gerçekleştirebilir. Bu durum, dışarıdan doğrudan erişilemeyen iç veri tabanlarının, yönetim panellerinin ve intranet sistemlerinin ele geçirilmesine yol açar.
Müşteri Güven Kaybı ve Regülasyon İhlalleri (KVKK/GDPR)
Eğer saldırıya uğrayan yazılım son kullanıcılara veya kurumsal müşterilere dağıtılan bir ürünse (örneğin bir SaaS platformu veya mobil uygulama), saldırgan doğrudan son kullanıcı verilerine erişebilir. Müşteri veri tabanlarının sızdırılması; Kişisel Verilerin Korunması Kanunu (KVKK), Genel Veri Koruma Tüzüğü (GDPR) ve ISO 27001 gibi standartlar kapsamında ağır idari para cezalarına, yasal yaptırımlara ve telafisi zor itibar kayıplarına neden olur.
Hedefteki Başlıca Paket Yöneticileri ve Geliştirme Ortamları
Dependency confusion saldırısı belirli bir programlama diline özgü değildir; birden fazla depo kaynağını destekleyen ve varsayılan olarak sürüm önceliği uygulayan hemen hemen tüm paket yöneticilerinde görülebilir.
Node.js Ekosistemi (NPM)
Node.js projelerinde NPM, paketleri hem genel @@CODE0@@ üzerinden hem de özel Nexus/Artifactory gibi depolardan çözebilir. NPM'de isim alanı (scoped packages: @@CODE1@@) kullanılmadığı durumlarda, paket yöneticisi hem özel depoya hem de genel depoya sorgu atar. NPM'in varsayılan paket çözümleme mantığı, belirtilen sürüm aralığına uyan en yüksek sürümü genel depodan çekmeye meyillidir. Ayrıca @@CODE2@@ içindeki @@CODE3@@ ve postinstall kancaları, kod yürütmeyi aşırı derecede kolaylaştırır.
Python Ortamları (PyPI)
Python ekosisteminde @@CODE0@@ aracı paket kurulumunda kullanılır. Geçmişte ve birçok mevcut yapılandırmada geliştiriciler birden fazla kaynak belirtmek için @@CODE1@@ parametresini kullanır:
pip install --index-url https://pypi.sirket.com/simple/ --extra-index-url https://pypi.org/simple/ company-internal-pkgBu yapılandırmada Pip, her iki dizini de paralel olarak tarar. Eğer @@CODE0@@ (genel) üzerinde daha yüksek bir sürüm varsa, Pip şirket içi depoyu tamamen görmezden gelerek harici depodaki paketi yükler. Python paketlerindeki @@CODE1@@ dosyası kurulum sırasında rastgele Python kodu çalıştırabildiği için anında sistem erişimi sağlanır.
Ruby Uygulamaları (RubyGems)
Ruby projelerinde @@CODE0@@ içerisinde birden fazla @@CODE1@@ tanımlandığında benzer bir zafiyet ortaya çıkar. Eğer @@CODE2@@ ile birlikte genel @@CODE3@@ en üstte genel olarak tanımlanmışsa ve blok bazlı (source do ... end) izolasyon yapılmamışsa, Bundler kütüphaneyi bulduğu en yüksek sürüm kaynağından indirir.
Gerçek Dünya Vakaları: Zafiyetin Ortaya Çıkışı
Dependency confusion kavramı teorik bir risk olmaktan çıkıp küresel bir güvenlik gündemi haline 2021 yılının başlarında güvenlik araştırmacısı Alex Birsan'ın yayımladığı çalışma ile gelmiştir.
2021 Yılındaki Kritik Araştırma ve Büyük Teknoloji Şirketlerinin Etkilenmesi
Alex Birsan, büyük ölçekli şirketlerin açık kaynak kodlu depolarını, sızdırılmış JavaScript dosyalarını ve halka açık manifesto belgelerini tarayarak Apple, Microsoft, PayPal, Shopify, Netflix, Tesla ve Uber gibi dev teknoloji firmalarının dahili paket isimlerini tespit etti.
Araştırmacı, bu isimlerle NPM, PyPI ve RubyGems depolarında zararlı olmayan ancak sisteme ulaştığında DNS sorgusu göndererek çalıştığını kanıtlayan (benign callback) paketler yayınladı. Sonuçlar sarsıcıydı:
Onlarca büyük teknoloji firmasının CI/CD sistemleri ve geliştirici bilgisayarları, harici depolara yüklenen bu yüksek sürümlü test paketlerini otomatik olarak indirdi ve çalıştırdı.
Araştırmacı, şirketlerin iç ağlarından binlerce geri bildirim (callback) aldı ve bu çalışma sonucunda rekor seviyede hata ödülü (bug bounty) kazandı.
Olayın ardından Microsoft, NPM ve Python Software Foundation (PSF) gibi yapılar bağımlılık çözümleme ve depolama mekanizmalarında acil güvenlik kılavuzları yayınlamak zorunda kaldı.
Bu vaka, yazılım dünyasında "şirket içi paket adının gizli kalacağına güvenmek" (security through obscurity) yaklaşımının ne kadar tehlikeli olduğunu kesin bir biçimde ortaya koydu.
Kurumlar İçin Proaktif Dependency Confusion Korunma Stratejileri
Dependency confusion saldırılarına karşı korunmak tek bir ayarla mümkün değildir; paket yönetimi, altyapı mimarisi ve geliştirme pratiklerini içeren çok katmanlı bir savunma yaklaşımı gerektirir.
Özel Paket İsimlerini Açık Kaynak Depolarında Rezerve Etme (Squatting)
Şirket içi kullanılan tüm özel paket adlarının genel depolarda (NPM, PyPI vb.) boşta bırakılmaması gerekir. Savunma amaçlı paket rezervasyonu (defensive package squatting) yaparak, şirket adına genel depolarda boş veya sahte işlevsiz paketler yayınlanabilir. Ancak bu yöntem yüzlerce özel paketi olan büyük yapılar için sürdürülebilir bir ana savunma hattı değildir; sadece tamamlayıcı bir tedbirdir. Asıl çözüm isim alanlarının rezerve edilmesidir.
Paket Yöneticisi Yapılandırmalarında Sıkılaştırma (Strict Configuration)
Paket yöneticilerinin harici kaynaklara kontrolsüzce erişmesi engellenmelidir:
Kapsam (Scoped Packages) Kullanımı: NPM ekosisteminde tüm dahili paketler @@CODE0@@ formatında tanımlanmalı ve @@CODE1@@ kapsamı sadece şirketin özel kayıt defterine yönlendirilmelidir.
Desen Eşleme (Package Source Mapping): NuGet (.NET) gibi modern araçlarda hangi paketin hangi kaynaktan indirileceği açıkça kural setleriyle (
nuget.config) belirlenmelidir.Pip
--extra-index-urlKullanımının Terk Edilmesi: Pip yapılandırmalarında doğrudan iki depo tanımlamak yerine, tüm trafiği yöneten tek bir şirket içi proxy depo kullanılmalıdır.
Bütünlük (Integrity) Doğrulaması ve Sürüm Sabitleme (Pinning)
Projelerde esnek sürüm tanımlamaları (@@CODE0@@, @@CODE1@@, @@CODE2@@) yerine tam sürüm sabitleme (strict dependency pinning) tercih edilmelidir. Bununla birlikte kilit dosyaları (lock files: @@CODE3@@, @@CODE4@@, @@CODE5@@, Gemfile.lock) mutlaka kaynak kontrol sistemine (Git) dahil edilmelidir. Kilit dosyaları, paketin hash (bütünlük doğrulaması) değerini saklar; sürüm genel depoda yükselse bile hash değeri uyuşmayacağı için derleme iptal edilir.
Şirket İçi (On-Premise) Repository Kullanımı ve Erişim Kontrolleri
Nexus, JFrog Artifactory veya AWS CodeArtifact gibi kurumsal ikili depo yöneticileri (binary artifact managers) kullanılmalıdır. Bu sistemler "Virtual Repository" mantığıyla yapılandırıldığında:
Şirket içi paket adı genel depodan çekilmeye çalışıldığında istek filtrelenir ve engellenir.
Dış dünyaya giden bağımlılık istekleri tek bir merkezden denetlenir ve kayıt altına alınır.
DevSecOps ve Sürekli Güvenlik Entegrasyonu
Yazılım geliştirme yaşam döngüsü (SDLC) boyunca güvenliği en başa almak (Shift-Left Security), dependency confusion gibi tedarik zinciri açıklarının üretim ortamlarına sızmasını engellemenin en etkili yoludur.
SDLC İçinde Otomatize Edilmiş Güvenlik Taramaları
Modern DevSecOps süreçlerinde derleme (build) aşamasından önce şu kontroller otomatik olarak devreye sokulmalıdır:
Yazılım Malzeme Listesi (SBOM - Software Bill of Materials): Her derleme çıktısı için kullanılan tüm açık kaynak ve özel bağımlılıkların dökümünü içeren SBOM standartları (CycloneDX, SPDX) üretilmeli ve arşivlenmelidir.
SCA (Software Composition Analysis) Araçları: Snyk, Sonatype Nexus Lifecycle veya Mend gibi SCA araçları CI/CD sürecine entegre edilerek projeye dahil edilen paketlerin kaynak orijinalliği denetlenmelidir.
CI/CD Ortam İzolasyonu: Derleme ajanlarının (build agents) internet erişimi yalnızca onaylı şirket içi proxy sunucuları ile sınırlandırılmalı, kontrolsüz genel internet çıkışları engellenmelidir.
Güvenli ve Dirençli Bir Yazılım Tedarik Zinciri İnşa Etmek
Yazılım tedarik zinciri güvenliği, geleneksel ağ ve sunucu güvenliği kadar hayati bir kurumsal risk yönetimi alanıdır. Dependency confusion saldırıları, sistemlerin doğrudan kırılmasıyla değil, geliştirme ortamlarının ve araçlarının tasarım özelliklerinin akıllıca kötüye kullanılmasıyla gerçekleşir. Bu nedenle işletmelerin güvenlik stratejilerini sadece harici tehditlere karşı bir duvar örmekle sınırlandırmayıp, yazılım geliştirme hatlarının her bir bileşenini sıfır güven (Zero Trust) prensibiyle yeniden yapılandırması gerekir.
Kurumların alması gereken temel aksiyonlar; şirket içi paketlerin isim alanı izolasyonunu sağlamak, semantik sürümleme risklerine karşı katı kilit dosyaları ve hash kontrolleri uygulamak, harici depo erişimlerini kurumsal proxy'ler üzerinden filtrelemek ve DevSecOps prensiplerini SDLC'nin ayrılmaz bir parçası haline getirmektir. Bu proaktif adımlar, hem fikri mülkiyetin ve hassas verilerin korunmasını sağlar hem de regülasyon uyumluluğunu güvence altına alarak işletmenin dijital varlıklarını sürdürülebilir biçimde korur.
Sıkça Sorulan Sorular
Dependency confusion saldırısı ile typosquatting arasındaki fark nedir?
Typosquatting saldırısında saldırgan popüler bir açık kaynak paketin adını yanlış yazarak (örneğin lodas-js ) kullanıcı hatasını hedeflerken, dependency confusion saldırısında şirketin gerçek özel paket adı birebir kullanılarak paket yöneticisinin sürüm mantığı suistimal edilir.
Dependency confusion için saldırganın şirket içi kaynak koda erişmesi gerekir mi?
Hayır, saldırganın şirket ağına veya kaynak koda erişmesi gerekmez. Şirket içi paket adının açık kaynak kodlardan, sızan yapılandırma dosyalarından veya derlenmiş JavaScript kaynak haritalarından (source maps) öğrenilmesi saldırıyı başlatmak için yeterlidir.
Sadece kilit dosyası (lockfile) kullanmak dependency confusion saldırısını tamamen engeller mi?
Kilit dosyaları mevcut projeler için hash doğrulaması yaparak koruma sağlar; ancak yeni bir bağımlılık eklendiğinde veya kilit dosyası güncellendiğinde paket yöneticisi yine yüksek sürümlü zararlı paketi çekebilir. Bu nedenle kilit dosyaları tek başına yetersizdir, depo yapılandırması sıkılaştırılmalıdır.
NPM ekosisteminde dependency confusion saldırısından nasıl korunulur?
Tüm şirket içi paketler için kapsamlı isim alanı (@@CODE 0@@) kullanılmalı ve @@CODE 1@@ dosyasında bu kapsamın yalnızca şirketin özel kayıt defterinden çekileceği açıkça tanımlanmalıdır.
Python Pip kullanıcıları bu saldırıdan nasıl kaçınabilir?
Pip komutlarında @@CODE 0@@ kullanımı terk edilmeli; bunun yerine tüm genel ve özel paketleri denetleyen tek bir kurumsal proxy depo adresi (@@CODE 1@@) yapılandırılmalıdır.
Dependency confusion bir uzaktan kod yürütme (RCE) zafiyeti midir?
Evet, paket yöneticileri paket kurulumu sırasında derleme ve hazırlık betiklerini (@@CODE 0@@, @@CODE 1@@ vb.) otomatik olarak çalıştırdığı için saldırgan hedef sistem üzerinde doğrudan uzaktan kod yürütme yetkisi elde eder.
Kurumsal artifact yöneticileri (Nexus, Artifactory) bu saldırıyı önleyebilir mi?
Evet, doğru yapılandırıldığında bu araçlar genel depolardan gelen sorguları filtreleyerek şirket içi paket adlarıyla eşleşen harici talepleri engelleyebilir ve bağımlılık trafiğini güvenli şekilde izole edebilir.
Dependency confusion saldırısı hangi regülasyonları doğrudan ilgilendirir?
CI/CD ortamlarından müşteri verilerinin veya sistem anahtarlarının sızmasına yol açabildiği için doğrudan KVKK, GDPR, PCI-DSS ve ISO 27001 gibi veri koruma ve bilgi güvenliği standartları kapsamında ağır yaptırımlara tabidir.