# VC-071 · Sistem promptuna gizli anahtar ve gereksiz iç yapılandırma ekleniyor

Asistanı bilgilendirmek için sunucu yapılandırması bütünüyle modele gönderiliyor. Kullanıcıya görünmeyen prompt, iç kuralların ve anahtarların güvenle saklandığı bir yer sanılıyor.

- Önem: ORTA. Etkisi orta. Sıradan bir üye hesabı yeter ve tahminle bulunur.
- Önem notu: Hesaplı kullanıcının erişebildiği asistanda gereksiz iç işleyiş bilgisinin açığa çıkması temel alınır. Çalışan servis anahtarı, yönetici tokenı veya doğrudan yetki veren sır varsa etki ve önem yükselir. Açık üslup talimatı tek başına açık sayılmaz.
- 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-201
- OWASP Top 10:2025: A01:2025 Broken Access Control
- OWASP LLM: LLM08:2026
- Checklist ifadesi: Sistem promptunda gizli anahtar ve gereksiz iç yapılandırma bulunmuyor.
- Son inceleme: 4 Ekim 2026, Komünite editörlüğü
- Adres: https://vibecheck.komunite.com.tr/madde/sistem-promptunda-sir-ve-gereksiz-ic-bilgi-var

## 60 saniyelik kontrol

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

1. Model isteği oluşturulurken tüm config veya ortam nesnesinin metne çevrilip çevrilmediğine bak.
2. Yerel testte özel alanlara yapay işaretler koy ve oluşturulan mesajlarda bunları ara.
3. Araç anahtarının model mesajında mı yoksa yalnız sunucu bağlantısında mı kaldığını izle.
4. Yeni ve bilinmeyen bir yapılandırma alanının kendiliğinden prompta girmediğini kontrol et.
5. Normal asistan adı, dil ve kullanıcı sorusunun korunmasını doğrula.

## Ne oluyor

Asistanın uygulamanı tanıması için ayar nesnesini sistem promptuna ekliyorsun. Nesnede ürün adı ve yanıt dili var. Aynı yerde servis anahtarı, iç işlem eşikleri veya özel bağlantı bilgisi de duruyor. Ekranda yalnız modelin cevabı göründüğü için bu alanların kullanıcıdan saklı kaldığını düşünmek kolay. Fakat uygulama bilgiyi zaten modelin okuyacağı bağlama taşımış oluyor.

Sistem mesajının ayrı rolü olması onu sır kasası yapmaz. Modelin üretimini yönlendiren bir metin, kullanıcının hiç öğrenemeyeceği bir depolama sınırı değildir. Prompta bunu açıklama talimatı eklemek de sunucu anahtarının teknik olarak ayrılmasını sağlamaz. Önce hangi bilginin göreve gerçekten gerektiğini belirlemek gerekir.

Risk yalnız açıkça anahtar adlı alandan gelmez. Bugün güvenli görünen yapılandırmaya yarın özel bir alan eklenebilir. Tüm nesneyi otomatik aktaran kod bu alanı da sessizce gönderir. Açık alan seçimi bu nedenle önemlidir. Yeni veri, biri kullanım amacını inceleyip seçene kadar model bağlamının dışında kalır. Kullanıcının sorusuna cevap vermek için sunucunun bütün çalışma ayarlarını bilmek çoğu akışta gerekli değildir.

## Gerçek olay

Bu maddede belirli bir üründe doğrulanmış prompttan anahtar sızdırma olayı aktarılmıyor. [OWASP LLM08:2026](https://raw.githubusercontent.com/GenAI-Security-Project/GenAI-LLM-Top10/main/2026/final/LLM08_HiddenContextExposure.md), kullanıcıya gösterilmeyen model bağlamının keşfedilebilir kabul edilmesini önerir. İçerideki bilginin açıklanması saldırganın yapabileceklerini artırıyorsa güvenlik etkisi doğar. Sıradan biçim veya üslup talimatının görünmesi aynı ağırlıkta değildir.

[CWE-201](https://cwe.mitre.org/data/definitions/201.html), gönderilen veriye gereksiz hassas bilgi eklenmesini sınıflandırır. Yerel örnek bu veri akışını sınar. Yapılandırmadaki yapay özel işaretler hatalı sürümün model mesajlarında bulunur. Düzeltilmiş sürüm yalnız açık ayarları seçer. Deney gerçek bir modelin bu bilgiyi kullanıcıya söylediğini kanıtlamaz. Gösterdiği şey, bilginin modele sunulan isteğe girip girmediğidir.

## Yapay zekâ bunu neden üretiyor

**Bağlamı genişletmek kolay çözüm görünür.** Ajan asistana daha çok bilgi vermek için hazır ayar nesnesini kullanabilir. Ürün adını tek tek taşımak yerine bütün nesneyi metne çevirmek kısa sürer. Bunun bedeli, göreve gerekli alanlarla sunucuya özel alanların aynı veri yoluna girmesidir. Daha çok bağlam her alanın gönderilmesi için gerekçe olmaz.

**Sistem rolü saklama garantisi sanılır.** Mesaj rolleri arasındaki ayrım, sistem metninin kullanıcı için ulaşılmaz olduğu varsayımına dönüşebilir. Ajan bu varsayımla bağlantı anahtarını veya iç kuralı talimatın yanına koyar. Oysa modelin erişebildiği verinin açıklanmamasını yalnız model davranışına bağlamak ayrı bir güvenlik kontrolü sağlamaz.

**Bugünkü nesne gelecekteki alanları gizler.** İlk örnekte yapılandırma yalnız açık ürün bilgileri içerir. Sonradan başka iş için özel alan eklenince prompt kurucusu değişmez. Test de eski alanları kontrol ettiği için yeni veri akışını yakalayamaz. Bilinmeyen bir alanın dışarı taşınmadığını sınamak bu bakım hatasını görünür kılar.

**Gizleme talimatı düzeltme diye eklenir.** Ajan sızıntı ihtimalini görünce promptun başına iç bilgileri paylaşma cümlesi yazabilir. Bu, bilginin bağlama alınması kararını değiştirmez. Doğru inceleme hangi alanın neden gönderildiğini sorar. Bu açıklamalar olası üretim mekanizmalarıdır. Kaynaklar AI üretimi kodlarda bu hatanın sıklığını ölçmez ve burada yaygınlık oranı verilmez.

## Etki

İç iş akışının ayrıntısı, hangi alanların veya işlemlerin hedeflenebileceğini gösterebilir. Çalışan bir anahtarın bağlama girmesi daha farklı ve ağır sonuç yaratabilir. Anahtarın gerçek yetkileri başka servise erişim verebilir. Etkiyi belirlerken yalnız promptun uzunluğuna veya gizli etiketi taşımasına bakma, içinde hangi bilginin bulunduğunu incele.

Model isteği ayrıca izleme sistemlerine veya hata günlüklerine kopyalanıyorsa gereksiz veri daha fazla yere taşınabilir. Bu olasılık gönderilmiş gerçek sırların ele alınmasını gerektirir. Alanı yeni isteklerden çıkarmak geçmiş kopyaları kendiliğinden silmez. Yerel test ise gerçek sır tutmaz ve böyle bir geçmiş temizliği yapmaz.

## Nasıl anlarsın

Sistem ve geliştirici mesajlarını kuran işlevleri bul. `JSON.stringify(config)`, ortam değişkenlerinin dökümü, genel bağlam birleştiricileri ve araç sonuçları üzerinden ilerle. Modelin gördüğü son isteği yerel testte yakala. Canlı anahtarları günlüğe basarak kontrol yapma. Özel alanlara yalnız testte kullanılan ayırt edici işaretler koy.

Bilinen özel alanlara ek olarak yeni bir alan ekle. Bu alan da mesajların dışında kalmalı. Normal kullanıcı sorusu, açık asistan adı ve yanıt dili korunmalı. Yalnız bir sözcüğü engelleyen denetim yerine oluşturulan mesajın izin verilen veri biçimini kontrol etmek bakım sırasında daha açıklayıcı kanıt verir. Araç bağlantısındaki kimlik bilgisini ayrıca izle.

## Nasıl düzeltirsin

1. **Gerekli veriyi seç.** Prompt kurucusuna aktarılacak alanları tek tek tanımla. Örnekte asistan adı ve desteklenen dil seçilir. Girdi nesnesindeki diğer alanlar otomatik olarak mesaja taşınmaz. Yeni alan için bilinçli ekleme gerekir.
2. **Anahtarı uygulamada tut.** Model araç adını ve güvenli parametrelerini önerebilir. Servise bağlanan sunucu kodu anahtarı kendi saklama alanından alır. Anahtarın değeri çağrı argümanına, araç sonucuna veya modelin metnine eklenmez.
3. **Yetkiyi ayrıca uygula.** Gizli rol açıklamaları yerine sunucudaki kullanıcı ve işlem denetimini kullan. Kullanıcı promptu öğrense de izin verilen işlemler değişmemeli. Bağlamın saklı kalmasına bağlı bir yönetici geçişi varsa bunu kaldır.
4. **Eski gönderimleri değerlendir.** Gerçek anahtarın daha önce bağlama girdiği doğrulanırsa ilgili serviste anahtar değiştirme ve kayıt incelemesini planla. Yalnız prompt cümlesini değiştirmek geçmiş ifşayı gidermez. Testteki yapay işaret için böyle bir işlem gerekmez.

## Bir daha olmasın

Prompt kurucusunu kendi veri sözleşmesi olan bir sınır gibi incele. Yeni özel yapılandırma alanını ekleyen değişiklik, alanın model isteğine girmediğini de göstermeli.

## Sınır

Bu madde operasyonel sırların ve gereksiz iç bilginin model bağlamına konmasını kapsar. Görev için gerekli kişisel verinin sağlayıcıya aktarımı ayrı değerlendirilir. Genel bir sistem promptunun okunabilmesi tek başına açık değildir. Açık alan seçimi de kullanıcının kendi mesajıyla gönderdiği sırları otomatik temizlemez.

## Düzeltme kodları

### Node.js: Bağlama açık alan seçimi

Önce:

```js
// asistan/baglam.js, açıklama amaçlı. config güvenilir sunucu ayarıdır.
export function messages(config, question) {
  if (typeof question !== 'string' || question.length > 2000) {
    throw new Error('Geçersiz soru');
  }
  // Ürün bilgisiyle birlikte özel sunucu alanları da aktarılır.
  const context = JSON.stringify(config);
  return [
    {
      role: 'system',
      content: `Bu ayarlara göre yardım et. İç bilgileri paylaşma. ${context}`,
    },
    { role: 'user', content: question },
  ];
}
```

Sonra:

```js
// asistan/baglam.js, açıklama amaçlı. config güvenilir sunucu ayarıdır.
export function messages(config, question) {
  if (typeof question !== 'string' || question.length > 2000) {
    throw new Error('Geçersiz soru');
  }
  if (typeof config.assistantName !== 'string' ||
      config.assistantName.length > 80 || !['tr', 'en'].includes(config.language)) {
    throw new Error('Geçersiz açık ayar');
  }
  // Bu alanlar ürünün açık bilgileri olarak sınıflandırılmıştır.
  const context = JSON.stringify({
    assistantName: config.assistantName, language: config.language,
  });
  return [
    { role: 'system', content: `Ürün hakkında yardım et. Açık ayarlar: ${context}` },
    { role: 'user', content: question },
  ];
}
```

Düzeltmeyi kanıtlayan test:

```js
// asistan/baglam.test.mjs, açıklama amaçlı. Gerçek anahtar veya LLM yok.
import test from 'node:test';
import assert from 'node:assert/strict';
const { messages } = await import(process.env.ORNEK_DOSYA);
test('yalnız seçilmiş açık ayarlar model mesajına girer', () => {
  const config = {
    assistantName: 'Deneme Asistanı', language: 'tr',
    apiKey: 'YAPAY_ANAHTAR_71', internalRule: 'YAPAY_KURAL_71',
    futurePrivateField: 'YAPAY_YENI_ALAN_71',
  };
  const result = messages(config, 'Ürün ne yapar?');
  const sent = JSON.stringify(result);
  for (const marker of [config.apiKey, config.internalRule, config.futurePrivateField]) {
    assert.equal(sent.includes(marker), false, 'özel alan bağlama girmemeli');
  }
  assert.match(sent, /Deneme Asistanı/);
  assert.match(result[0].content, /"language":"tr"/);
  assert.deepEqual(result[1], { role: 'user', content: 'Ürün ne yapar?' });
  assert.equal(result.length, 2);
  assert.throws(() => messages(config, {}));
  assert.throws(() => messages({ ...config, language: 'xx' }, 'Merhaba'));
});
```

## Ajan kuralı (AGENTS.md)

```md
## Prompt özel yapılandırmayı taşıyor (vibecheck VC-071)
- Sunucu yapılandırması veya ortam nesnesi bütünüyle model bağlamına aktarılmaz.
- Prompta girecek alanlar görev için açıkça seçilir.
- Servis anahtarları araç uygulamasında kalır, model mesajına konmaz.
- Yetki kararı gizli promptun saklı kalmasına bağlanmaz.
- Yeni yapılandırma alanlarının varsayılanı bağlama girmemektir.
- Bağlam testleri gerçek sır yerine yapay işaret kullanır.
```

## Kaynaklar

1. [LLM08:2026 Hidden Context Exposure](https://raw.githubusercontent.com/GenAI-Security-Project/GenAI-LLM-Top10/main/2026/final/LLM08_HiddenContextExposure.md), OWASP
2. [CWE-201 Insertion of Sensitive Information Into Sent Data](https://cwe.mitre.org/data/definitions/201.html), MITRE

---

vibecheck · Komünite editörlüğü. Metin CC BY 4.0, prompt ve kural parçaları MIT-0. Kaynak: https://vibecheck.komunite.com.tr/madde/sistem-promptunda-sir-ve-gereksiz-ic-bilgi-var
