# VC-072 · LLM aracına okuma görevi için silme ve geniş veri erişimi veriliyor

Sipariş durumunu anlatan asistan genel bir veri aracını kullanıyor. Modelin önerdiği silme işlemi veya başka kullanıcıya ait kayıt isteği sunucuda görev sınırıyla engellenmiyor.

- Önem: YÜKSEK. Etkisi büyük. Sıradan bir üye hesabı yeter ve tahminle bulunur.
- Önem notu: Hesaplı kullanıcının yönlendirebildiği asistanın gereksiz yazma yetkisi veya başka hesapların kayıtlarına erişimi varsayılır. Yalnız açık katalog okuyan ve sunucuda daraltılmış araç aynı riski taşımaz. Promptta salt okunur demek yetkiyi daraltmaz.
- Eksen ve kategori: Güvenlik, 10 Uygulama içi LLM özellikleri
- Yığın: Node.js, Her yığın
- Yapay zekâ kodunda: ölçülmedi. Dayanak: uzman görüşü.
- Ne zaman bakılır: LLM özelliği eklerken, Her ay
- CWE: CWE-250, CWE-862
- OWASP Top 10:2025: A01:2025 Broken Access Control
- OWASP LLM: LLM03:2026
- Checklist ifadesi: LLM'e verilen araçlar görevin gerektirdiğiyle sınırlı, silme ve geniş veri erişimi yok.
- Son inceleme: 4 Ekim 2026, Komünite editörlüğü
- Adres: https://vibecheck.komunite.com.tr/madde/llm-araclari-gorevin-gerektirdiginden-fazla-yetkili

## 60 saniyelik kontrol

Yalnız kendi uygulamanda ya da yazılı izin aldığın sistemde dene. Bu bir sızma testi değildir.

1. Asistanın ürün görevini ve sunucuda gerçekten çağırabildiği işlemleri yan yana yaz.
2. Okuma görevi için silme, güncelleme veya genel sorgu aracının açık kalıp kalmadığını incele.
3. Yerel yapay araç çağrısında izin dışı işlemin hiçbir veriyi değiştirmediğini doğrula.
4. Başka test kullanıcısının kaydı istenince boş sonuç veya ret gelmesini dene.
5. Kullanıcı kimliğinin model argümanından değil doğrulanmış oturumdan geldiğini kontrol et.

## Ne oluyor

Asistanın görevi kullanıcının sipariş durumunu anlatmak. Bunun için mevcut yönetim aracını modele bağlıyorsun. Araç kayıt okuyabiliyor ama aynı zamanda silebiliyor ve farklı hesapların verilerine ulaşabiliyor. Normal soruda model yalnız okuma yaptığı için bu ek yetkiler görünmüyor. Ürünün ihtiyacı dar kalırken uygulamanın modele açtığı işlem alanı genişliyor.

Promptta yalnız bilgi ver yazması, sunucunun silme çağrısını reddedeceği anlamına gelmez. Modelin önerdiği işlem araca ulaştığında hangi işlemin gerçekten çalışabileceğini uygulama belirler. Model yanlış bir öneri yaptığında veya güvenilmeyen içerikten etkilendiğinde fazla yetki zararı büyütür. Bu nedenle görev tanımıyla çalıştırılabilir araç kümesini birlikte incelemek gerekir.

Araç argümanındaki kullanıcı kimliği de aynı sınırın parçasıdır. Modelin hangi hesabı okuyacağını seçmesi, doğrulanmış kullanıcının yetkisini temsil etmez. Kullanıcı kendi siparişini sorarken uygulama oturumdan gelen kimliği sorguya eklemelidir. Araç adı dar olsa bile arkasındaki veri erişimi tüm hesapları kapsıyorsa asistan görevinin ötesinde yetki kullanır.

## Gerçek olay

Bu maddede belirli bir uygulamaya ait doğrulanmış silme vakası yok. [OWASP LLM03:2026](https://raw.githubusercontent.com/GenAI-Security-Project/GenAI-LLM-Top10/main/2026/final/LLM03_ExcessiveAgency.md), fazla işlev, fazla izin ve fazla özerkliği ayrı kaynaklar olarak ele alır. Okuma için bağlanan aracın yazma yapabilmesi ve kişisel görevde geniş servis hesabı kullanılması bu çerçevedeki örneklerdir.

[CWE-250](https://cwe.mitre.org/data/definitions/250.html) gereksiz yetkiyle çalışmayı, [CWE-862](https://cwe.mitre.org/data/definitions/862.html) eksik yetki denetimini sınıflandırır. Yerel örnekte yapay siparişler ve bellek içi SQLite veritabanı kullanılır. Hatalı araç silme önerisini çalıştırır. İyi araç öneriyi reddeder ve yalnız oturum sahibinin kaydını okuyabilir. Gerçek LLM, canlı sipariş, ödeme veya uzak servis çağrısı yoktur. Test model davranışını değil, sunucunun verdiği yetkiyi karşılaştırır.

## Yapay zekâ bunu neden üretiyor

**Mevcut genel araç yeniden kullanılır.** Ajan siparişleri okuyacak yeni işlev yazmak yerine yönetim panelinin hazır veri aracını bağlayabilir. Daha az kodla çalışan bir demo çıkar. Fakat yönetici için gerekli işlemler son kullanıcının asistanına da taşınır. Yeniden kullanım sırasında çağıranın görevi ve kimliği değiştiği halde yetki aynı kalır.

**Araç tanımı denetim yerine geçer.** Modelin gördüğü açıklamaya salt okunur yazılması güvenli sınır gibi değerlendirilebilir. Sunucudaki dispatch kodu hâlâ başka işlem adlarını kabul ediyorsa açıklama bu yolu kapatmaz. Görünür araç listesini ve çalıştırıcıyı ayrı incelemek gerekir. İkisi zaman içinde farklı değişikliklerle birbirinden uzaklaşabilir.

**Kullanıcı kimliği kolay argüman olur.** Ajan sorgu işlevine kullanıcı numarası ekler ve değeri modele doldurtur. Fonksiyon biçim olarak düzenli görünür. Ancak bu alanın geçerli bir kimlik olması, çağıranın o kimliğe ait veriyi okuyabileceğini göstermez. Yetki için güvenilir oturum bağlamı gereklidir.

**Tek normal konuşma yeterli sanılır.** Asistan kendi siparişini doğru anlatınca entegrasyon tamamlandı kabul edilebilir. Silme önerisi, ek alan veya başka hesabın kayıt numarası hiç denenmez. Bu testler modelin her zaman yanlış davranacağını varsaymaz, yanlış öneri geldiğinde sınırın korunup korunmadığını sorar. Buradaki açıklamalar üretim mekanizmasına ilişkin çıkarımdır. AI kodlarında hata sıklığını gösteren ölçüm değildir.

## Etki

Gereksiz yazma yetkisi kayıt değiştirme veya silme sonucunu doğurabilir. Geniş okuma yetkisi başka müşterilerin sipariş ayrıntılarını açabilir. Zarar aracın gerçekten eriştiği sisteme ve kimliğin izinlerine bağlıdır. Aynı model yanıtı dar bir araçta reddedilirken genel yönetim aracında etkili olabilir.

Araç çağrısının başarılı sonucu konuşmaya geri döndüğünde kullanıcı yetkisiz işlem yapıldığını anlamayabilir. Bu nedenle yalnız asistanın cevap metnine bakmak yeterli değildir. Veri durumu ve yapılan servis çağrıları da gözlenmelidir. Bir hata mesajının dönmesi, ondan önce hiçbir değişiklik yapılmadığını tek başına kanıtlamaz.

## Nasıl anlarsın

Önce ürün görevini tek cümleyle yaz. Ardından modelin araç listesini, sunucunun kabul ettiği işlem adlarını ve alt servisin izinlerini çıkar. Sipariş durumunu anlatmak için kayıt silme neden mevcut? Kullanıcı kimliğini kim belirliyor? Araç açıklamasından gerçek sorguya kadar bağlantıyı takip et.

Yerel yapay çağrıda silme önerisini dene. Retten sonra kayıt sayısı ve içerik değişmemeli. Başka test hesabının siparişini okumak sonuç vermemeli. Ek kullanıcı alanı gönderildiğinde katı şema bunu reddetmeli. Son olarak oturum sahibinin geçerli siparişi okunmalı. Bu kontrolleri canlı kayıtlar yerine ayrılmış test verisinde yap.

## Nasıl düzeltirsin

1. **İşlem kümesini daralt.** Görev yalnız okumaysa sunucuda yalnız gerekli okuma işlevini kabul et. Genel yönetim aracını modelin kullanımına açma. Kullanılmayan eski araç tanımlarını ve çalıştırma yollarını birlikte kaldır.
2. **Çağrıyı katı doğrula.** Araç adı, kayıt kimliği ve alan kümesi uygulamada tanımlı olsun. Bilinmeyen işlem ve ek alanlar çalıştırıcıya ulaşmadan reddedilsin. Örnekte [Zod şeması](https://zod.dev/api) yalnız sabit okuma işlemini kabul eder. Şema tek başına kayıt yetkisi vermez.
3. **Kapsamı oturuma bağla.** Sunucunun doğruladığı kullanıcı kimliğini sorguya ekle. Model veya istemci bu değeri değiştiremesin. Örnek parametreli sorgu kaydı hem numarasıyla hem sahibiyle seçer. Oturum doğrulamasının kendisi örneğin dışında, çağıranın sorumluluğundadır.
4. **Alt izni de azalt.** Gerçek veritabanı veya servis kimliğine gereken okuma kapsamını ver. Örneğin SQLite bağlantısı rol yönetimi kurmaz. Üretimde dar sunucu işlevinin yanında servis izinlerini de doğrulaman gerekir. Yazma gerektiren ayrı görevler kendi yetki ve onay akışını taşımalıdır.

## Bir daha olmasın

Her yeni araç için gerekli işlem ve kayıt kapsamını testle göster. Ret testinde sonuçla birlikte verinin değişmediğini kontrol et.

## Sınır

Bu madde uygulama içindeki LLM araçlarının gereksiz yetkisini kapsar. Model çıktısını kod olarak yürütmek ve geliştirme ajanını sınırsız kipte çalıştırmak ayrı arızalardır. Gereken, sınırlandırılmış ve yetkilendirilmiş bir yazma aracı tek başına hata değildir. Her düşük etkili okuma için kullanıcı onayı istemek de bu düzeltmenin şartı değildir.

## Düzeltme kodları

### Node.js: Dar işlem ve sunucu kullanıcı kapsamı

Önce:

```js
// asistan/siparis-araci.js, açıklama amaçlı. session sunucuda doğrulanmıştır.
import { z } from 'zod';
const Call = z.object({
  tool: z.enum(['readOrder', 'deleteOrder']),
  orderId: z.string().min(1).max(80),
}).strict();
export function execute(db, session, raw) {
  if (!session?.userId) throw new Error('Oturum gerekli');
  const call = Call.parse(raw);
  // Asistanın yalnız okuma görevi olmasına rağmen genel araç sunulur.
  if (call.tool === 'deleteOrder') {
    return db.prepare('DELETE FROM orders WHERE id = ?').run(call.orderId);
  }
  return db.prepare('SELECT id, status FROM orders WHERE id = ?')
    .get(call.orderId) ?? null;
}
```

Sonra:

```js
// asistan/siparis-araci.js, açıklama amaçlı. session sunucuda doğrulanmıştır.
import { z } from 'zod';
const Call = z.object({
  tool: z.literal('readOrder'),
  orderId: z.string().min(1).max(80),
}).strict();
export function execute(db, session, raw) {
  if (!session?.userId) throw new Error('Oturum gerekli');
  // Model başka araç veya kullanıcı kimliği ekleyemez.
  const call = Call.parse(raw);
  const query = db.prepare(`
    SELECT id, status FROM orders
    WHERE id = ? AND owner_id = ?
  `);
  // Üretimde bağlantı kimliği de yalnız gerekli okuma iznine sahip olmalı.
  return query.get(call.orderId, session.userId) ?? null;
}
```

Düzeltmeyi kanıtlayan test:

```js
// asistan/siparis-araci.test.mjs, açıklama amaçlı. Yalnız bellek içi yapay veri.
import test from 'node:test';
import assert from 'node:assert/strict';
import { DatabaseSync } from 'node:sqlite';
const { execute } = await import(process.env.ORNEK_DOSYA);
test('okuma asistanı silmez ve başka hesabın kaydını okuyamaz', () => {
  const db = new DatabaseSync(':memory:');
  try {
    db.exec(`CREATE TABLE orders(id TEXT PRIMARY KEY, owner_id TEXT, status TEXT);
      INSERT INTO orders VALUES ('a', 'u1', 'hazır'), ('b', 'u2', 'bekliyor');`);
    const session = { userId: 'u1' };
    assert.throws(() => execute(db, session, { tool: 'deleteOrder', orderId: 'a' }));
    assert.equal(db.prepare('SELECT count(*) AS n FROM orders').get().n, 2);
    assert.equal(execute(db, session, { tool: 'readOrder', orderId: 'b' }), null);
    const own = execute(db, session, { tool: 'readOrder', orderId: 'a' });
    assert.equal(own.id, 'a');
    assert.equal(own.status, 'hazır');
    assert.throws(() => execute(db, session, { tool: 'readOrder', orderId: 'b', userId: 'u2' }));
    assert.throws(() => execute(db, null, { tool: 'readOrder', orderId: 'a' }));
    assert.equal(db.prepare('SELECT status FROM orders WHERE id = ?').get('a').status, 'hazır');
  } finally { db.close(); }
});
```

## Ajan kuralı (AGENTS.md)

```md
## Araç görevin ötesinde yetkili (vibecheck VC-072)
- Model yalnız görev için gereken araçları çağırabilir.
- Araç adı ve argümanları sunucuda katı şemayla doğrulanır.
- Kullanıcı kapsamı doğrulanmış oturumdan alınır, modelden alınmaz.
- Salt okunur görevlere yazma ve genel komut araçları açılmaz.
- Alt servis kimliği de gereken en dar yetkiyle çalışır.
- Reddedilen çağrının yan etki oluşturmadığı test edilir.
```

## Kaynaklar

1. [LLM03:2026 Excessive Agency](https://raw.githubusercontent.com/GenAI-Security-Project/GenAI-LLM-Top10/main/2026/final/LLM03_ExcessiveAgency.md), OWASP
2. [CWE-250 Execution with Unnecessary Privileges](https://cwe.mitre.org/data/definitions/250.html), MITRE
3. [CWE-862: Missing Authorization](https://cwe.mitre.org/data/definitions/862.html), MITRE
4. [Zod Defining Schemas](https://zod.dev/api), Zod
5. [Node.js SQLite parameter binding](https://nodejs.org/api/sqlite.html), Node.js

---

vibecheck · Komünite editörlüğü. Metin CC BY 4.0, prompt ve kural parçaları MIT-0. Kaynak: https://vibecheck.komunite.com.tr/madde/llm-araclari-gorevin-gerektirdiginden-fazla-yetkili
