Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
OWASP LLM Top 10'un Evrimi: 2023'ten 2025'e ve 2026'ya, Agentic Top 10 ve Agent Control Standard
OWASP LLM Top 10'da aynı ID üç sürümde üç ayrı riski gösterebilir: 2023'ün LLM06'sı hassas bilgi ifşasıydı, 2026'nınki Unbounded Consumption. 2023, 2025 ve 2026 listelerini konuya göre hizalıyor, dağılan ve eklenen maddeleri, 2026 sıra hareketlerini, Agentic Top 10'u ve Agent Control Standard'ı ele alıyor, eski bir sızma testi raporunu 2026 ID'lerine taşıyan bir C# aracı yazıyoruz.
Guardrail Mimarisi ve Güvenlik Testleri: IChatClient Middleware'i, Safety Evaluator'ları ve CI'da Red Team Regresyonu
Guardrail'ler IChatClient pipeline'ında doğru sırayla duran, fail modu bilerek seçilmiş middleware'lerdir ve her model değişikliğinde aynı zararsız red team setiyle yeniden ölçülür. Kill switch, input ve output guard'ı kuruyor, safety evaluator'larına ve kendi IEvaluator'ımıza bakıyor, xUnit setinin gemma3:12b'ye geçişte canary token yaklaşımımızın iki ayrı yönde çöktüğünü yakaladığını gösteriyoruz.
Unbounded Consumption: Denial of Wallet, Context Bombası ve Agent Döngüsünü Sınırlamak
LLM'de maliyetin birimi istek değil token'dır; bu yüzden input, output, süre ve bütçe her istekte çağrıdan önce sınırlanır. 120 bin karakterlik bir dokümanın Ollama'da sessizce kırpılıp yanlış cevap ürettiğini, qwen3:4b'nin yedi kelimelik soruya 8.000 token düşünüp boş döndüğünü ölçüyor, rezervasyonlu kullanıcı ve tenant bütçesi, timeout ve state hash'li bir loop guard kuruyoruz.
Supply Chain, Poisoning ve Vector Zafiyetleri: Model, Veri ve Embedding Store'u Korumak
Model, prompt ve tool tanımı da birer bağımlılıktır: digest'iyle pin'lenir, envanterde hash'iyle tutulur ve değişince review'dan geçer. gemma3:4b tag'inin registry'de başka bir artifact'a taşındığını yakalıyor, CycloneDX 1.7 ile bir AIBOM yazıyor, beş kampanya yorumunun cevabı 5/5 yanılttığını ve ingestion kapısının bunu kestiğini ölçüyor, yalnız embedding'i sızan bir notun içeriğinin tahmin edilebildiğini gösteriyoruz.
LLM Çıktısı Güvenilmeyen Input'tur: Improper Output Handling, Markdown Render'ı ve Misinformation
Model çıktısı her dış girdi gibi güvenilmeyen input'tur: Angular'ın sanitizer'ı script'i durdurur ama dış adrese giden bir Markdown resmini durdurmaz. Allowlist'li bir marked renderer'ı ve Vitest testleriyle güvenli bir mesaj component'i yazıyor, CSP img-src'nin sızıntıyı Chromium'da kestiğini gösteriyor, structured output'u katalogla doğruluyor, modeli SQL yerine sorgu şablonu parametrelerine sınırlıyor ve doğru numarayla gösterilmiş bir kaynağın yanlış iddia taşıyabildiğini ölçüyoruz.
Excessive Agency: Tool Yetkisini Daraltmak, Kullanıcı Adına Çalışmak ve Otonomiyi Sınırlamak
Excessive Agency'nin çaresi modeli daha akıllı yapmak değil, elindeki tool'ları, yetkileri ve otonomiyi daraltmaktır. Bookstore asistanında iptal tool'unu önizleme ve kullanıcı onayına bölüyor, PostgreSQL'de yalnız SELECT yetkili bir rol, kullanıcı token'ıyla downstream çağrı, tutar eşiği, rate limit, FunctionInvoker ile çağrı bütçesi ve audit trail kuruyor, qwen3:4b'nin "tüm siparişlerimi iptal et" isteğindeki gerçek davranışını izliyoruz.
Hassas Veri ve Hidden Context İfşası: System Prompt, RAG Context'i ve Sağlayıcıya Giden Veri
Modele verilen her şey, system prompt ve tool şemaları dahil, kullanıcıya verilmiş sayılmalı; sır ve yetki kararı prompt'ta değil kodda durur. System prompt'taki bir indirim kodunun 10/10 sızdığını ve reasoning çıktısında saklandığını gösteriyor, sağlayıcıya giden kişisel veriyi HMAC redactor'lı bir DelegatingChatClient ile maskeliyor, KVKK ve telemetry'deki içerik kaydı ayarlarına bakıyoruz.
Prompt Injection'a Katmanlı Savunma: Direct, Indirect ve Multimodal Injection, Spotlighting ve Privilege Separation
Prompt injection'ı tek bir önlem durdurmaz; asıl koruma modelin kandırıldığında yapabileceklerini kodda sınırlamaktır, spotlighting ve classifier'lar yalnız ek katmandır. Zararsız bir canary ile ayraç, datamarking, encoding, yerel classifier, görsel taraması ve quarantined model mimarisini gemma3 üzerinde ölçüyor, her katmanın neyi kaçırdığını gerçek sayılarla gösteriyoruz.
LLM Uygulamasının Tehdit Modeli: Trust Boundary'ler ve OWASP LLM Top 10 2026 Haritası
LLM uygulamasında model bir güvenlik sınırı değildir: system prompt, kullanıcı mesajı ve retrieval'dan gelen doküman aynı token akışında buluşur, bu yüzden yetki ve doğrulama kararları kodda verilir. Bookstore.Assistant'ın veri akışını trust boundary'leriyle çiziyor, zararsız bir canary yorumunun iki yerel modelde 10/10 uygulandığını gösteriyor ve OWASP LLM Top 10 2026 ile Agentic Top 10 maddelerini sistemin parçalarına eşliyoruz.
Agentic RAG ve GraphRAG: Klasik RAG Ne Zaman Yetmez?
Klasik RAG cevabı tek yerde duran soruların çoğunu çözer; multi-hop sorularda retrieval'ı tool yapan agent doğru kaynağı buldu ama 3 çağrı, 11 kat token ve 30 kat süre harcadı. GraphRAG'in ilk adımı küçük modelde parçalı entity'ler üretti; bütün corpus'u prompt'a koyan long context klasik RAG'le 7/10'da berabere kaldı.
RAG'i Ölçmek: Recall@k, MRR, nDCG, Faithfulness ve Groundedness
RAG'i ölçmek, retrieval'ı etiketli kaynakla (recall@k, MRR, nDCG) ve generation'ı yargıç bir LLM'le (groundedness, relevance) ayrı ayrı ölçmek demek. 30 soruda dört retrieval yöntemini C#'ta karşılaştırıyor, Microsoft.Extensions.AI.Evaluation'ın soruyu ıskalayan bir cevaba 5 verdiğini gösteriyor ve response cache'le 1 dk 42 sn'lik testi 1,1 sn'ye indiriyoruz.
RAG'de Yetki ve Güvenlik: Doküman Seviyesi Permission, Multi-tenant Filtre ve Indirect Prompt Injection
RAG'de yetki prompt'taki bir rica değil, retrieval sorgusunun WHERE cümlesidir: "bunu gösterme" denen gemma3:4b personel indirimini müşteriye söyledi. Tenant ve ACL'i token'dan alıp EF Core 10 isimli query filter'larıyla sorguya koyuyor, HNSW filtresinin 10 yerine 1 sonuç döndürmesini ve zehirli bir okur yorumunun kart numarası istemesini ölçüyoruz.