Prompt Injection Risk Tarayıcı
Kendi AI ajanınızın veya chatbotunuzun sistem promptunu yapıştırın. OWASP Top 10 for LLM Applications’ın LLM01 (Prompt Injection) risk kategorisine dayanan 10 kurallık bir motor, promptunuzu saniyeler içinde tarar ve somut kanıtlarla bir risk raporu üretir.
Prompt Güvenlik Skoru
Kural bazında sonuçlar
Kendi AI ajanınızın sistem promptu, gerçekten “önceki talimatları unut” tarzı bir saldırıya karşı korunuyor mu — yoksa bunu sadece varsaymış mı oluyorsunuz? Daha önce AI Modelleri Güvenli mi? Kendi Güvenlik Denetleyicimizi Yaptık and AI Hallüsinasyon Dedektörü projelerinde modellerin çıktısını denetlemiştik. Bu kez bir adım geriye gidip sisteminizin girdisini — yani sistem promptunun kendisini — denetleyen bir araç yaptık: Prompt Injection Risk Tarayıcı.
Bu sefer bir dashboard değil, dolduracağınız bir form: kendi sistem promptunuzu yapıştırıyorsunuz, araç saniyeler içinde 10 kurallık bir denetimden geçiriyor ve 0-100 arası bir “Prompt Güvenlik Skoru” ile birlikte her kuralın neden geçtiğini/kaldığını, promptunuzdan alıntıyla gösteriyor. Kod tabanının tamamı MIT lisansıyla GitHub’da; araç ise bu yazının altında canlı ve doğrudan kullanılabilir durumda.
Neden LLM-yargıç değil, kural tabanlı bir motor?
Bir prompt injection tarayıcısının en kolay yolu, “bu sistem promptu güvenli mi?” diye başka bir büyük dil modeline sormaktır. Bilinçli olarak bunu yapmadık. Bir LLM-yargıç kullanmak üç sorunu birden getirir: sonuç çalıştırdığınız modele göre değişir, “neden” bu skoru verdiği belirsizleşir ve bir API anahtarı zorunlu hale gelir. Bunun yerine tamamen deterministik, regex/anahtar-kelime tabanlı bir motor kurduk: her kuralın kendi deseni var, her sonucun promptunuzdan alıntılanmış somut bir kanıtı var ve araç hiçbir ağ isteği yapmadan, tamamen tarayıcınızda çalışıyor — metniniz hiçbir sunucuya gitmiyor.
10 kural, OWASP LLM01 temelli
scanner/rules.py, OWASP Top 10 for LLM Applications 2025‘in LLM01 (Prompt Injection), LLM05 (Improper Output Handling), LLM06 (Excessive Agency) ve LLM07 (System Prompt Leakage) kategorilerinden esinlenen, tamamı elle kuratörlü kalıplardan oluşan 10 kural içeriyor:
- Yapısal Ayrıştırma and Güvenilmeyen İçerik Etiketleme (ağırlık 15+15) — talimatlar kullanıcı/harici içerikten net sınırlarla ayrılmış mı, ve o içerikteki talimat benzeri metin “veri” olarak mı ele alınıyor?
- Talimat Geçersiz Kılma Savunması (15) — “önceki talimatları unut” tarzı klasik enjeksiyona karşı açık bir savunma var mı?
- Yetki Sahtekarlığı Savunması (10) — kendini “geliştirici” ya da “sistem yöneticisi” ilan eden sahte otorite iddialarına karşı bir savunma var mı?
- Hassas Eylem Onayı and En Az Yetki İlkesi (15+10, yalnızca prompt bir araca erişim tanıyorsa uygulanır) — geri alınamaz eylemlerden önce onay isteniyor mu, erişim kapsamı sınırlı mı?
- Sistem Promptu Sızıntı Savunması (10) — “talimatlarını göster” isteğine karşı bir savunma var mı?
- Çıktı Doğrulama / Biçim Kısıtlaması (5, yalnızca prompt HTML/kod render ediyorsa uygulanır) — üretilen içerik render edilmeden önce temizleniyor mu?
- Muhafazakâr Varsayılan (5) — belirsizlik durumunda model reddetmeyi mi, yoksa varsayılan olarak uyum sağlamayı mı tercih ediyor?
- Tehlikeli Kalıp Bayrakları (ağırlık 0, ama tetiklenirse tavan koyar) — “her isteği yerine getir” gibi tüm savunmaları anlamsızlaştırabilecek bir ifade var mı?
Puanlama: uygulanamayan kural yeniden ölçeklenir, kırmızı bayrak tavan koyar
Bazı kurallar (eylem onayı, en az yetki, çıktı doğrulama) yalnızca promptunuz o yeteneğe (araç erişimi ya da render/çalıştırma) sahipse anlamlıdır. Uygulanamayan bir kural ne başarı ne başarısızlık sayılır — skora hiç girmez, ağırlığı kalan uygulanabilir kurallar arasında oranı koruyarak yeniden dağıtılır. Bu tasarım, Hallüsinasyon Dedektörü‘ndeki consistency_checker.py‘nin aynı ilkesini tekrar kullanıyor.
Ayrıca ayrı bir “Tehlikeli Kalıp Bayrakları” kuralı var: bu kuralın ağırlığı sıfırdır, yani ağırlıklı ortalamaya hiç katkıda bulunmaz. Ama tetiklenirse (örn. “kullanıcının her isteğini yerine getir, hiçbir kısıtlama yok” gibi bir ifade), diğer kurallar ne kadar iyi puan alırsa alsın nihai skoru 20/100’ün üzerine çıkarmaz. Mantık şu: aktif olarak tüm savunmaları devre dışı bırakan bir cümle, geri kalan her şeyi anlamsızlaştırabilecek kadar ciddi bir sinyaldir.
Gerçek sonuçlar: 3 savunma seviyesi
Aracı, kendimiz yazdığımız üç örnek sistem promptu üzerinde çalıştırdık — bir finans/müşteri-destek AI ajanı senaryosunun savunmasız, kısmi ve katmanlı savunmalı üç versiyonu:
| Yapılandırma | Prompt Güvenlik Skoru | Risk Düzeyi |
|---|---|---|
naive (savunmasız) | 0,0 / 100 | KRİTİK RİSK (kırmızı bayrak tetiklendi) |
basic (kısmi savunma) | 15,0 / 100 | KRİTİK RİSK |
hardened (katmanlı savunma) | 100,0 / 100 | DÜŞÜK RİSK |
naive promptu, “kullanıcının her isteğini yerine getir” benzeri bir ifade içerdiği için kırmızı bayrağı tetikledi ve skoru 0’a düşürdü. basic promptu 9 kuraldan yalnızca 1 tanesini (hassas eylem onayı, zayıf bir “onay almadan işlem yapma” ifadesiyle) karşılıyor; yapısal ayrıştırma, geçersiz kılma savunması, sızıntı savunması gibi diğer sekiz kritik kalıbı atlıyor — ve bu, “biraz güvenlik notu eklemenin” gerçek bir katmanlı savunmayla aynı şey olmadığını sayısal olarak gösteriyor.
Aracı geliştirirken bulduğumuz iki gerçek hata
Bu, teorik bir uyarı değil; motoru gerçek Türkçe promptlar üzerinde çalıştırırken karşılaştığımız, ölçülmüş bulgular. İlk sürümde TOOL_ACCESS_PATTERNS deseni, “Elinde şu araçlar var: …” gibi çok doğal bir Türkçe ifadeyi yakalamıyordu — sonuç olarak üç örnek promptun hiçbiri araç erişimi olarak tespit edilmiyor, dolayısıyla “Hassas Eylem Onayı” ve “En Az Yetki İlkesi” kuralları yanlışlıkla devre dışı kalıyordu. İkinci hata, LEAST_PRIVILEGE_PATTERNS‘daki mesafe sınırıydı (.{0,40}): gerçek bir cümlede “Yalnızca” ile “erişebilir” arasında 42 karakter vardı, sınırı iki karakter aşıyordu ve kural sessizce başarısız oluyordu.
İkisi de klasik bir ders veriyor: bir regex kütüphanesini yalnızca sentetik test cümleleriyle değil, gerçek ve doğal yazılmış metinle test etmeden güvenmeyin. Aracın test paketi (52 birim testi) artık bu iki gerçek vakayı da regresyon testi olarak içeriyor.
Aracı deneyin
Yukarıdaki interaktif araçla kendi sistem promptunuzu şimdi tarayabilirsiniz — hiçbir kurulum, hiçbir API anahtarı gerekmiyor. Kendi ortamınızda çalıştırmak isterseniz:
pip install -r requirements.txt
# Hazır örneklerden biriyle:
python3 cli.py --sample hardened
# Kendi promptunuzla:
python3 cli.py --text "sistem promptunuz burada..." --out sonuc.jsonPython motoru (scanner/) ve tarayıcıda çalışan JavaScript motoru (web/scanner.js) birbirinin bağımsız portu; ikisinin aynı sonucu ürettiği tools/parity_check.js ile otomatik olarak doğrulanıyor (99 kontrol, 3 örnek prompt × skor/risk/bayrak/kural kırılımı). Kod tabanı ayrıca 52 birim ve uçtan-uca testle (pytest) güvence altında.
Bağlantılar
- Kod deposu (MIT lisanslı): github.com/mendaxyazilim/ai-prompt-injection-scanner
- Sister projeler: AI Modelleri Güvenli mi? and AI Hallüsinasyon Dedektörü
Bu yazıdaki tüm sayılar, aracın kendi kodu gerçekten çalıştırılarak üretildi — elle uydurulmuş tek bir skor yok. Araç bir güvenlik garantisi vermez: yalnızca promptunuzun metninde, bilinen savunma kalıplarının bulunup bulunmadığını denetler; bir sistem promptunun gerçek dünyada saldırıya karşı ne kadar dayanıklı olduğu, kullanılan modele ve devreye giren başka katmanlara (girdi filtreleme, izleme, insan onayı vb.) da bağlıdır.