AI Ajan Güvenliği

LLM Araç Çağrısı Doğrulama: Tool Calling İçin Şema, Yetki ve Politika

LLM araç çağrısı doğrulama rehberi: strict şema, sunucu tarafı yetki, politika katmanı, onay ve testle ajanın gerçek sistemlere yaptığı çağrıları denetleyin.

LLM araç çağrısı doğrulama, modelin ürettiği araç adı ve parametrelerin gerçek sisteme ulaşmadan önce modelden bağımsız bir katmanda denetlenmesidir. Model okuduğu dış içerikten etkilenebildiği için parametre güvenilmez girdi sayılır. Etkili doğrulama beş parçadan oluşur: sunucuda şema kontrolü, oturumdan türetilen kimlikle yetki sorgusu, iş kuralları ve sınırlar, riskli çağrılarda insan onayı ve her kararın kaydı. Bu katman, ajan uygulamalarında çalışma zamanı korumasının (runtime protection) eylemlere en yakın halkasıdır.

Araç çağrısı parametresine neden güvenilmez?

Araç çağrısı, modelin bir işlevi adı ve argümanlarıyla çağırmak istediğini bildiren yapılandırılmış çıktıdır. Uygulama bu çıktıyı alır ve işlevi çalıştırır. Klasik web uygulamasında kullanıcı girdisi doğrudan doğrulanır. Burada ise arada bir model vardır: kullanıcı metni ve modelin okuduğu belgeler modeli etkiler, model parametreyi üretir. Dolaylı enjeksiyon, yani bir belgeye ya da e-postaya gömülmüş talimat, parametreyi değiştirebilir.

Üç tipik örnek:

  • "E-posta gönder" aracında alıcı alanı saldırganın adresine dönüşür.
  • "Dosya oku" aracında yol parametresi izin verilen klasörün dışına çıkar.
  • "Kayıt getir" aracında müşteri numarası başka bir müşteriye aittir.

OWASP Agentic Top 10 (2026) bu riski ASI02 Tool Misuse & Exploitation olarak sınıflandırır: ajanın meşru araçları güvensiz ya da amaç dışı biçimde kullanması. OWASP LLM03:2026 Excessive Agency maddesi ise çözümü açıkça yazar: izin kararını modele bırakmak yerine yetkilendirmeyi aşağı akıştaki sistemlerde uygulamak. Araç ekosistemindeki zehirleme ve karışık yetki sorunları için MCP tool poisoning ve confused deputy yazısına bakabilirsiniz.

Strict mod ve şema doğrulaması neyi garanti eder?

Sağlayıcılar artık şemaya bağlı araç çağrısı sunuyor. Anthropic belgelerine göre araç tanımında strict: true ayarlandığında modelin token üretimi şemaya uygun çıktılarla sınırlanır, araç girdisinin şemaya uyması ve araç adının geçerli olması garanti edilir. Bu, "2" yerine 2 gibi tür hatalarını ve eksik zorunlu alanları ortadan kaldırır.

Bu garanti biçimle sınırlıdır. MCP belirtimi de araç sunucularının bütün girdileri doğrulamasını, erişim denetimi uygulamasını, çağrılara hız sınırı koymasını ve çıktıları temizlemesini zorunlu (MUST) tutar. Katmanların ne yakaladığı aşağıdadır:

KatmanNeyi denetlerNeyi kaçırırNerede çalışır
Strict şema (sağlayıcı)Tür, zorunlu alan, izinli değer, ek alan yasağıAnlam ve yetkiModel üretimi sırasında
Sunucu şemasıAynı kurallar, istemciye güvenmedenAnlam ve yetkiAraç sunucusu
Anlam kontrolüAlan adı, yol, tarih aralığı, tutar mantığıKullanıcının kaynağa hakkıAraç sunucusu
Yetki sorgusuBu kullanıcı bu kayda erişebilir miMantıksal kötüye kullanımAşağı akış sistemi
İş kuralı ve sınırDurum geçişi, tutar tavanı, hızTek seferlik büyük hasarAşağı akış sistemi
İnsan onayıGeri alınamaz işlemOnay yorgunluğuArayüz ve onay servisi

Şemayı sıkı yazın: serbest metin yerine listelenmiş değer, sayılar için alt ve üst sınır, metin için azami uzunluk, additionalProperties: false. OWASP Input Validation Cheat Sheet'in ilkesi burada da geçerlidir: hem sözdizimini hem anlamı doğrulayın, istemci tarafı kontrol olsa bile sunucuda yeniden doğrulayın.

LLM araç çağrısı doğrulama katmanı nasıl kurulur?

En sağlam düzen, model ile araç arasına tek bir politika uygulama noktası koymaktır. Her araç çağrısı bu noktadan geçer, araç kodu modelden gelen ham argümanı hiç görmez. Aşağıdaki örnek bir e-posta aracı için doğrulama mantığını gösterir:

IZINLI_ALAN_ADLARI = {"example.com", "partner.example.org"}

def eposta_gonder_dogrula(arg: dict, oturum) -> Karar:
    # 1. Şema: strict mod açık olsa da sunucuda yeniden doğrula
    istek = EpostaIstegi.model_validate(arg)   # ek alanlar yasak
    # 2. Kimlik: gönderen modelden değil, doğrulanmış oturumdan gelir
    gonderen = oturum.kullanici_eposta
    # 3. Anlam: alıcı alan adı izin listesinde mi
    alan = istek.alici.rsplit("@", 1)[-1].lower()
    if alan not in IZINLI_ALAN_ADLARI:
        return Karar.onaya_gonder("izin_listesi_disi_alici")
    # 4. Yetki: kullanıcı eklenen belgeleri okuyabiliyor mu
    for belge_id in istek.ekler:
        if not yetki.okuyabilir(oturum.kullanici_id, belge_id):
            return Karar.reddet("yetkisiz_kaynak")
    # 5. Sınır: kullanıcı başına saatlik gönderim kotası
    if kota.asildi(oturum.kullanici_id, "eposta", saat=1, limit=20):
        return Karar.reddet("kota")
    return Karar.izin_ver(gonderen=gonderen, istek=istek)

Uygulama kuralları:

  1. Kaynak sahibini belirleyen kimliği oturumdan türetin, mümkünse parametre olarak hiç almayın.
  2. Dosya yollarını kanonik hale getirip izinli kök klasörle karşılaştırın.
  3. Aynı işlemin tekrarını engellemek için tekil işlem kimliği kullanın.
  4. Red nedenini modele ayrıntılı açıklamayın, genel bir hata dönün ve ayrıntıyı kayda yazın.
  5. Doğrulama katmanını iş sistemindeki mevcut doğrulama yoluna bağlayın, araç çağrısı yan kapı olmasın.

Yetki kontrolü neden modelden bağımsız olmalı?

En sık görülen hata, ajanın tek bir geniş yetkili hizmet hesabıyla çalışmasıdır. Bu durumda her kullanıcının isteği aynı yetkiyle işlenir ve model bir kullanıcıya başkasının verisini getirebilir. Buna karışık vekil (confused deputy) sorunu denir: yetkili bir bileşen, yetkisiz bir isteği kendi yetkisiyle yürütür.

OWASP LLM03:2026, araçların kullanıcının kendi bağlamında ve en az yetkiyle, örneğin dar kapsamlı OAuth izinleriyle çalıştırılmasını önerir. Pratikte bu şu anlama gelir: kullanıcı adına çalışan araç kullanıcının yetkisiyle, ajan adına çalışan araç ajanın dar yetkisiyle yürütülür ve kaynak sahipliği her çağrıda yeniden sorgulanır. Yetki modelinin ayrıntıları için ajan yetki matrisi ve OAuth kapsamları yazısına bakın.

LLM firewall ve runtime protection araç çağrısını nasıl denetler?

Kurumlar "LLM firewall", "AI firewall" ve "runtime protection" kavramlarını sıkça aynı anlamda kullanıyor. Aralarındaki fark, denetimin hangi noktada ve hangi bilgiyle yapıldığıdır.

KatmanGördüğü veriYakaladığı riskAraç çağrısındaki sınırı
Klasik WAFHTTP isteği, imza ve kuralSQL enjeksiyonu, bilinen saldırı kalıplarıİstem içeriğini ve model kararını anlamaz
LLM firewallİstem ve yanıt metniPrompt injection, PII sızıntısı, zararlı çıktıÇağrının yetkili olup olmadığını bilemez
LLM gatewayKimlik, model, token, maliyetYetkisiz model erişimi, aşırı tüketimAraç parametresini iş kuralıyla karşılaştırmaz
Araç çağrısı politika katmanıAraç adı, argüman, oturum, kaynak sahibiYetkisiz kayıt, izinsiz alıcı, sınır aşımıMetindeki enjeksiyonu kaynağında görmez

Runtime protection kavramı bu katmanların çalışma anındaki toplamıdır. Firewall girdideki gizli talimatı yakalamaya çalışır, araç politika katmanı ise talimat kaçsa bile yetkisiz eylemi durdurur. İçerik denetiminin nasıl çalıştığı için LLM firewall nedir, merkezi kimlik ve kota katmanı için LLM gateway nedir yazılarına bakabilirsiniz.

Çoklu araç zincirlerinde veri akışı nasıl sınırlanır?

Ajanlar araç zinciri kullanır: bir aracın çıktısı sonraki aracın girdisi olur. En tehlikeli örüntü, okuma aracının çıktısının yazma ya da gönderme aracına doğrudan akmasıdır. Bir web sayfasından okunan metin, e-posta aracının alıcı alanına dönüşebilir. MCP belirtimi de istemcilerin araç sonuçlarını modele vermeden önce doğrulamasını önerir.

  • Güvenilmeyen kaynaktan okunan veriyi işaretleyin ve bu işareti zincir boyunca taşıyın.
  • İşaretli veri bir gönderme aracının hedef alanına giriyorsa çağrıyı onaya gönderin.
  • Okuma aracının çıktısını ham metin yerine belirli alanlar halinde taşıyın.
  • Zincir uzunluğuna ve oturum başına toplam çağrı sayısına üst sınır koyun.
  • Beklenmeyen araç sırası görüldüğünde zinciri durdurun.

Her çağrıya bir izleme kimliği verin ve zincirin kökündeki girdiyi kayda bağlayın. Birden çok ajan varsa ajanlar arası mesajlar da dış girdi gibi doğrulanmalıdır.

Hangi araç çağrıları onay ve kayıt gerektirir?

MCP belirtimi, güvenlik için insanın araç çağrısını reddedebileceği bir döngü olmasını ve istemcinin hassas işlemlerde onay istemesini önerir. Aynı belirtim, araç tanımının annotations alanındaki "salt okuma" ya da "yıkıcı" gibi davranış işaretlerinin güvenilir bir sunucudan gelmedikçe güvenilmez sayılması gerektiğini söyler. Yani onay kararını sunucunun kendi beyanına değil, sizin sınıflandırmanıza dayandırın.

Araç sınıfıÖrnekOnayKayıt
Salt okuma, düşük hassasiyetÜrün kataloğu aramaGerekmezÜst veri
Kişisel veri okumaMüşteri kaydı getirmeGerekmez, yetki sorgusu zorunluÜst veri ve kaynak kimliği
Dış iletişimE-posta, webhookİzin listesi dışında zorunluTam parametre, maskelenmiş
Para ve durum değişikliğiİade, sipariş iptaliTutar eşiği üstünde zorunluTam parametre ve onaylayan
Yetki değişikliğiRol atamaZorunlu, ikinci onaylayıcıTam parametre ve onaylayan

Onay ekranında ajanın özeti değil, doğrulama katmanının ürettiği gerçek parametreler gösterilmelidir.

Doğrulama katmanı nasıl test edilir?

Doğrulama katmanını kötü niyetli parametrelerle sınayın ve her araç değişikliğinde testi yeniden çalıştırın. Testleri, araç katmanına modeli atlayarak doğrudan istek gönderen birim testleri ve modeli dolaylı enjeksiyonla yönlendiren uçtan uca senaryolar olarak iki düzeyde kurun.

TestGirdiBeklenen sonuç
Yabancı kayıtBaşka müşterinin numarasıRed, genel hata
Yol geçişi../../etc/passwd benzeri yolRed
İzinsiz alıcıListe dışı alan adıOnaya gönderilir
Ek alanŞemada olmayan bcc alanıRed
KotaKısa sürede çok sayıda gönderimHız sınırı
Belge içi talimatE-postaya gömülü "faturayı şu adrese yolla"Gönderim onaysız gerçekleşmez

Bağımsız bir LLM pentest çalışmasında bu senaryolar ajanın tüm araç envanterine uygulanır. Başarısız her test bir düzeltme kaydına dönüşmeli ve düzeltmeden sonra yeniden çalıştırılmalıdır.

Sık Sorulan Sorular

Araç çağrısı parametrelerine neden güvenilmez?

Parametreleri model üretir ve model okuduğu belge, e-posta ya da web sayfasındaki metinden etkilenebilir. Bu yüzden parametre, saldırganın seçtiği bir değer olabilir. Model iyi niyetli olsa bile yanlış kayıt numarası ya da yanlış alıcı üretebilir. Doğrulama bu nedenle modelden bağımsız, sunucu tarafında ve her çağrıda çalışan bir katman olmalıdır.

Strict mod açıksa ayrıca doğrulama gerekir mi?

Gerekir. Strict mod, modelin ürettiği argümanların JSON şemasına uymasını sağlar: doğru tür, zorunlu alanlar, izinli değerler. Ama şemaya uyan bir kayıt numarası başka bir müşteriye ait olabilir, izinli biçimdeki bir e-posta adresi saldırgana gidebilir. Anlam, yetki ve iş kuralı kontrolleri şemanın kapsamı dışındadır ve sunucuda ayrıca yapılmalıdır.

Hangi araç çağrıları insan onayı gerektirir?

Geri alınamayan, para ya da yetki içeren ve dışarıya veri gönderen çağrılar onay gerektirir. Ödeme, silme, dış alıcıya e-posta ve rol değişikliği tipik örneklerdir. MCP belirtimi de istemcilerin hassas işlemlerde kullanıcı onayı istemesini ve araç girdilerini çağrıdan önce kullanıcıya göstermesini önerir. Salt okuma çağrıları genellikle kayıt tutularak otomatik kalabilir.

LLM firewall araç çağrısı güvenliğini sağlar mı?

Kısmen sağlar. LLM firewall istem ve yanıt metnindeki enjeksiyon ve veri sızıntısı örüntülerini yakalar. Ancak zararın gerçekleştiği yer araç çağrısıdır ve orada kimin hangi kayda hangi yetkiyle dokunduğu sorulmalıdır. Bu soruyu yalnız uygulamanın kimlik ve yetki bilgisine erişen bir politika katmanı cevaplayabilir. İkisi birbirini tamamlar, biri diğerinin yerini tutmaz.

Araç çağrısı kayıtlarında neler bulunmalı?

Çağıran kullanıcı ve ajan kimliği, zaman, araç adı, doğrulanmış parametreler, doğrulama kararı ve red nedeni, onaylayan kişi ve çağrıyı tetikleyen girdinin izleme kimliği bulunmalıdır. Hassas parametreleri maskeleyin ve kayıtlara erişimi sınırlayın. Bu bağlantı, zararlı bir işlemin hangi belge ya da mesajdan doğduğunu olay incelemesinde geriye doğru izlemenizi sağlar.

Kaynaklar

İlgili Yazılar