Canary Token ile İspatlanabilir LLM Sızıntısı: Adli-Uyum Odaklı KVKK Loglama Oracle'ı
Tahmin değil kanıt: oturum-özel kanaryayla sızıntının denetim zinciri
Bir chatbot "gizli veriyi sızdırdı mı?" sorusunun cevabı çoğu kurumda bir tahmindir. Oturum-özel bir canary token'ı RAG dokümanına gömer ve çıktıda ararsanız, tahmin yerine mahkemede ve denetimde savunulabilir bir kanıta sahip olursunuz.
Canary-Oracle Nedir? Tek Paragraflık Tanım
Canary-oracle, bir LLM/RAG sistemine her oturum için benzersiz, yüksek-entropili ve gerçek dünyada hiçbir yerde geçmeyen bir işaret dizisi (canary token) enjekte edip, bu dizinin modelin çıktısında görünüp görünmediğini kesin olarak kontrol eden bir sızıntı tespit desenidir. Kanaryanın çıktıda belirmesi olasılıksal bir sinyal değildir: token yalnızca gizli tutulması gereken bağlama (örneğin bir RAG dokümanına veya sistem promptuna) gömüldüğü için, kullanıcıya ulaşan yanıtta ortaya çıkması, o gizli bağlamın sızdırıldığının doğrudan kanıtıdır. "Oracle" adı buradan gelir: sistem, sızıntının olup olmadığını tahmin etmez, deterministik olarak bilir. Bu yaklaşım, güvenlik dünyasındaki klasik canary token mantığının LLM katmanına taşınmış halidir ve gözlemlenebilirlik ile adli-uyum arasındaki boşluğu kapatır.
Bu makale ne loglanır tartışmasını değil, sızıntı iddiasını nasıl kanıta çevirirsiniz sorusunu ele alır. Ham prompt'ları saklamadan hash/özellik/karar olaylarıyla loglama konusunu, tamamlayıcı yazımız gizlilik-korumalı AI güvenlik telemetrisi işliyor; burada odak, o telemetrinin taşıyacağı tek özel olay olan canary sızıntısıdır.
Neden "Tahmin" Değil "Kanıt": İspat Zinciri
Çoğu sızıntı tespiti dolaylı sinyallere dayanır: benzerlik skoru, PII regex isabeti, anomali puanı. Bunların hepsi olasılıksaldır ve bir denetçi ya da hâkim karşısında "belki" der. Canary-oracle deseninin gücü, sızıntı iddiasını yanlışlanabilir bir önermeye indirgemesidir:
- Benzersizlik: Canary yeterince yüksek entropiye sahipse (ör. 80+ bit rastgelelik), modelin eğitim verisinde veya kullanıcı girdisinde tesadüfen üretilme olasılığı pratikte sıfırdır.
- Köken izolasyonu: Token yalnızca korunması gereken bağlama gömülür; kullanıcı onu asla görmez. Dolayısıyla çıktıdaki her görünüm, ancak korunan bağlamdan geçmiş olabilir.
- Kayıt bütünlüğü: Olay, değiştirilemez, zaman damgalı ve önceki kayda hash'le zincirlenmiş bir denetim kaydına yazılır. Bu, KVKK Madde 12 kapsamında önerilen "tüm veri hareketlerinin değiştirilemez kaydı" beklentisiyle örtüşür.
Bu üçlü — benzersizlik, köken izolasyonu, kayıt bütünlüğü — bir ispat zinciri oluşturur. Sızıntı sonrası bir denetimde "gizli doküman kullanıcıya ulaştı mı?" sorusuna, kayıttaki canary_id ve doküman kimliğiyle nokta atışı yanıt verilebilir. AltaySec'in açık kaynak Bekçi/kalkan-arena red-team labında canary-oracle deseni tam da bu amaçla, oturum-özel kanarya + gizli oracle mantığıyla doğrulanmıştır (AltaySec'in kendi ölçüm ortamıdır, dış-genel bir istatistik değildir).
Canary Üretme ve Eşleştirme (Sözde-Kod)
Desen iki taraftan oluşur: enjeksiyon anında canary üretimi, çıktı anında eşleştirme. Kanaryanın kendisi loglanmaz; onun yerine sunucu-taraflı bir HMAC saklanır, böylece kaydın kendisi ikincil bir sızıntı yüzeyi olmaz.
# --- 1) Oturum başında canary üretimi ---
def canary_uret(session_id, server_secret):
ham = secrets.token_urlsafe(15) # ~120 bit entropi
canary = f"AS-CANARY-{ham}" # taranabilir sabit onek
canary_id = uuid4()
hmac_deger = hmac_sha256(server_secret, canary)
store.kaydet(session_id, canary_id, hmac_deger) # ham canary DISK'e yazilmaz
return canary, canary_id
# Kanaryayi korunan baglama gom (kullanici asla gormez):
decoy_chunk = f"[DAHILI-REF {canary}] Bu satir yalnizca sistem icindir."
rag_index.ekle(decoy_chunk, meta={'canary_id': canary_id})
# --- 2) Cikti aninda eslestirme (oracle) ---
def sizinti_kontrol(model_ciktisi, session_id):
norm = nfkc_casefold(strip_zero_width(model_ciktisi))
for eslesme in re.finditer(r"AS-CANARY-[A-Za-z0-9_-]{20,}", norm):
aday = eslesme.group()
hmac_aday = hmac_sha256(server_secret, aday)
kayit = store.oturum_canary(session_id)
if kayit and sabit_zamanli_esit(hmac_aday, kayit.hmac):
return Sizinti(
tip='exact',
canary_id=kayit.canary_id,
offset=eslesme.start())
return None # kesin sizinti yokKritik detaylar: eşleştirme Unicode normalizasyonu (NFKC), casefold ve sıfır-genişlik karakter temizliği ile yapılır; aksi halde model kanaryayı görsel olarak bozarak eşleşmeden kaçabilir. HMAC karşılaştırması sabit-zamanlı olmalıdır. Kanaryayı gömdüğünüz decoy chunk'ın meşru bir yanıtta asla getirilmemesi gereken, açıkça "yalnızca dahili" etiketli bir tuzak olması gerekir — Türkçe LLM güvenliğinde az işlenen bu tuzak-doküman tekniği, LLM honeypot tasarımı mantığıyla akrabadır.
Yanlış-Pozitif Elemesi
Bir sızıntı iddiasının kanıt değeri taşıması için yanlış-pozitiflerin sistematik biçimde elenmesi şarttır. Aşağıdaki elemeler eşleştirmeyi "görünüm"den "onaylı sızıntı"ya taşır:
- Kullanıcı eko elemesi: Canary'yi kullanıcının kendisi girdiyse (kopyalayıp yapıştırdıysa), çıktıdaki tekrar sızıntı değil ekodur. Girdi de aynı canary için taranır; girdide varsa olay dismissed işaretlenir.
- Oturum bağlama elemesi: Eşleşen HMAC gerçekten bu oturumun canary'sine mi ait? Başka oturumun kanaryası çıkıyorsa bu, tenant/oturum izolasyon ihlalidir ve ayrı, daha ağır bir bulgudur.
- Bozulmuş eşleşme = şüpheli, onaylı değil: Kanarya kodlanmış/parçalanmış (base64, ROT13, karakter araya sokma) biçimde çıkıyorsa, match_type
obfuscatedolarak işaretlenir ve otomatik onay verilmez; insan incelemesine düşer. Yalnızcaexactvenormalizedeşleşmeler ilk elde ispatlanabilir sayılır. - Entropi eşiği: Düşük entropili canary kullanılmışsa (kısa, tahmin edilebilir), tesadüf olasılığı sıfır değildir; bu tür kayıtlar kanıt değil sinyal olarak sınıflanır.
Bu eleme mantığı, "sızıntı oldu" cümlesini bir denetimde savunabileceğiniz üç durumdan birine ayırır: onaylı sızıntı, izolasyon ihlali, şüpheli/incelemede. PII maskeleme tarafını KVKK PII maskeleme yazımız tamamlar.
Minimal Log Şeması: 24 Alanlı Canary Denetim Kaydı
Log şeması burada ana konu değil, canary olayını adli-uyum standardında taşıyan minimal ektir. Amaç, ham prompt veya ham canary saklamadan; olayı, kökenini ve bütünlük çapasını tutmaktır. Aşağıdaki 24 alan; her alan için işlem (açık / hash / maskeli), saklama ilkesi ve KVKK Madde 12 karşılığıyla işaretlenmiştir. Örnek gövde:
{
"event_id": "a1f0...", "event_type": "canary_leak_detected",
"timestamp_utc": "2026-08-03T09:14:22Z", "prev_event_hash": "sha256:...",
"tenant_id": "hmac:...", "session_id": "hmac:...", "user_ref": "psd:...",
"canary_id": "c7e2...", "canary_hmac": "hmac:...",
"canary_placement": "rag_chunk", "source_doc_id": "doc-9931",
"retrieval_doc_ids": ["doc-9931","doc-4420"], "detection_stage": "output",
"match_type": "exact", "match_confidence": 1.0, "match_offset": 412,
"output_sha256": "...", "output_excerpt_masked": "...[MASKELI]...",
"prompt_sha256": "...", "model_version": "guardian-rt-3.1",
"severity": "critical", "fp_review_state": "confirmed",
"retention_expiry": "2027-08-03", "kvkk_basis": "Md.12-veri-guvenligi"
}| # | Alan | İşlem | Saklama | KVKK Md.12 karşılığı |
|---|---|---|---|---|
| 1 | event_id | açık | olay + 1 yıl | Hesap verebilirlik |
| 2 | event_type | açık | olay + 1 yıl | Olay sınıflandırma |
| 3 | timestamp_utc | açık (değiştirilemez) | olay + 1 yıl | Zaman damgalı kayıt |
| 4 | prev_event_hash | açık | olay + 1 yıl | Değiştirilemezlik (zincir) |
| 5 | tenant_id | hash (HMAC) | olay + 1 yıl | Erişim/izolasyon ayrımı |
| 6 | session_id | hash | olay + 1 yıl | İzlenebilirlik |
| 7 | user_ref | hash (takma ad) | olay + 1 yıl | Veri minimizasyonu |
| 8 | canary_id | açık | olay + 1 yıl | Köken referansı |
| 9 | canary_hmac | hash | olay + 1 yıl | Gizli oracle (ham canary tutulmaz) |
| 10 | canary_placement | açık | olay + 1 yıl | Köken bağlamı |
| 11 | source_doc_id | açık | olay + 1 yıl | Sızan varlığın kimliği |
| 12 | retrieval_doc_ids | açık | olay + 1 yıl | Getirme izi |
| 13 | detection_stage | açık | olay + 1 yıl | Tespit noktası |
| 14 | match_type | açık | olay + 1 yıl | Kanıt gücü (exact/obfuscated) |
| 15 | match_confidence | açık | olay + 1 yıl | Yanlış-pozitif elemesi |
| 16 | match_offset | açık | olay + 1 yıl | Kanıt konumu |
| 17 | output_sha256 | hash | olay + 1 yıl | Çıktı bütünlük çapası |
| 18 | output_excerpt_masked | maskeli (PII redakte) | olay + 90 gün | Kanıt penceresi + minimizasyon |
| 19 | prompt_sha256 | hash | olay + 1 yıl | Girdi bütünlüğü |
| 20 | model_version | açık | olay + 1 yıl | Regresyon takibi |
| 21 | severity | açık | olay + 1 yıl | Risk derecelendirme |
| 22 | fp_review_state | açık | olay + 1 yıl | Adli karar durumu |
| 23 | retention_expiry | açık | — | Saklama/imha politikası |
| 24 | kvkk_basis | açık | olay + 1 yıl | Hukuki dayanak etiketi |
Dikkat: ham canary yalnızca canary_hmac olarak tutulur, çıktı yalnızca output_sha256 + maskeli pencere olarak tutulur. Böylece denetim kaydının kendisi yeni bir sızıntı yüzeyi olmaz — bu, gizlilik-korumalı loglama ilkesinin canary olayına uyarlanmış halidir.
KVKK Madde 12 ve Adli-Uyum Karşılığı
KVKK Madde 12, veri güvenliğine ilişkin yükümlülükleri düzenler ve teknik tedbirler kapsamında tüm veri hareketlerinin zaman damgalı, değiştirilemez biçimde kayıt altına alınması önerilir. Canary denetim kaydının timestamp_utc + prev_event_hash zinciri tam olarak bu beklentiyi karşılar: kayıtlar geriye dönük değiştirilirse hash zinciri kırılır ve tahrifat ortaya çıkar.
Bunun ötesinde, KVKK Etken Yapay Zeka Rehberi, çok-ajanlı ve otonom yapılarda izlenebilirlik ve hesap verebilirlik boşluğunu — yani "kara kutu" sorununu — açıkça bir risk olarak işaret etmektedir. Rehber "kaydedilmeli" der; ancak hangi alanların, nasıl loglanacağına dair somut teknik şablon Türkçe kaynaklarda az işlenmiştir. Bu makaledeki canary-oracle deseni ve 24 alanlı şema, o teknik boşluğu dolduran nadir Türkçe kaynaklardan biri olmayı hedefler. Adli-uyum açısından değeri şudur: bir veri ihlali bildirimi veya denetim talebinde, "gizli doküman kullanıcıya ulaştı mı?" sorusuna spekülasyonla değil, canary_id + source_doc_id + değiştirilemez zaman damgasıyla belgelenmiş bir yanıt verilebilir.
Sınırlar, Guardian ile Konumlama ve Kaynak Sınırı
Canary-oracle güçlü ama sihirli değildir. Sınırları dürüstçe belirtmek, yöntemin kanıt değerini korur:
- Kapsam sınırı: Yalnızca gömdüğünüz canary'nin sızıntısını kanıtlar. Kanarya taşımayan hassas içeriğin sızıntısını yakalamaz; kapsamı tuzak-doküman stratejinizin genişliği belirler.
- Yeniden ifade riski: Model, korunan bilgiyi kanaryayı hiç taşımadan başka kelimelerle özetleyerek sızdırabilir; bu semantik sızıntı canary ile değil, tamamlayıcı savunmalarla yakalanır.
- Konumlama: Canary tespiti bir algılama katmanıdır; sızıntıyı engellemek için çıktının kullanıcıya ulaşmadan kesilmesi gerekir. AltaySec Guardian gibi bir çalışma-zamanı LLM güvenlik duvarı, canary tespitini bir engelleme kuralına bağlayarak algılamayı önlemeye çevirebilir. RAG tarafındaki bütünsel izleme için RAG güvenlik izleme yazısına bakın.
Kaynak sınırı: Bu makaledeki canary-oracle deseninin "tahmin değil kanıt" özelliği, AltaySec'in kendi açık red-team ortamı olan Bekçi/kalkan-arena'da gözlemlenmiş bir tasarım desenidir; harici, bağımsız bir kıyaslama istatistiği olarak sunulmamaktadır. 24 alanlı şema bir öneri şablonudur, zorunlu bir standart değildir; kurumunuzun saklama ve imha politikasına göre uyarlanmalıdır. Uygulama desteği için bizimle iletişime geçebilirsiniz.
Kaynaklar
- 6698 sayılı Kişisel Verilerin Korunması Kanunu — Madde 12 (Veri Güvenliğine İlişkin Yükümlülükler)
- KVKK — Yapay Zeka Alanında Kişisel Verilerin Korunmasına Dair Tavsiyeler
- OWASP Top 10 for LLM Applications — LLM02:2025 Sensitive Information Disclosure
- OWASP Top 10 for LLM Applications — LLM08:2025 Vector and Embedding Weaknesses
- MITRE ATLAS — Adversarial Threat Landscape for AI Systems
- Thinkst Canarytokens — Canary Token kavramı ve dokümantasyonu
