“İsmin nesi var? Gül dediğimiz şey
Başka bir isimle anılsa bu kadar tatlı kokardı.”
— Romeo ve Juliet, Perde 2, Sahne 2

Shakespeare 1596’da bu sözleri yazdığında ismin sadece bir gelenek olduğunu söylüyordu. İçsel bir anlamı yoktur. Juliet, Romeo’yu isminden dolayı değil, kişi olarak seviyor.

Ancak farkında olmadan bağımlılık karmaşası saldırılarını da anlatıyordu.

Bağımlılık karışıklığı, kodunuzda kullandığınız paketlerin size ait olmamasıdır. Aynı ada sahiptirler ancak üretimde çalışan kodunuz değildir. Aynı isim ama paketlerden biri gül gibi kokuyor, diğeri ise… kokuyor.

Son araştırma raporları, kuruluşların %41-49’unun bağımlılık karışıklığı saldırılarına karşı risk altında olduğunu tahmin ediyor. OX Security’nin yeni araştırması, bir kuruluşun bağımlılık karışıklığı saldırısı riski altında olduğunda varlıklarının %73’ünün savunmasız olduğunu gösteriyor. Araştırma, finans, oyun, teknoloji ve medya gibi geniş bir sektör yelpazesinde hem orta hem de büyük kuruluşlara (1 bin+, 8 bin+, 80 bin+ çalışan) odaklandı ve her ölçekteki kuruluşta her sektördeki riski buldu. Araştırma aynı zamanda bir milyardan fazla kullanıcıya sahip neredeyse tüm uygulamaların, bağımlılık karışıklığına açık olan bağımlılıklar kullandığını da ortaya çıkardı.

Bu makale, bağımlılık karmaşasını ve bunu nasıl önleyeceğinizi anlamanıza yardımcı olmayı amaçlamaktadır.

Çift, Çift

Bağımlılıklar (paketler olarak da bilinir) yazılımınızın yapı taşlarıdır. Tipik olarak bu yazılım parçaları, ister tüm topluluklar tarafından ister bir şirket içinde geliştirilmiş olsun, ortak ve gerekli bir görevi yerine getirir.

Paket yöneticileri sıklıkla bağımlılıkları kurmak ve onları güncel tutmak için kullanılır. Paketin adı için hem genel hem de özel kayıtları tararlar ve diğer her şey eşit olduğunda en yüksek sürüm numarasını seçerler. Saldırganlar, genel kayıt defterine aynı adı taşıyan ancak daha yüksek sürüme sahip “sahte” bir paket yerleştirerek bundan yararlanır.

Bir paket yöneticisi, biri genel kayıt defterinde, diğeri özel kayıt defterinde olmak üzere iki özdeş paketle karşılaştığında karışıklığa neden olur; dolayısıyla adı “bağımlılık karışıklığı”dır. İki paket aynı olduğundan, yönetici otomatik olarak daha yüksek sürüme sahip olanı, yani bu durumda saldırganın kötü amaçlı paketini yüklemeyi seçecektir.

Bu, korsanlara yazılımınıza bir arka kapı açma olanağı verir. Bu noktadan itibaren veri ihlalleri gerçekleştirebilir, fikri mülkiyet hırsızlığı gerçekleştirebilir ve yazılım tedarik zincirinin güvenini tehlikeye atabilirler. Ayrıca ciddi düzenleyici cezaları tetikleyecek uyumluluk ihlallerine de yol açabilirler.

Emek ve Sorun

Bağımlılık karışıklığı saldırısına yönelik çeşitli yaklaşımlar vardır.

  • Ad aralığı. Kötü amaçlı bir yazılım kitaplığını, Python Paket Dizini (PyPI) veya JavaScript’in npm kayıt defteri gibi genel bir kayıt defterine yükleyerek, güvenilir, dahili olarak kullanılan bir kitaplığa benzer şekilde adlandırılmış, ad alanı/URL kontrolünü atlayan veya getirmeyi zorlamayan sistemler özel bir kayıt defterinden gelen bir yazılım yanlışlıkla kötü amaçlı kodu alabilir. Son zamanlarda yaşanan PyTorch bağımlılık karmaşası olayı buna bir örnektir.
  • DNS sahteciliği. DNS sahtekarlığı gibi bir teknik kullanılarak sistemler, meşru dahili URL’ler/yollar gibi görünen şeyleri görüntülerken, bağımlılıkları kötü amaçlı depolardan çekmeye yönlendirilebilir.
  • Komut dosyası oluşturma. Derleme/kurma komut dosyalarını veya CI/CD işlem hattı yapılandırmalarını değiştirerek sistemler, yazılım bağımlılıklarını yerel bir depo yerine kötü amaçlı bir kaynaktan indirmeleri için kandırılabilir.

İşler İyi ve Özenle Yapıldı

Bağımlılık karışıklığına karşı korunmak için bu uygulamaları uygulayın.

  • Paket yöneticisinde politikaları ayarlayın. Paket yöneticilerinin genel bir pakete özel bir pakete göre öncelik vermesine izin vermeyin.
  • Her zaman bir .npmrc dosyası ekleyin. Popüler NPM’yi paket yöneticisi olarak kullanıyorsanız, her zaman belirli bir kuruluş kapsamında paketlerin nereden getirileceğini belirten bir .npmrc dosyası ekleyin.
  • Paket adını genel bir kayıt defterinde ayırın. Bağımlılık karışıklığı saldırılarına karşı korunmanın bir başka yolu, korsanların onu kullanamaması ve dolayısıyla paket yöneticisini kötü amaçlı bir paket yüklemesi için “kandıramaması” için paket adını genel bir kayıt defterinde saklamaktır.

Bağımlılık karışıklığı saldırılarına karşı tam koruma sağlamak amacıyla kuruluşların, dahili kayıt defterinizde yayınlarken bile her zaman tüm dahili paketler için kuruluş kapsamlarını kullanması gerekir. Organizasyon kapsamları aynı zamanda NPM’nin kamu siciline de kaydedilmeli, böylece herhangi birinin kapsamı ele geçirmesi ve karışıklıktan faydalanması önlenmelidir.

Paket adları da halka açık olarak kaydedilmelidir. Örneğin bir kuruluş, popüler PIP’i Python bağımlılıkları için paket yöneticisi olarak kullanıyorsa, tanınabilir ve tüm projelerde çalışacak katı bir son eke sahip dahili paketler oluşturmalıdır. Aynı adı taşıyan boş bir paketi, yer tutucu olarak genel kayıt defteri PyPI’ye yükleyin.

Paket adını genel bir kayıt defterinde ayırmanın bir başka nedeni de, başka birisinin bunu (kötü niyetli olarak veya değil) ayırması durumunda, geliştiricilerin özel kayıt defterindeki tüm paket adlarını henüz genel kayıt defterinde ayrılmamış bir adla değiştirmek zorunda kalacak olmasıdır. Bu uzun ve sıkıcı bir süreç olabilir.

Tüm paket kayıtlarının kullanıcıların paket adlarını ayırtmasına izin vermediğini unutmamak önemlidir; bu nedenle, bunu sağlayan bir tane bulduğunuzdan emin olun.

Bir Ayı Tarafından Takip Edilen Çıkış

Bağımlılık karışıklığı saldırıları, dünya çapındaki kuruluşlar için ciddi ve yakın bir siber güvenlik tehdidi oluşturmaktadır. Kuruluşların yaklaşık yarısı risk altındadır ve bu kuruluşların varlıklarının %73’ü risk altındadır. Büyüyen bu tehdide karşı koymak için kuruluşların sağlam önleyici tedbirler alması ve siber güvenlik için en iyi uygulamaları benimsemesi gerekiyor.

Shakespeare’in gülleri yüzlerce yıldır bağımlılık kafa karışıklığı saldırıları riskinin habercisi olabilir, ancak ozanın başka bir alıntısı bunlara karşı korunmak için bazı bilgelik içerebilir:

“Bırakın her göz kendi adına müzakere etsin ve hiçbir temsilciye güvenmesin.”
— Hiçbir Şey Hakkında Çok Gürültü, Perde 2, Sahne 1



siber-1