11GüvenlikEylemde
Gizli bilgiyi ajanın bağlamına sokma
Ajanın okuduğu anahtar ve parola bağlamına giriyor, oradan bir yanıta, bir dosyaya ya da bir commit'e geçebiliyor. Ajana değerin yerine adını vermek ve değeri iş çalışırken ajanın dışında eklemek anahtarı ajanın çıktısından uzak tutar.
- Kimlik
- TD-068
- Seviye
- Ajan AI kullanıcı adına iş yapıyorsa gerekli.
- Yüzey
- Arka plan ajanı, Sohbet
- Dayanak
- Yaygın uygulama
- Son inceleme
- 27 Ekim 2026
Ajanına ver
Claude Code, Cursor ya da Codex'e yapıştır. Metinlerin tamamı aşağıda, Ajanına ver bölümünde.

30 saniyede dene
Bu anı kendi ürününde yarat ve ne olduğuna bak.
- Depona sahte bir anahtar içeren bir .env dosyası koy, örneğin TEST_ANAHTARI=deneme-1234-sahte.
- Kodlama ajanına bu anahtarı kullanan ve şu an çalışmayan bir testi düzeltmesini söyle.
- Ajanın yanıtında, değiştirdiği dosyalarda ve oturum günlüğünde deneme-1234-sahte değerini ara. Değer bir yerde geçiyorsa ajan onu okumuş ve dışarı taşımış.
- Ajandan .env dosyasını açmasını açıkça iste. Engelleniyor mu? Engellense bile kabuk komutuyla okuyabiliyor mu, dene.
Sorun
Geliştirici kodlama ajanına düşen ödeme testlerini düzeltmesini söylüyor. Ajan nedeni ararken depodaki .env dosyasını açıyor ve canlı ödeme anahtarı bağlamına giriyor. Testin anahtarı bulamadığını görüyor ve en kısa yolu seçiyor: değeri test dosyasına yazıyor. Testler geçiyor, ajan bitti diyor ve açıklamasında anahtarı bir kez daha tekrar ediyor.
Bağlam ajanın çalışma masası. Masaya giren her şey bir sonraki çıktının malzemesi olur: yanıt, düzenlenen dosya, commit mesajı, günlük. Model anahtarı öbür metinlerden ayırmaz. Sohbet geçmişi de saklanır, paylaşılır, başka araçlara aktarılır.
Zarar sessiz büyür. Test dosyası depoya girer, CI günlüğü değeri basar. Ajanın okuduğu bir dosyaya gizlenmiş bir talimat, masadaki anahtarı dışarı taşımak için tek cümle ister. Sızan anahtar da uzun süre çalışmaya devam eder. GitGuardian'a göre 2022'de geçerli olduğu doğrulanan sızmış kimlik bilgilerinin Ocak 2026'da hâlâ %64'ten fazlası1 geçerliydi.
Ajanın gördüğü gizli değer, ajanın yazabildiği her yere gidebilir.
Neden atlanıyor
Anahtarı ajana vermek, aracı çalıştırmanın en kısa yolu. Değer prompta yapıştırılır, MCP yapılandırmasına yazılır ya da ajanın .env dosyasını okumasına izin verilir. Kurulum belgeleri de bu yolu öğretir. GitGuardian herkese açık GitHub'daki MCP yapılandırma dosyalarında 24.008 farklı gizli bilgi bulduğunu, bunların 2.117'sinin geçerli olduğunu1 yazıyor. Aynı rapora göre popüler MCP kurulum rehberleri çoğu zaman API anahtarlarını doğrudan yapılandırma dosyalarına ve komut satırı argümanlarına koymayı öneriyor.
Model değeri sıradan metin gibi kullanır. Elinde çalışan bir anahtar varken testi geçirmenin en kısa yolu onu koda yazmaktır ve model kısa yolu seçer. Modelin gözünde anahtarla değişken adı arasında bir fark yok, ikisi de bağlamda duran karakterler.
Üçüncü neden talimata duyulan güven. “Anahtarı kimseye gösterme” cümlesi sistem promptuna yazılır ve iş bitmiş sayılır. OWASP'ın LLM uygulamaları listesi sistem promptunun gizli sayılmaması ve güvenlik kontrolü olarak kullanılmaması2 gerektiğini, kimlik bilgilerinin oraya hiç yazılmamasını söylüyor. Aynı listeye göre modelin neyi döndüreceğine dair prompttaki kısıtlar her zaman uygulanmayabilir ve prompt enjeksiyonuyla atlatılabilir3.
Desen
Ajan gizli bilginin adını bilir, değerini görmez. Değeri, iş çalışırken ajanın dışındaki bir katman ekler.
- Gizli dosyaları okuma alanından çıkar. .env, anahtar dosyaları ve kimlik bilgisi dizinleri ajanın okuma kurallarında kapalı. Kural ajanın dosya aracıyla sınırlı kalmaz, kabuk komutlarını ve alt süreçleri de kapsar. Bunu işletim sistemi düzeyinde bir kum havuzu sağlar.
- Ajana adı ver. Ajanın gördüğü yerde değerleri boş bir .env.example durur. Kod değeri çalışma anında ortamdan ya da kasadan okur. Ajan bir değeri koda, teste ya da yapılandırmaya yazmaz.
- Değeri ajanın dışında ekle. Kasa, araç sunucusu ya da ağ vekili gerçek değeri giden isteğe ekler. Ajanın çalıştırdığı komut yalnız bir yer tutucu görür.
- Prompta ve araç tanımına anahtar yazma. Sistem promptu, MCP yapılandırması ve araç açıklaması gizli bilgi taşımaz. Bu metinler ajanın bağlamında durur ve onunla birlikte dışarı çıkabilir.
- Çıktıyı tara. Ajanın yazdığı dosya, commit ve günlük bir gizli bilgi tarayıcısından geçer. Bulunan değer commit'i durdurur.
- Bağlama giren anahtarı değiştir. Bir değer ajanın bağlamına girdiyse dosyadan silmek yetmez. Anahtarı iptal et ve yenisini üret.
Ajanın işi değişmez. Testi düzeltir, isteği gönderir, sonucu okur. Anahtar ise hiçbir zaman ajanın yazabildiği bir yerde durmaz.
Önce ve sonra
Aynı test düzeltme işi, iki ayrı kurulumla. Soldaki ajan .env dosyasını okuyor, canlı anahtarı test dosyasına ve yanıtına yazıyor. Sağdaki ajan dosyayı okuyamıyor, testi anahtarı ortamdan okuyacak şekilde düzeltiyor ve testler çalışırken değeri araç katmanı ekliyor.
Geliştirici kodlama ajanından düşen ödeme testlerini düzeltmesini istiyor. Testlerin kullandığı canlı anahtar depodaki .env dosyasında duruyor.
Ajan · görev raporu
- Kullanıcı: Ödeme testleri neden düşüyor? Düzelt.
- Yapılandırma dosyası okundu (tamamlandı).env · ODEME_ANAHTARI=canli_7f3a9c2e81d4
- Anahtar test dosyasına yazıldı (tamamlandı)tests/odeme.test.ts · const anahtar = 'canli_7f3a9c2e81d4'
- Testler çalıştırıldı, hepsi geçti (tamamlandı)
- AI: Testler anahtarı bulamıyordu. Anahtarı doğrudan test dosyasına yazdım, artık geçiyorlar. Kullandığım anahtar canli_7f3a9c2e81d4.
- Ajan .env dosyasını açtı ve canlı anahtar bağlamına girdi. Bundan sonraki her çıktı, yanıt, dosya ya da commit, anahtarı taşıyabilir.
- Anahtar artık hem sohbet geçmişinde hem depoya girecek bir test dosyasında duruyor. Silmek yetmez, anahtarı iptal edip yenisini üretmek gerekiyor.
Ajan · görev raporu
- Gizli dosyalar: .env, .env.*, anahtar dosyaları · ajan okuyamaz
- Kullanıcı: Ödeme testleri neden düşüyor? Düzelt.
- Yapılandırma dosyası okunmadı (durduruldu)okuma kuralı: .env engelli · yalnız değişken adları okundu
- Test, anahtarı ortamdan okuyacak şekilde düzeltildi (tamamlandı)tests/odeme.test.ts · process.env.ODEME_ANAHTARI
- Testler çalıştırıldı, hepsi geçti (tamamlandı)anahtar komut çalışırken eklendi · ajana yer tutucu gösterildi
- AI: Testler anahtarı ortamdan okumuyordu, düzelttim. Anahtarın değerini görmedim, hiçbir dosyaya yazmadım. Sürekli entegrasyonda ODEME_ANAHTARI tanımlı değilse kasadan eklemen gerekiyor.
- Değişikliği gösterTamam
- Gizli dosyalar ajanın okuma kuralında kapalı. Ajan anahtarın adını biliyor, değerini hiç görmüyor.
- Değeri komut çalışırken araç katmanı ekliyor. Yanıtta, test dosyasında ve günlükte anahtar yok.
Örnek ekran. Ürün, ad ve sayılar kurgusal.
Piyasada
Claude Code'da .env gibi bir dosya Read engel kuralıyla4 kapatılıyor. Belge kuralın sınırını da yazıyor: engel Claude'un dosya araçlarına ve cat, head gibi tanıdığı kabuk komutlarına uygulanıyor, dosyayı kendisi açan bir Python ya da Node betiğine uygulanmıyor. Her süreci kapsayan engel için kum havuzunu öneriyor. Kum havuzunda bir ortam değişkeni maskelenebiliyor: komut bir yer tutucu görüyor, vekil gerçek değeri izin verilen adreslere giden isteğe ekliyor ve belgeye göre komut da yazdığı günlük de gerçek değeri hiç taşımıyor5.
OpenAI'ın Codex bulut ortamlarında bir anahtar ağ sırrı olarak tanımlanabiliyor. Programlar yalnız bir yer tutucu alıyor, gerçek değeri vekil izin verilen adreslere giden isteğe ekliyor6. Değeri doğrudan okuması gereken programlar için belge ayrı bir yol bırakıyor: o zaman değer ortam değişkeni olarak giriyor ve programın elinde duruyor.
Cursor'da .cursorignore dosyasındaki dosyalar ajana ve kod tamamlamaya kapalı, varsayılan liste .env dosyalarını zaten içeriyor. Belge iki sınır yazıyor: ajanın kullandığı terminal ve MCP araçları bu engeli uygulayamıyor7 ve modelin öngörülemezliği yüzünden tam koruma garanti edilmiyor.
GitHub Copilot'ın içerik dışlama ayarı bir dosyayı önerilerden ve yanıtlardan çıkarıyor. Belgeye göre bu ayar şu an VS Code ve öteki editörlerde Copilot Chat'in Edit ve Agent modlarında desteklenmiyor8. Ajan modunda dosya dışlama uygulanmıyor.
Kanıt
CamoLeak, GitHub Copilot Chat, 2025. Legit Security araştırmacısı Omer Mayraz, Haziran 2025'te Copilot Chat'te bir açık buldu. Bir çekme isteğinin açıklamasına gizli yorum olarak yazdığı talimat, o isteği Copilot'a soran her kullanıcının bağlamına giriyordu. Copilot kullanıcının yetkileriyle çalıştığı için kullanıcının özel depolarını okuyabiliyordu. Araştırmacı Copilot'a kod tabanında “AWS_KEY” aratıp sonucu dışarı taşıttı9. Sızdırma kanalı sohbette gösterilen görsellerdi. GitHub açığı Copilot Chat'te görsel gösterimini tamamen kapatarak giderdi. Bu bir araştırmacının gösterimi, yazıda gerçek bir kullanıcıya karşı kullanıldığına dair bilgi yok. Mekanizma yine de açık: anahtar ajanın okuyabildiği bir yerde durdukça, okuduğu tek bir talimat onu bağlama çekip dışarı yollayabilir.
GitGuardian'ın 2026 raporunda Claude Code yardımıyla yazılan commit'lerde gizli bilgi sızma oranı %3,21, herkese açık GitHub commit'lerinin tamamında %1,51. Rapor bu farkın yalnız aracın hatası diye okunmaması gerektiğini, neyin gönderileceğine geliştiricinin karar verdiğini de yazıyor. Desenin önerdiği düzen OWASP'ın önerisiyle aynı: gizli bilgiyi modelin doğrudan erişmediği sistemlere taşımak2.
GitGuardian'ın sayısı herkese açık commit'leri ölçüyor ve sızan değerin ajanın bağlamından mı, geliştiricinin kendi yazdığından mı geldiğini ayırmıyor. Gizli bilgiyi bağlamdan uzak tutmanın sızıntıyı ne kadar azalttığını ölçen yayımlanmış bir çalışma bulamadık.
- 30 Eylül 2025GitHub Copilot Chat, bir çekme isteğine gizlenen talimatla özel depolardaki anahtarları dışarı taşıyabiliyordu
Ölçüm
Engel kurallarının sayısı bu desenin işe yarayıp yaramadığını söylemez. Bakılacak yer, gizli değerin ajanın bağlamında ve çıktısında görünüp görünmediği.
- Bağlama giren değer. Ajanın oturum günlüklerini bir gizli bilgi tarayıcısından geçir. Değerin göründüğü oturum sayısı sıfır olmalı.
- Ajanın yazdığı değer. Ajanın yazdığı commit ve dosyalarda tarayıcının bulduğu gizli bilgi. Hedef sıfır. İnsanların commit'leriyle aynı ölçüyle karşılaştır.
- Engellenen okuma. Gizli dosyalara yönelen ve engellenen okuma denemeleri. Sayı sıfırdan büyükse engel çalışıyor ve ajan dosyaya uzanıyor, nedenini tek tek incele.
- Yer tutucuyla çalışan anahtar. Ajanın araçlarının kullandığı anahtarlardan kaçı değeri ajana göstermeden ekleniyor, kaçı ajanın sürecinde düz değer olarak duruyor.
- Değiştirme süresi. Bir anahtarın bağlama girdiği anlaşıldığında iptal edilip yenisinin üretilmesine kadar geçen süre.
Ajanına ver
Üç metin var. Denetim promptu depodaki gizli dosyaları, ajanın okuma kurallarını, promptlara ve araç yapılandırmalarına yazılmış anahtarları ve ajanın yazdığı dosyaları tarar, değerleri yazmadan yalnız yerlerini raporlar. Uygulama promptu deseni koda geçirir. Önce planı gösterir, onayınla okuma engellerini, ortamdan okuma düzenini ve tarayıcıyı kurar, sahte bir anahtarla çalışan bir test ekler. Kural kodlama ajanının kendi çalışması için: senin ajanın da .env dosyasını açmasın.
Bu depoda kod yazan ya da kullanıcı adına araç çağıran bir AI ajanı kullanılıyor ya da kuruluyor. Görevin, API anahtarı, parola, jeton ve bağlantı dizesi gibi gizli bilgilerin ajanın bağlamına girip girmediğini denetlemek. Hiçbir dosyayı değiştirme, yalnız rapor yaz. Bulduğun gizli değerleri rapora yazma, yalnız dosya ve satırı göster.
1. Depoda gizli bilgi taşıyan dosyaları bul: .env ve türevleri, anahtar dosyaları (.pem, .key), kimlik bilgisi dosyaları, MCP ve ajan yapılandırmaları (mcp.json, ayar dosyaları), CI tanımları. Hangileri .gitignore'da, hangileri depoya girmiş?
2. Ajanın okuma kurallarına bak: ajan ayarlarındaki okuma engelleri, ignore dosyaları, içerik dışlama ayarları. Gizli dosyalar engelli mi? Engel yalnız ajanın dosya aracına mı uygulanıyor, yoksa kabuk komutları ve alt süreçler için de geçerli mi (işletim sistemi düzeyinde kum havuzu var mı)?
3. Sistem promptlarında, araç tanımlarında, MCP sunucu yapılandırmalarında ve komut satırı argümanlarında doğrudan yazılmış anahtar ya da parola var mı?
4. Ajanın çalıştırdığı süreçler gizli bilgiyi nereden alıyor: ortam değişkeninden, dosyadan, bir kasadan ya da istekleri imzalayan bir vekilden? Ajanın kendi süreci ve çalıştırdığı komutlar değerin kendisini görebiliyor mu?
5. Ajanın yazdığı test, yapılandırma ve örnek dosyalarda, commit'lerde ve günlüklerde gizli değer var mı? Bir gizli bilgi tarayıcısı (örnek: gitleaks, trufflehog) commit öncesinde ya da CI'da çalışıyor mu?
6. Ajanın oturum günlükleri ve sohbet geçmişi nerede saklanıyor, kimler okuyabiliyor? Bu günlüklere gizli değer düşmüş olabilir mi?
Rapor biçimi: her bulgu için dosya ve satır, gizli bilginin türü (değeri yazmadan), ajanın ona nasıl ulaşabildiği, olası sızıntı yolu (örnek: ajan .env'i okuyup değeri test dosyasına yazar) ve önerdiğin düzeltme. Canlı ortam anahtarlarından başla ve bağlama girmiş olabilecek her anahtar için "değiştirilmeli" diye not düş.
Bu depoda "gizli bilgiyi ajanın bağlamına sokma" desenini uygula. Önce planı göster, onayımı aldıktan sonra değiştir.
Hedef davranış:
1. Gizli dosyalar (.env, .env.*, anahtar ve kimlik bilgisi dosyaları) ajanın okuma kurallarında engelli olsun. Engel ajanın dosya araçlarıyla sınırlı kalmasın: kabuk komutları ve alt süreçler için işletim sistemi düzeyinde kum havuzu ya da eşdeğer bir engel kur.
2. Ajanın göreceği yerde yalnız değişken adları dursun: değerleri boş ya da sahte bir .env.example dosyası.
3. Kod gizli değerleri yalnız çalışma anında ortamdan ya da kasadan okusun. Test, yapılandırma ve örnek dosyalarında doğrudan yazılmış değer kalmasın.
4. Ajanın çalıştırdığı komutlar gerçek değeri görmesin. Ortam destekliyorsa değeri ağ vekili ya da araç sunucusu isteğe eklesin, süreç yalnız bir yer tutucu görsün. Desteklemiyorsa ajanın oturumuna yalnız test ortamı için, dar yetkili ve kısa ömürlü anahtarlar ver.
5. Sistem promptlarından, araç tanımlarından ve MCP yapılandırmalarından doğrudan yazılmış anahtarları çıkar, ortam değişkenine ya da kasaya taşı.
6. Ajanın yazdığı her dosya ve commit bir gizli bilgi taramasından geçsin. Bulunan değer commit'i durdursun.
Uygularken:
- Gizli değerleri hiçbir çıktıya, plana ya da rapora yazma. Yalnız adlarını kullan.
- Daha önce ajanın bağlamına girmiş olabilecek her anahtarı listele ve değiştirilmesi gerektiğini raporla, kendin değiştirme.
- Bir test ekle: sahte bir gizli değeri .env'e koy, ajan oturumunu ya da ilgili betiği çalıştır ve değerin ajanın çıktısında, yazdığı dosyalarda ve günlükte geçmediğini doğrula. Tarayıcının sahte değeri içeren bir commit'i durdurduğunu da doğrula.
## Gizli bilgiyi bağlama sokma
- .env, anahtar dosyaları ve kimlik bilgisi dosyalarını açma, cat, grep ya da bir betikle de okuma. Bir değişkenin adını bilmen yeterli.
- Gizli bir değeri koda, teste, yapılandırmaya, commit mesajına ya da yanıtına yazma. Kod değeri çalışma anında ortamdan okusun.
- Bir anahtar gerektiğinde kullanıcıdan değeri isteme, hangi adla nereye tanımlanması gerektiğini söyle.
- Bağlamında yanlışlıkla bir gizli değer görürsen onu tekrar etme, kullanıcıya hangi dosyada gördüğünü söyle ve anahtarın değiştirilmesini öner.
- Sistem promptuna, araç tanımına ya da MCP yapılandırmasına anahtar yazma.
Sınır
Her gizli bilgi ajandan uzak tutulamaz. Bazı programlar değeri doğrudan okumak zorunda ve Codex'in belgesi de bunun için ayrı bir yol bırakıyor. O zaman ajana yalnız test ortamı için, dar yetkili ve kısa ömürlü bir anahtar ver.
Abartılırsa ajan yapılandırma hatalarını çözemez hâle gelir. Bütün yapılandırma dosyalarını kapatma. Değerleri boş bir örnek dosya, ajana neyin tanımlı olması gerektiğini söyler.
Desen yetkiyi kaldırmaz. Değeri görmeyen ajan da yer tutucuyla isteği gönderebilir ve anahtar neye izin veriyorsa onu kullanır. Anahtarın yetkisini daraltmak okuma ve yazma iznini ayıran desenin işi. Ajanın güvenilmeyen içerik okuduktan sonra dışarı veri göndermesini engellemek de ayrı bir desen.
Kullanıcı da anahtarı sohbete yapıştırabilir ve okuma engeli bunu durdurmaz. Kullanıcının mesajını da tarayan bir kontrol ve değeri hangi adla nereye tanımlayacağını söyleyen bir yanıt gerekir.