Bağımlılık ve eklenti yüzeyi
- Bir yapay zekâ servisini saran kütüphane ve eklentilerin uygulamayla aynı yetkide çalıştığını, bu yüzeyi nasıl sabitleyip daraltacağını öğrenirsin.
- Bu derste sürüm sabitleme, kaynak doğrulama ve izin daraltmayı tek bir düzene bağlayacaksın.
- Sonunda bir yapay zekâ servisinin bağımlılık yüzeyini çıkarabileceksin.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +55 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Altay Kargo'nun destek asistanının gereksinim dosyasında 12 satır var. Ekip bu listeyi kısa ve yönetilebilir buluyor. Bir güvenlik incelemesinde aynı servisin ortamındaki paketler sayıldı ve sayı 180'i geçti.
Listede kimsenin adını duymadığı onlarca paket vardı. Hepsi asistanla aynı süreçte, aynı yetkiyle çalışıyordu.
Asistana bağlı eklentiler de ayrı bir yüzey açıyordu. Bu derste bu görünmeyen katmanı tanıyacaksın. Sürüm ve özet sabitlemeyi, bağımlılık karışıklığını, yapay zekânın uydurduğu paket adlarını ve eklenti izinlerini adım adım göreceksin. Son bölümde ağacı tarayıp bakım sinyallerini okumayı öğreneceksin.
Görünmeyen katman
Bir yapay zekâ servisinin kod tabanı küçük görünür. Birkaç yüz satır yazarsın, gerisini kütüphaneler yapar. Çıkarım motoru, belirteçleyici, vektör deposu istemcisi, izleme aracı, ajan çerçevesi.
Her biri kendi bağımlılıklarını getirir, onlar da kendi bağımlılıklarını. Sonuçta yüzlerce paketlik bir ağaç oluşur. Bu ağacın büyük kısmını hiç okumadın.
Hepsi aynı süreçte, aynı yetkiyle çalışır. İşletim sistemi senin yazdığın satır ile bir günlük kütüphanesinin satırı arasında fark görmez.
$ grep -c . gereksinimler.txt 12 $ pip install -r gereksinimler.txt ... $ pip freeze | wc -l 187
Komutları sırayla oku. İlk komut senin yazdığın listeyi sayar: 12 satır. İkinci komut bu listeyi kurar. pip her paketin istediği alt paketleri de çözer ve indirir.
Üçüncü komut ortamda kurulu bütün paketleri listeler ve sayar: 187. Aradaki 175 paketi sen seçmedin. Kaynak paketi olarak gelenler kurulum sırasında kod çalıştırabilir.
Hepsi içe aktarıldığında senin servisinin yetkisini kullanır. Bir günlük kütüphanesi dosya sistemine erişebiliyorsa, o kütüphane ele geçirildiğinde saldırgan da aynı erişimi kazanır. Riski senin yazdığın satır sayısı değil, indirdiğin ağacın büyüklüğü belirler.
Bu ağaca karşı üç savunma birlikte çalışır. Sürüm sabitleme neyin geldiğini kilitler. Kaynak doğrulama paketin nereden geldiğini kilitler. İzin daraltma ise ele geçirilen bir parçanın yapabileceklerini küçültür: servis yalnız gereken adreslere çıkabilir, eklentiler yalnız salt okunur anahtar alır.
MITRE ATLAS yapay zekâ yazılımı üzerinden gelen tedarik zinciri saldırısını AML.T0010.001 koduyla izler. Tanım derin öğrenme çerçevelerini, üretken yapay zekâ entegrasyon çerçevelerini, çıkarım motorlarını ve bunların bağımlılık zincirini birlikte sayar.
Etkinlik 1 / 8
Bağımlılık ağacının güvenlik açısından en önemli özelliği nedir?
Sürümü ve özeti kilitlemek
İlk savunma sürüm sabitlemedir. Aralık yazarsan bir sonraki kurulumda farklı sürüm gelir. Kilit dosyası (lock file) tutarsan her paketin tam sürümü ve özeti sabitlenir. pip bu işi özet denetimi moduyla yapar.
--require-hashes seçeneği verildiğinde her paket == ile tam sürüme sabitlenmek zorundadır ve her birinin yanında özeti bulunmalıdır. Dolaylı bağımlılıklar da buna dahildir. Tek bir paketin özeti eksikse kurulum başlamaz. pip bu modda MD5 ve SHA-1 gibi zayıf algoritmaları kabul etmez, SHA-256 önerir.
# Gevsek: yarin baska surum gelir
transformers>=4.0
# Siki: surum ve ozet sabit, dolayli bagimliliklar dahil
transformers==4.44.2 \
--hash=sha256:2f1c...9ab3
six==1.16.0 \
--hash=sha256:8abb2f1d...0254
$ pip install --require-hashes -r requirements.txt
...
ERROR: THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS FILE. ...
six==1.16.0 from .../six-1.16.0-py2.py3-none-any.whl (from -r requirements.txt (line 3)):
Expected sha256 8abb2f1d...0254
Got 5c3e91a0...7f12Çıktıyı satır satır oku. İlk satır bir aralık verir, kurulum o gün en yüksek uygun sürümü seçer. Sıkı biçimde her paket tam sürüme ve bir özete bağlı. six doğrudan yazdığın bir paket değil, başka bir paketin bağımlılığı, yine de listede.
Kurulumda pip indirdiği six dosyasının özetini hesaplar ve kilit dosyasındakiyle karşılaştırır. Değerler tutmaz. pip kurulumu durdurur ve iki değeri yan yana yazar: Expected beklenen, Got indirilen. Hata mesajı da açık konuşur: sürümü sen güncellediysen özeti de güncelle, güncellemediysen paket içeriğini dikkatle incele, biri değiştirmiş olabilir.
Etkinlik 2 / 8
Doğru mu, yanlış mı?
Kilit dosyası tutmak, kurulumun her ortamda aynı paket sürümlerini getirmesini verir.
Kilit dosyasını elle yazmazsın. pip-tools gibi araçlar doğrudan bağımlılık listesinden bütün ağacı çözer ve her paketin özetini ekler. pip-compile komutu --generate-hashes seçeneğiyle her satırın altına özetleri yazar. Sen yalnız yükseltme kararını verirsin.
Yükseltme bir kod değişikliği gibi incelemeden geçer, yeni kilit dosyası da depoya girer. Böylece geliştirme, test ve üretim aynı dosyayla kurulur. Şimdi özet denetimini zorunlu kılan kurulum komutunu kendin yaz.
Etkinlik 3 / 8
requirements.txt dosyasındaki paketleri, her birinin özetini zorunlu tutarak kuran pip komutunu yaz.
Paket nereden geliyor
İkinci savunma kaynak doğrulamadır. Kurumların çoğu kendi paketleri için bir iç depo kullanır. Sorun, pip'e hem iç depoyu hem genel depoyu aynı anda verdiğinde başlar.
pip bu durumda depoları öncelik sırasıyla değil, sürüm numarasıyla tartar. İki depoda da aynı adı arar ve en yüksek sürümü seçer. Saldırgan senin iç paketinin adını öğrenirse, genel depoya aynı adla çok yüksek sürüm numaralı bir paket yükler.
Kurulum onu seçer. Buna bağımlılık karışıklığı (dependency confusion) denir.
# pip.conf: riskli kurulum [global] index-url = https://ayna.altaykargo.example/simple extra-index-url = https://genel-depo.example/simple # Ayni ad iki depoda: # ic depo : altay-ozet-araclari 1.4.2 # genel depo : altay-ozet-araclari 99.0.0 (saldirganin yukledigi) # pip en yuksek surumu secer -> 99.0.0 kurulur
Bu senaryo kâğıt üstünde kalmadı. Aralık 2022'de yaygın bir derin öğrenme çerçevesinin gece sürümleri bir bağımlılığı projenin kendi deposundan çekiyordu. Saldırgan aynı adla genel depoya bir paket yükledi ve genel depo öncelik kazandı.
25 ile 30 Aralık arasında gece sürümünü Linux'ta pip ile kuranların makinesine zararlı bir ikili dosya geldi. Dosya içe aktarıldığında sistem bilgilerini, ortam değişkenlerini ve SSH anahtarlarını DNS sorgularıyla dışarı taşıyordu. Proje bağımlılığın adını değiştirdi ve eski adı genel depoda yer tutucu bir paketle kendi adına kaydetti.
Savunma birkaç katmandır. Kurulumu tek bir iç aynaya bağla ve extra-index-url kullanma. Ayna genel depodan paket çekiyorsa, iç paket adlarını dışarıdan çekmeyi reddetsin. İç paket adlarını genel depoda yer tutucu paketlerle kendi adına kaydet.
Özet sabitleme burada ikinci kilit olur: saldırganın paketi aynı sürüm numarasını taşısa bile özeti tutmaz. Bu saldırı saldırganın iç paket adını bilmesine dayanır. İç adlar çoğu zaman hata mesajlarından, açık depolara düşen yapılandırma dosyalarından ya da paylaşılan kilit dosyalarından sızar. Bu dosyaları dışarı vermeden önce iç adları temizle.
Etkinlik 4 / 8
Doğru mu, yanlış mı?
extra-index-url ile genel depo eklendiğinde pip önce iç depoya bakar, paketi orada bulursa genel depodaki sürümü dikkate almaz.
Yeni bir kaynak riski yapay zekânın kendisinden gelir. Kod yazan modeller bazen var olmayan paket adları önerir. 2024'te yayımlanan bir çalışma 16 modelden 576 bin kod örneği üretti.
Uydurulan paket oranı ticari modellerde en az yüzde 5,2, açık modellerde yüzde 21,7 çıktı. Toplam 205 binden fazla farklı uydurma ad bulundu. Saldırgan sık uydurulan bir adı genel depoda kaydederse, modelin önerisini doğrulamadan kuran geliştirici zararlı paketi kendi eliyle kurar.
ATLAS bu tekniği uydurulan varlıkları yayımlama adıyla AML.T0060 koduyla izler, AML.CS0022 vakası da riski bir sohbet asistanının paket önerileri üzerinden belgeler. Savunma basittir: modelin önerdiği her paketi kurmadan önce depoda ara. Yayın tarihi, bakımcı ve sürüm geçmişi tutarlı mı diye bak. Dün açılmış, tek sürümlü bir paket kırmızı bayraktır.
Etkinlik 5 / 8
Her önlemi ait olduğu savunma başlığına yerleştir.
Önce bir seçeneğe, sonra aşağıdaki uygun kutuya bas. İstersen seçeneği kutuya sürükleyip bırak. Yerini değiştirmek için aynı işlemi tekrarla.
0/5 seçenek yerleşti.
Eklenti ve araç yetkisi
Eklenti ve araç katmanı ayrı bir yüzeydir. Bir ajana araç bağladığında ona yetki devredersin. Araç bir API anahtarı taşır, bir veritabanına yazar, bir dosyayı okur. Modelin yanlış bir çağrı yapması için ele geçirilmesi gerekmez, kandırılması yeter.
Bir belgeye gizlenmiş tek bir cümle, modelin aracı yanlış amaçla çağırmasına yetebilir. Üstelik araçların kendisi de bir tedarik zinciridir. MCP sunucuları ve eklentiler başka yazarlardan gelir, kendi güncelleme temposuyla değişir. Dün zararsız olan bir araç tanımı yarın değişebilir.
Şemayı soldan sağa oku. Kullanıcı isteği host uygulamaya gelir. Host içindeki model hangi aracı çağıracağına karar verir.
İstek MCP sunucusuna gider, sunucu da asıl aracı çalıştırır. Sonuç yeniden modele döner ve modelin okuduğu kanala girer. Yetki üç yerde daraltılabilir.
Host hangi sunuculara bağlanacağını bilir. Sunucu yalnız gereken araçları açar. Araç da yalnız gereken anahtarla çalışır.
Okuma yeterliyse yazma verme. Tek tabloya erişmesi yetiyorsa şemanın tamamını açma. Yetkiyi modelin cümlesine değil, kodun kontrolüne bağla.
Eklenti sayısı da bir güvenlik kararıdır. Her eklenti ayrı bir yazar, ayrı bir güncelleme temposu ve ayrı bir izin kümesi demektir. Üç eklentiyle çözdüğün işi tek eklentiyle çözebiliyorsan, ikisini kaldırmak gerçek bir kazançtır.
Kurulu ama aylardır kullanılmayan eklentiler de risktir, çünkü kimse güncellemelerini izlemez. Yeni bir eklenti istendiğinde kurulumdan önce istediği izinleri listele ve gereksiz olanları kapat. Eklentinin sürümünü de bir paket gibi sabitle, güncellemeyi incelemeden geçir.
Etkinlik 6 / 8
Yeni bir eklentiyi üretime almanın adımlarını sıraya diz.
Parçalara tıklayarak komutu soldan sağa kur.
Taramak, izlemek, bakımı okumak
Sabitleme neyin geldiğini kilitler ama gelenin temiz olduğunu söylemez. Bilinen açıkları bulmak için ağacı düzenli tararsın. pip-audit bir Python ortamını ya da gereksinim dosyasını bilinen açık kayıtlarıyla karşılaştırır. Varsayılan kaynak PyPI'nin güvenlik danışma verisidir, istersen OSV veritabanını seçersin.
osv-scanner aynı işi pek çok dil ve kilit dosyası türü için yapar. Bu araçlar bilinen açıkları bulur. Kasten zararlı yazılmış bir paketi ise çoğu zaman bulamaz, çünkü o paket için henüz bir kayıt yoktur. Aşağıda Altay Kargo'nun gece taramasından bir çıktı var.
$ pip-audit -r requirements.txt Found 3 known vulnerabilities in 1 package Name Version ID Fix Versions -------- ------- --------------- ------------ requests 2.31.0 PYSEC-2026-1873 2.32.0 requests 2.31.0 PYSEC-2026-1872 2.32.4 requests 2.31.0 PYSEC-2026-2275 2.33.0 $ echo $? 1
Çıktıyı satır satır oku. İlk satır özet verir: bir pakette üç bilinen açık. Tablonun her satırı bir açıktır.
Name ve Version kurulu paketi, ID açığın kaydını, Fix Versions ise açığın kapandığı ilk sürümü gösterir. Üç açığın üçü de 2.33.0 ve sonrasında kapalı. Doğru hamle tek tek yamamak değil, kilit dosyasını 2.33.0 ya da sonrası için güncelleyip özetleri yeniden üretmektir.
Çıkış kodu 1, sürekli entegrasyon hattının işi durdurması için yeterlidir. Tarama yalnız bugünü gösterir. Aynı tarama her gece koşmalı, çünkü yarın yeni bir açık yayımlanabilir.
Zincir yalnız senin kurduğun paketler değildir, kullandığın paketin yayın hattı da zincirin parçasıdır. Aralık 2024'te popüler bir nesne tanıma kütüphanesinin dört sürümü genel depoya zararlı kodla yüklendi. Saldırgan genel depoyu değil, projenin kendi derleme iş akışını ve iptal edilmemiş eski bir yayın anahtarını kullanmıştı. Bu yüzden bir paketi seçerken projenin bakımına da bak.
Bir kütüphanenin son kaydı iki yıl önceyse, açığı bulunduğunda yama gelmez. Tek bakımcısı varsa hesabının ele geçirilmesi bütün kullanıcıları vurur. Bu sinyalleri seçim aşamasında oku, olaydan sonra değil.
Ağacın tamamını bir yazılım malzeme listesinde (SBOM) tut. Yeni bir açık yayımlandığında hangi servisin etkilendiğini bu listeden dakikalar içinde bulursun. Yeni çıkan bir sürümü hemen almak yerine birkaç gün bekletmek de işe yarar.
Zararlı sürümler çoğu zaman ilk günlerde fark edilir ve depodan kaldırılır. NIST'in güvenli yazılım geliştirme çerçevesi SSDF (SP 800-218) bu adımları tek düzene bağlar. SP 800-218A ise aynı çerçeveye üretken yapay zekâ modellerine özgü uygulamaları ekler.
Etkinlik 7 / 8
Bir yapay zekâ servisinde doğrudan yazdığın kütüphane sayısı 12 ise, dolaylı bağımlılıklarla toplam paket sayısı tipik olarak kaç olur?
Tahminini kaydır, sonra gönder.
Derinleş:Güvenilen yayın ve doğrulama kayıtları
Genel paket depoları artık uzun ömürlü yayın anahtarı yerine kimlik tabanlı yayını destekler. Proje, derleme hattının kimliğini depoya bir kez tanıtır. Hat her yayında kimlik sağlayıcıdan kısa ömürlü bir belirteç alır, depo bu belirteci doğrular ve yalnız o yayını kabul eder.
Çalınacak kalıcı bir anahtar kalmaz. Depo ayrıca her dosya için bir doğrulama kaydı tutabilir: dosya hangi kaynak depodan, hangi iş akışıyla derlendi. Aralık 2024'teki olayda iki zararlı sürüm projenin kendi yayın hattından çıkmıştı, çünkü saldırgan derleme önbelleğini zehirlemişti.
Öbür iki sürüm iptal edilmemiş eski bir API anahtarıyla yüklenmişti. Kayıtlar sayesinde inceleme ekibi hangi dosyanın hangi yoldan geldiğini ayırabildi. Vaka bir sınırı da gösterir. Doğrulama kaydı paketin güvenli olduğunu kanıtlamaz, yalnız nereden ve nasıl üretildiğini kanıtlar.
Bu üç önlemi tek bir kontrol listesine dönüştürürsen, yeni bir eklenti isteği geldiğinde karar dakikalar içinde çıkar. Listeyi kısa tut: kaynak doğrulandı mı, sürüm ve özet sabit mi, istenen her izin bir özelliğe karşılık geliyor mu.
Üçüncü sorunun cevabı hayırsa o izni verme. Her eklenti için üç cevabı kayda geçir, bir sonraki inceleme oradan başlasın. Aşağıdaki örnekte aynı mantığı bambaşka bir eklenti isteğine uygula.
Etkinlik 8 / 8
Bir ajana bağlı takvim eklentisi hem okuma hem yazma hakkı istiyor ama özelliği yalnız uygunluk gösteriyor. Doğru karar nedir?
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.