Multimodal Güvenlik · Veri Sızdırma

Markdown ve Görsel Render ile Veri Sızdırma
Tık gerektirmeyen exfiltrasyon zinciri

Bir sohbet asistanının ekranına düşen tek bir markdown görseli, kullanıcı hiçbir yere tıklamadan konuşmanın gizli içeriğini saldırgan sunucusuna taşıyabilir. Bu, dolaylı prompt injection ile istemci tarafı otomatik görsel render'ının birleştiği "Render-Sızdırma Zinciri"dir ve Türkçe kaynaklarda neredeyse hiç işlenmemiştir.

Render-Sızdırma Zinciri Nedir?

Render-Sızdırma Zinciri, bir dil modelinin ürettiği çıktının, kullanıcının okuyucu arayüzü tarafından otomatik olarak işlenmesinden (render) faydalanarak veriyi dışarı taşıyan bir sızdırma yöntemidir. Saldırgan, modele dolaylı bir talimat yerleştirir; model konuşmadaki gizli bilgiyi (sistem promptu, önceki mesajlar, kişisel veri) toplar, bunu saldırganın kontrolündeki bir sunucuya giden URL'ye kodlar ve bu URL'yi bir markdown görseli olarak yazar. İstemci markdown'ı HTML'e çevirip görseli getirmeye çalıştığında, tarayıcı hiçbir tık olmadan o URL'ye istek atar ve kodlanmış veri saldırgana ulaşır. Saldırının "tık gerektirmeyen" (zero-click) olmasının nedeni budur: sızıntıyı tetikleyen eylem, kullanıcının bir bağlantıya tıklaması değil, arayüzün görseli kendiliğinden yüklemesidir.

Zincir, iki bilinen zayıflığın kesişiminde durur. Birincisi dolaylı prompt injection: modelin işlediği bir belge, e-posta, web sayfası veya RAG dokümanı içine gömülü, kullanıcıya değil modele hitap eden talimatlar. İkincisi ise otomatik içerik render'ı: modern sohbet arayüzlerinin markdown'ı zenginleştirilmiş HTML'e çevirirken görselleri, bağlantı önizlemelerini ve kimi durumlarda gömülü çerçeveleri kendiliğinden yüklemesi. Tek başına zararsız görünen bu iki davranış birleşince, model bir veri kaçağı borusuna dönüşür.

Zincirin Dört Adımı

AltaySec'in çerçevesinde zinciri dört ayrık adıma bölüyoruz; çünkü savunma, bu adımların herhangi birini kestiğinizde çöker. Zinciri bir bütün olarak değil, kesilebilir bir dizi halinde düşünmek doğru savunma noktasını seçmeyi kolaylaştırır.

AdımNe olurKesme noktası
1. Dolaylı talimatSaldırgan talimatı, modelin okuyacağı bir belgeye/e-postaya/RAG kaydına gömerGirdi temizleme, kaynak güveni, RAG içerik izolasyonu
2. Sır toplamaModel, bağlamdaki gizli veriyi (sistem promptu, PII, oturum verisi) derlerEn az yetki, bağlam bölümleme, hassas alan maskeleme
3. URL'ye kodlamaToplanan veri, saldırgan alan adına giden bir URL'nin sorgu parçasına kodlanırÇıktı filtresi: URL/alan adı denetimi
4. Otomatik görsel isteğiİstemci markdown'ı render eder, tarayıcı URL'yi tık olmadan getirirCSP, alan adı beyaz listesi, otomatik render kısıtlama

Pratikte en güvenilir savunma hattı 3. ve 4. adımlardır. İlk iki adım modelin dünyaya açık yüzeyinde gerçekleşir ve tamamen kapatılması zordur; oysa çıktının dışarı çıktığı boru (URL üretimi ve render) kurum kontrolündedir. Bu yüzden zincire "çıktı tarafından" bakmak, savunmayı savunulabilir bir zemine taşır.

Sahadan İki Vaka: EchoLeak ve Grok

Zincir teorik değil. Belgelenmiş iki örnek, dört adımın gerçek ürünlerde nasıl birleştiğini gösteriyor.

EchoLeak (CVE-2025-32711). Microsoft 365 Copilot'ta tespit edilen bu tık gerektirmeyen prompt injection zafiyeti, saldırganın gönderdiği bir e-postanın içeriğiyle tetikleniyordu. Saldırı, bağlantı gizleme (link redaction) korumasını referans stilli markdown ile atlatıyor, ardından otomatik getirilen bir görselle veriyi dışarı taşıyor ve bunun için Teams proxy üzerinden bir İçerik Güvenlik Politikası (CSP) suistimali kullanıyordu. Kullanıcının e-postayı açması yeterliydi; herhangi bir bağlantıya tıklamasına gerek yoktu. Vaka, çıktı tarafındaki bir savunmanın (bağlantı gizleme) referans stilli markdown gibi bir kodlama varyantıyla nasıl aşılabildiğini gösterdiği için ders niteliğindedir.

xAI Grok. Güvenlik araştırmacısı Johann Rehberger'in belgelediği örnekte Grok, markdown görseli üzerinden veri sızdırmaya açıktı: modele yerleştirilen dolaylı talimat, konuşma verisini bir görsel URL'sine kodlatıp render anında saldırgana taşıyordu. Bu örnek, zincirin tek bir sağlayıcıya özgü olmadığını, markdown render'ı yapan her arayüz için ortak bir sınıf zafiyeti olduğunu ortaya koyuyor.

Bağımsız araştırmacıların (örneğin Simon Willison'ın exfiltrasyon derlemesi) yıllardır tekrar tekrar aynı deseni raporlaması, bunun tek seferlik bir hata değil, markdown ve otomatik render'ın birlikteliğinden doğan yapısal bir zayıflık olduğunu gösteriyor.

Türkçe Asistan Arayüzlerinde Kanal Test Matrisi

Zincirin son adımı "otomatik görsel isteği" olarak anılsa da, render katmanında veriyi dışarı taşıyabilecek tek kanal görsel değildir. Türkiye'de yaygın kullanılan sohbet ve asistan arayüzlerini denetlerken üç kanalı ayrı ayrı test etmek gerekir. Aşağıdaki matris, hangi kanalın hangi koşulda tetiklendiğini ve nasıl kapatıldığını nitel olarak özetler; kurumların kendi arayüzlerinde birebir doğrulaması gereken bir kontrol listesidir.

KanalTetikleyiciTık gerekir mi?Birincil savunma
Markdown görselArayüz ![]() sözdizimini render edip görseli getirirHayırURL çıktı filtresi + CSP img-src beyaz listesi
Bağlantı önizlemesiArayüz URL'ler için kart/önizleme çeker (unfurl)Hayır (önizleme otomatikse)Sunucu tarafı önizlemeyi güvenilir alanlarla sınırla
Gömülü çerçeve (iframe)HTML render'ı iframe veya benzeri gömme izni verirHayırGömmeyi tümden kapat; CSP frame-src kısıtı

Matrisin özü şudur: bir kanalı kapatmak diğerlerini kapatmaz. Markdown görselini engellemek, bağlantı önizlemesini otomatik çeken bir arayüzü hâlâ açık bırakır. Bu nedenle denetim, tek bir sözdizimi değil, arayüzün otomatik dış istek atabileceği her yolu kapsamalıdır. Türkçe kaynaklarda bu üç kanalı birlikte ele alan vaka analizleri henüz yaygın olmadığı için, kurumların çoğu yalnızca en görünür kanalı (markdown görsel) kapatıp diğer ikisini açık bırakabiliyor.

Savunma: Zinciri Çıktı Tarafından Kesmek

Prompt injection'ı girdi tarafında tümüyle önlemenin güvenilir bir yolu henüz yok; model, kendisine ulaşan metinle talimat arasındaki sınırı her zaman ayırt edemez. Bu yüzden Render-Sızdırma Zinciri'ne karşı en dayanıklı hat, verinin dışarı çıktığı iki adımı (URL üretimi ve render) hedef alan çıktı-taraflı savunmadır. Üç katman birlikte çalışır:

  • Çıktı filtresi (regex/allowlist): Modelin ürettiği metindeki tüm görsel ve bağlantı URL'lerini yakalayıp alan adını bir beyaz listeye göre denetleyin. Beyaz liste dışındaki her URL'yi düşürün veya zararsızlaştırın (defang). Kritik nokta, ham metni değil, render öncesi URL'leri denetlemektir.
  • İçerik Güvenlik Politikası (CSP): Arayüzün yalnızca güvenilir alanlardan görsel yüklemesine izin verin (img-src), çerçeve gömmeyi kısıtlayın (frame-src). EchoLeak vakası, CSP yanlış yapılandırılırsa (örneğin bir proxy üzerinden aşılabiliyorsa) bu katmanın delinebileceğini hatırlatır; bu yüzden CSP tek başına değil, çıktı filtresiyle birlikte kullanılmalıdır.
  • Alan adı beyaz listesi: Otomatik dış istek atabilecek her kanal için (görsel, önizleme, çerçeve) izinli alanları açıkça tanımlayın. Bilinmeyen alan = otomatik render yok.

AltaySec Guardian'ın (LLM güvenlik duvarı) çıktı-taraflı kural seti olan prompt-injection-detection-rules, bu üç katmanı somut yapılandırmaya döker: model çıktısındaki URL'leri render öncesi tarayan regex kuralları, alan adı beyaz listesi ve önerilen CSP başlıkları. Buradaki tasarım ilkesi, girdiyi "temiz" varsaymak yerine her çıktıyı potansiyel olarak zehirli kabul edip dışarı giden boruyu daraltmaktır. Çalışma zamanı korumalarının genel mantığını çalışma zamanı LLM guardrail'leri ve LLM güvenlik duvarı yazılarında ayrıntılandırdık.

Somut Yapılandırma Örneği

Aşağıda çıktı filtresinin çekirdek mantığı sadeleştirilmiş bir örnek olarak yer alıyor. Amaç, model çıktısındaki markdown görsel ve bağlantı URL'lerini yakalayıp beyaz liste dışındakileri zararsızlaştırmaktır. Üretimde bu mantık, tam bir markdown ayrıştırıcısı ve normalleştirilmiş URL karşılaştırmasıyla güçlendirilmelidir; regex tek başına referans stilli markdown gibi varyantlara karşı yetersiz kalabilir.

# Model çıktısındaki görsel/bağlantı URL'lerini render öncesi denetle
IMG_RE = r'!\[[^\]]*\]\((https?://[^)\s]+)\)'
LINK_RE = r'(?<!!)\[[^\]]*\]\((https?://[^)\s]+)\)'
ALLOWLIST = {"altaysec.com.tr", "cdn.kurumunuz.com"}

def sanitize_output(text):
    def check(match):
        url = match.group(1)
        host = urlparse(url).hostname or ""
        if host.lower() not in ALLOWLIST:
            return "[dış kaynak engellendi]"  # URL'yi düşür
        return match.group(0)
    text = re.sub(IMG_RE, check, text)
    text = re.sub(LINK_RE, check, text)
    return text

Render katmanında ise CSP başlığı otomatik dış istekleri sınırlar. Aşağıdaki örnek, görselleri ve çerçeveleri yalnızca kurum içi/güvenilir alanlarla sınırlar:

Content-Security-Policy:
  default-src 'self';
  img-src 'self' https://cdn.kurumunuz.com;
  frame-src 'none';
  connect-src 'self'

Bu iki katman birlikte, zincirin 3. ve 4. adımlarını aynı anda hedef alır: URL beyaz liste dışıysa çıktı filtresi düşürür; filtreyi bir varyant aşarsa CSP tarayıcının isteği atmasını engeller. Savunmanın gücü, tek bir katmana değil, iki bağımsız kontrolün üst üste binmesine dayanır.

Neden Bu Boşluk Önemli?

Render-Sızdırma Zinciri, klasik güvenlik reflekslerini yanıltır: ne bir kullanıcı hatası (kimse bir şeye tıklamadı) ne de klasik bir enjeksiyon (SQL veya XSS filtreleri devrede değil) söz konusudur. Sızıntı, sistemin tasarlanmış davranışının, yani markdown'ı güzelce render etmenin, bir yan etkisi olarak gerçekleşir. Bu yüzden hem tespiti hem de kabullenilmesi güçtür.

Türkiye'de yaygınlaşan kurumsal asistanlar, RAG tabanlı destek botları ve e-posta özetleyicileri tam olarak bu zincirin işlediği koşulları taşıyor: modele güvenilmeyen içerik giriyor (müşteri e-postası, yüklenen belge, web sayfası) ve model çıktısı zengin bir arayüzde render ediliyor. AltaySec'in kendi ölçümlerinde ve Türkçe saldırı korpuslarında gözlemlediğimiz gibi, Türkçe morfolojisi ve dil karışımı, girdi tarafındaki basit imza tabanlı filtreleri zaten zorluyor; bu da savunmayı çıktı tarafına kaydırmayı daha da gerekli kılıyor. Dolaylı enjeksiyonun belge ve e-posta yüzeyindeki geniş resmini dolaylı enjeksiyon: HTML, PDF ve e-posta yazısında; sızdırılabilecek en değerli hedeflerden birini ise sistem promptu sızdırma yazısında ele aldık.

Kurumsal asistanınızın bu üç kanala karşı test edilmesini veya Guardian çıktı filtresinin devreye alınmasını istiyorsanız iletişim üzerinden bize ulaşabilirsiniz.

Kaynaklar

İlgili Yazılar