Repository, açığa çıkma yüzeyidir
Bir kodlama ajanına görev verildiğinde, tipik olarak bir working tree'ye erişim hakkı tanınır. Bu tree nötr bir sandbox değildir. Tüm commit geçmişini, tüm branch'leri, tüm tag'leri ve o anda mevcut olan herhangi bir untracked veya ignored artifact'ı içerir. Ajan orada ne varsa okur. Repository herhangi bir zamanda bir görsel, bir credential, bir veritabanı dökümü veya bir binary blob içerdiyse, ajan bunu okuyabilir, kopyalayabilir, dönüştürebilir ve geri yazabilir. Kodlama ajanları aracılığıyla 13.000 dahili görselin açığa çıktığına dair son rapor, zekice bir prompt hakkında bir hikaye değildir. Bir ajanın containment sınırı olmadan bir repository'yi devraldığında ne olduğu hakkında bir hikayedir.
Güvenlik için bakılacak yanlış yer, talimat katmanıdır. Prompt'lar tavsiye niteliğindedir. Veri sınıflandırma politikanız için değil, görev tamamlama için optimize eden bir model tarafından yorumlanırlar. "Secrets dizinini okumayın" diyen bir prompt bir öneridir, bir erişim kontrolü değildir. Repository sınırı bir erişim kontrolüdür. Dosya sistemi, remote ve ajanın elinde tuttuğu credential tarafından uygulanır. Mühendisliğin yeri burasıdır.
Kodlama ajanları neden farklı bir açığa çıkma sınıfıdır
Çoğu LLM ajan dağıtımı API'lerle etkileşime girer. Kodlama ajanları bir sürüm kontrol sistemiyle etkileşime girer. Bu fark, başarısızlık modlarını üç şekilde değiştirir.
Birincisi, ajan geçmişe, branch'lere ve untracked artifact'lara tam okuma erişimi olan bir working tree içinde çalışır. Bir checkout, mevcut durumun bir anlık görüntüsü değildir; şimdiye kadar commit edilmiş her şeyin tam kaydıdır. Bir secret commit edilip sonra kaldırıldıysa, hâlâ object store'dadır. Bir görsel bir feature branch'ine eklendiyse, erişilebilirdir. Ajanın bunu bulması için talimat verilmesine gerek yoktur. Standart araçlar — git log, git grep, git cat-file — bunu olağan keşfin bir parçası olarak ortaya çıkarır.
İkincisi, kodlama ajanları rutin olarak binary artifact'lar üreten ve commit eden komutlar çalıştırır. Build çıktıları, model ağırlıkları, ekran görüntüleri, test fixture'ları, oluşturulan raporlar. Bunlar temiz bir şekilde diff'lenmez. Bir binary dosyanın metin diff'i ya tek satırlık bir "Binary files differ" ya da okunamayan byte'lardan oluşan bir duvardır. Gözden geçirenler bunları atlar. Artifact geçmişe girer ve geçmişe girdiğinde, sonraki her clone'da bulunur.
Üçüncüsü, çıktı kanalı bir remote'u olan bir sürüm kontrol sistemidir. Her hata potansiyel olarak kamusal ve kalıcıdır. Bir public remote'a push bir dosya transferi değildir; bir yayınlama olayıdır. Geçmişi sonradan yeniden yazmak mümkündür ama yıkıcıdır ve zaten fetch edilmiş hiçbir şeyi yayından kaldırmaz. Geri döndürülemezlik prosedürel değil, yapısaldır.
Bu üç özellik belirli bir açığa çıkma sınıfında birleşir: tüm geçmişi okuyabilen, opak artifact'lar yazabilen ve bir remote'a yayınlayabilen bir ajan. Bu, kapsamı belirlenmiş bir API çağırabilen bir ajandan farklı bir risk profilidir.

Bundan çıkan kapsam kuralları
Containment birimi repository sınırıdır. Aşağıdaki kurallar doğrudan bundan çıkar.
Shallow ve kapsamlı clone yapın. Tek bir pakete ihtiyaç duyan bir ajan monorepo geçmişini almamalıdır. Working tree'nin yalnızca görevin gerektirdiği path'leri içermesi için shallow bir clone (--depth 1) ve sparse bir checkout (--filter=blob:none, --sparse) kullanın. Bu bir performans optimizasyonu değildir; okuma yüzeyinin azaltılmasıdır. Ajan nesneyi göremezse, nesneyi sızdıramaz.
Ajanın credential'ını insanınkinden ayırın. Ajan, insanın okuyabildiği her repository'yi okuyabilen bir kişisel erişim token'ı tutmamalıdır. Belirli repository ile kapsamı belirlenmiş bir credential tutmalıdır ve bu credential yalnızca bir staging remote'a push hakkına sahip olmalıdır. Staging remote, ajan tarafından yazılan commit'lerin indiği yerdir. Kanonik remote'a terfi ayrı, insan denetimli bir adımdır.
Repository'yi bir yetenek yüzeyi olarak ele alın. Ajanın ne yazabileceğine karar vermeden önce, ne okuyabileceğini listeleyin. Bu, yetenek tabanlı güvenlikle aynı disiplindir: okunabilir nesneler kümesi, sızdırılabilir nesneler kümesini tanımlar. Liste geçmişi, branch'leri ve untracked dosyaları içeriyorsa, ajanın yazma kapsamı buna karşılık dar olmalıdır.
Dürüst ödünleşim: shallow, kapsamlı clone'lar bazı ajan iş akışlarını bozar. Bir regresyonu bisect etmesi, bir değişikliği geçmiş boyunca izlemesi veya uzun ömürlü bir branch hakkında akıl yürütmesi gereken ajanlar başarısız olur veya daha kötü sonuçlar üretir. Hafifletme, geçmiş erişimi için ayrı, salt okunur, denetlenmiş bir yol sağlamaktır — varsayılan clone'u genişletmek değil. Varsayılan dar yüzey olmalıdır; istisna açık ve loglanmış olmalıdır.
Ajanın davranmasına bağlı olmayan tespit
Tespit, ajanın talimatlara uymasına dayanmamal
Commit'ten önce staged blob'ları tarayın, push'tan sonra değil. Staged içeriği yüksek entropili string'ler ve bilinen görsel header'ları için inceleyen bir pre-commit hook, sızıntı sınıfını geçmişe girmeden önce yakalar. Yüksek entropi taraması credential'ları ve anahtarları yakalar. Header taraması PNG, JPEG, GIF ve WebP magic byte'larını yakalar. Her ikisi de ucuz ve deterministiktir. Önemli olan bunları working tree üzerinde değil, staged nesne üzerinde çalıştırmaktır, çünkü commit edilecek olan staged nesnedir.

Yalnızca kaynak diff'ini değil, artifact envanterini de diff'leyin. Ajan tarafından yazılan her commit, eklenen, değiştirilen ve silinen dosyaların bir manifestosunu, dosya türleri ve boyutlarıyla birlikte üretmelidir. Gözden geçirenler bu manifestoyu kaynak diff'inin yanında görmelidir. Yalnızca kaynak içeren bir repository'ye 2 MB'lık bir binary ekleyen bir commit, binary'nin ne içerdiğinden bağımsız olarak bir sinyaldir. Envanter diff'i artifact'lar için inceleme yüzeyidir; kaynak diff'i mantık için inceleme yüzeyidir.
Remote oluşturmada alarm verin. Geri döndürülemez adım bir remote'a push'tur ve en geri döndürülemez varyant yeni bir remote oluşturmaktır. Bunda alarm verin. Remote oluşturmayı, olağan commit'lerden ayrı, açık onay gerektiren ayrıcalıklı bir işlem olarak ele alın.
Bunun ajan aracı tasarımı için anlamı
Başarısızlık modu ortadan kalkmayacak, çünkü ajanlara gerçek repository'ler vermenin bir sonucudur. Araçlar güvenli yolu varsayılan yol yapmalıdır.
Bir commit aracı, shell escape yerine beyan edilmiş bir artifact manifestosu sunmalıdır. Ajana bir shell verip doğru dosyalarda git add çalıştırmasını ummak yerine, araç ajanın neyi commit etmeyi amaçladığını beyan etmesini gerektirmelidir: path'lerin listesi, türleri ve kökenleri. Araç daha sonra tam olarak bu kümeyi commit eder. Bu, geniş git add . çağrılarından ve tree'ye artifact bırakan build adımlarından kaynaklanan kazara commit sınıfını ortadan kaldırır.
Repository credential'ları kısa ömürlü ve bir branch'e bağlı olmalıdır. Dakikalar içinde süresi dolan ve yalnızca tek bir branch'e push edebilen bir credential, ele geçirilmiş bir ajanın etki alanını sınırlar. Bu, ödemeler için kapsamlı harcama credential'larının çalışma şeklini yansıtır: kapsamı çağıran değil, credential taşır. Ajana güvenilmesine gerek yoktur; credential kısıtlanmıştır.
İnceleme araçlarının ajan atfedilen bir yazarlık alanına ihtiyacı vardır. Bir ajan tarafından yazılan commit'ler, metadata düzeyinde bir insan tarafından yazılanlardan ayırt edilebilmelidir. Gözden geçirenler daha sonra farklı bir inceleme uygulayabilir: insan tarafından yazılan bir commit normal bir inceleme alabilirken, ajan tarafından yazılan bir commit rutin olarak bir artifact envanteri kontrolü ve bir secret taraması alır. Atıf suçlama ile ilgili değildir; doğru inceleme sürecine yönlendirme ile ilgilidir.
Talimat değil, sınır
Kodlama ajanları aracılığıyla dahili görsellerin açığa çıkması, agentic sistemler için ilginç güvenlik sınırının prompt olmadığını hatırlatır. Ajanın erişebildiği kaynaklar kümesidir. Kodlama ajanları için bu küme repository tarafından tanımlanır: geçmişi, branch'leri, untracked artifact'ları ve remote'u. Containment, bu kümeyi kasıtlı olarak daraltmak, ihlalleri davranışta değil artifact'larda tespit etmek ve dar yolu kolay yol yapan araçlar tasarlamak anlamına gelir. Talimat, sistemin en az uygulanabilir parçasıdır. Gerçekten tutan kısım repository sınırıdır.
