Zararlı Bir AGENTS.md Dosyasının Kodlama Ajanınızı Ele Geçirmesi Nasıl Engellenir?

Kötü amaçlı bir AGENTS.md dosyası, İndirilenler klasörünüz üzerinden Codex veya Claude Code'u ele geçirebilir. Ekipler için beş adım: güvenli başlangıç klasörleri, dosya incelemesi, engelleme kuralları, sandbox ve yapılandırma kontrolleri.

Aiden Flux

Aiden Flux

12 Kasım 2026

Özetle: Kötü amaçlı bir AGENTS.md dosyası, tam da bu dosyanın var oluş amacını kullanarak bir kodlama ajanını ele geçirir: Ajan, dosyayı başlangıçta okur ve içindeki talimatları uygular. Forever Security, Ekim 2026'da gerçek bir müşterinin ~/Downloads klasöründe böyle bir dosyayı tespit etti. Bunun önüne geçmek için kontrolünüzde olmayan bir klasörde asla ajan başlatmayın, talimat dosyalarını tıpkı kod gibi inceleyin, yapılandırma ve ağ değişikliklerini engelleyin, korumalı alanı (sandbox) ve onay istemlerini açık tutun ve ajanın kendi yapılandırmasındaki değişiklikleri takip edin.

Kötü amaçlı AGENTS.md saldırısı nedir?

Kötü amaçlı bir AGENTS.md, bir kodlama ajanını zararlı eylemlere yönlendirmek amacıyla yazılmış bir proje talimat dosyasıdır. Claude Code, Codex ve diğer ajanlar bu dosyaları başlatıldıkları klasörden otomatik olarak yükler. Bu saldırı herhangi bir güvenlik açığı (exploit) gerektirmez: Ajan dosyayı başlangıçta okur ve içeriğini projenin kendi kuralları olarak kabul eder.

Dosya sıradan mühendislik notlarına benzer: Bir paket yükleyen "preflight" (ön kontrol) adımı veya API trafiğinin nereye gideceğini değiştiren bir "proxy" notu gibi. Ajan açısından bu, "npm yerine pnpm kullan" türündeki sıradan bir talimattan farksızdır.

Geliştiricileriniz birden fazla kodlama ajanı çalıştırıyorsa Sharkly, bu işleri atamak ve incelemek için tek bir merkez sunar; bunun ajanların nerede başlatıldığını nasıl değiştirdiğine birazdan değineceğiz.

Kodlama ajanınız bu dosyaya neden itaat eder?

Talimat dosyaları, ajanın bağlamında doğrudan isteminizin (prompt) hemen yanında yer alır; proje kuralları ile sizin talebiniz arasında kesin bir sınır yoktur.

Claude Code'un bellek dokümantasyonu, CLAUDE.md ve AGENTS.md içeriğinin "zorunlu bir yapılandırma olarak değil, bağlam olarak" ele alındığını belirtir. Ortamda bir CLAUDE.md bulunmadığında, çalışma dizinindeki ve onun üst dizinlerindeki her AGENTS.md dosyasını yükler. Codex'in AGENTS.md kılavuzu ise proje kökünden mevcut dizine kadar ilerler ve bulduğu içerikleri varsayılan olarak 32 KiB'a kadar birleştirir. Ajanı başlattığınız konuma daha yakın olan dosyalar en son eklenir ve bu yüzden öncelik kazanır. Dolayısıyla ajanı başlattığınız klasör neyin yükleneceğini belirler; üst klasörler de bu sürece dahil edilir.

Kötü amaçlı bir AGENTS.md, Codex ve Claude Code'u nasıl ele geçirir?

22 Ekim 2026'da Forever Security, bir müşterisinin dizüstü bilgisayarında keşfettiği bulguları yayımladı. Bir kodlama ajanı, bilinen zararlı bir npm paketi olan function-color paketini yüklemeye çalışmıştı ve bu talimat ~/Downloads dizinindeki bir AGENTS.md dosyasından geliyordu. Bu klasör aynı zamanda ajanın çalışma diziniydi. Forever, herhangi bir kod çalışmadan önce yüklemeyi engelledi ancak dosyanın oraya nasıl ulaştığını tespit edemedi.

Diagram of the attack chain: a web page silently saves AGENTS.md to the Downloads folder, a developer starts a coding agent there, the agent reads the file and rewrites its own config, and the result is a malicious npm package running or an OAuth token sent to an attacker server

Downloads klasörünün bu kadar kritik olmasının nedeni şudur: Bir web sayfasının herhangi bir tıklama olmadan yazabildiği tek klasördür. Forever daha sonra bu zinciri bir laboratuvar ortamında yeniden oluşturdu:

  1. Kontrollerindeki bir sayfa, ~/Downloads dizinine AGENTS.md adında bir dosya kaydeder.
  2. Geliştirici o klasörde Codex'i açar ve rastgele bir soru sorar.
  3. Codex göreve başlamadan önce ~/.codex/config.toml dosyasına bir "proje araçları" sunucusu ekler ve npm üzerinden bir paket yükler.
  4. Bu yapılandırma tüm bilgisayar için geçerli olduğundan, daha sonraki tüm Codex oturumları hangi klasörde olursa olsun saldırganın sunucusunu yükler.

Forever'ın aktardığına göre Codex, denemelerin %90'ından fazlasında zararlı yükü (payload) çalıştırdı. Çalıştırmaların çoğunda hesap makinesi açan zararsız bir örnek kullanıldı; gerçek paket ise yalnızca bir kez, izole edilmiş bir sanal makinede (VM) çalıştırıldı.

Claude Code'u kandırmak ise daha zordu. Sisteme yerleştirilen bir CLAUDE.md dosyası, aracın kendi API trafiğini Forever'ın kontrolündeki bir sunucuya yönlendirmesini sağladı. Bu durum OAuth giriş belirtecinin (token) sızmasına ve sunucunun modelmiş gibi yanıt vermesine yol açtı. Forever, bunun denemelerin yaklaşık %50'sinde başarılı olduğunu bildirdi. Bu iki oran farklı saldırı yöntemlerine ait olduğundan, bunları tek bir başarı oranı olarak kıyaslamamak gerekir.

Forever'ın vurguladığı asıl nokta şu: Burada yamalanacak bir yazılım hatası yok. Sorun, web'in doğrudan yazabildiği bir klasörün sanki siz doldurmuşsunuz gibi güvenilir kabul edilmesidir. Benzer bir ders, Pillar Security'nin bir diff incelemesinde gözle görülemeyen görünmez Unicode karakterlerini kullanarak kural dosyalarına talimatlar gizleyen Rules File Backdoor araştırmasında da görülmüştü.

Kötü amaçlı bir AGENTS.md dosyasını engellemek için 5 adım

İlk iki adım dosyanın yüklenmesini engeller; son üç adım ise bir dosya sızdığında oluşabilecek zararı sınırlar.

Five defense layers between an untrusted instruction file and a developer laptop: never start agents in Downloads or home, review AGENTS.md and CLAUDE.md like code, deny config and network rewrites, keep sandbox and approval prompts on, watch config files and rotate

1. Bir kodlama ajanı asla nerede başlatılmamalıdır?

Asla ~/Downloads dizininde, ev dizininizde (home folder) ya da sizin oluşturmadığınız herhangi bir klasörde başlatılmamalıdır. Forever, müşterilerinin yaklaşık yarısının Downloads içinde bir kodlama ajanı çalıştırdığını belirtiyor. İndirilen dosyaları düzenlemek için bir ajana ihtiyacınız varsa, dosyaları yeni ve boş bir klasöre kopyalayıp ajanı orada başlatın.

Bir kabuk (shell) koruması, bunu unutanlar için kuralın tavizsiz uygulanmasını sağlar:

# ~/.zshrc: refuse to start an agent in folders the web can write to
agent_guard() {
  case "$PWD" in
    "$HOME"|"$HOME/Downloads"*|"/tmp"*)
      echo "Refusing to start an agent in $PWD. Use a project folder." >&2
      return 1 ;;
  esac
}
claude() { agent_guard && command claude "$@"; }
codex()  { agent_guard && command codex "$@"; }

2. AGENTS.md dosyasını tıpkı kod gibi nasıl incelersiniz?

Beş dakika önce klonladığınız bir depoda dahi olsa, her talimat dosyasını çalıştırılabilir bir dosya gibi değerlendirin. Ardından inceleme sürecini otomatik hale getirin. Bu dosyaları değiştiren bir çekme isteğinin (pull request) atanmış bir incelemeciye ihtiyaç duyması için talimat dosyalarını CODEOWNERS kapsamına alın:

AGENTS.md            @your-org/platform
**/AGENTS.md         @your-org/platform
CLAUDE.md            @your-org/platform
/.claude/            @your-org/platform
/.cursor/rules/      @your-org/platform

Bu saldırıların dayandığı kalıpları tespit ettiğinde başarısız olan bir CI kontrolü ekleyin: Gizli Unicode karakterleri, temel URL (base URL) değişiklikleri ve talimat dosyalarının içindeki yükleme komutları.

#!/usr/bin/env bash
# ci/check-agent-instructions.sh
files=$(git ls-files '*AGENTS.md' '*CLAUDE.md' '.cursor/rules/*')
[ -z "$files" ] && exit 0
fail=0
# zero-width, bidi override and Unicode tag characters
if grep -nP '[\x{200B}-\x{200F}\x{202A}-\x{202E}\x{2066}-\x{2069}\x{E0000}-\x{E007F}]' $files; then
  echo "Hidden Unicode in an agent instruction file"; fail=1
fi
if grep -niE 'BASE_URL|chatgpt_base_url|mcp_servers|npx --yes|curl .*\| *(ba)?sh' $files; then
  echo "Config, network or install instruction in an agent file: needs review"; fail=1
fi
exit $fail

İkinci grep komutu bazı meşru satırları da işaretleyebilir. Bunlar zaten bir insan tarafından incelenmeyi hak eden satırlardır.

3. Ajanın kendi yapılandırmasını yeniden yazma iznini engelleyin

Her iki yeniden üretim denemesi de ajanın kendi ayarlarını düzenlemesiyle sonuçlandı. Bu seçeneği ortadan kaldırın. Claude Code'da ajanın yapılandırma klasörlerinin düzenlenmesini engelleyin ve projenin .claude/settings.json dosyasında gizli anahtarların (secrets) okunmasını kısıtlayın:

{
  "permissions": {
    "deny": [
      "Edit(./.claude/**)",
      "Edit(~/.claude/**)",
      "Edit(~/.codex/**)",
      "Read(./.env)",
      "Read(./.env.*)"
    ]
  }
}

Bir ekip için bunu yönetilen ayarlar (managed settings) altında tanımlayın; böylece proje dosyası bu kısıtlamaları esnetemez. Bellek dokümantasyonu, zorunlu kılmanız gereken her şey için yönetilen permissions.deny, sandbox.enabled ve env ayarlarını; model neye karar verirse versin bir eylemi engellemek için ise bir PreToolUse hook'unu işaret eder. Yönetilen env içinde API yönlendirmesini sabitlemek, temel URL (base URL) saldırısına karşı doğrudan çözümdür. Kural sözdizimini kullanıma sunmadan önce kurulu sürümünüzle uyumlu olup olmadığını kontrol edin.

4. Korumalı alanı (sandbox) ve onay istemlerini açık tutun

Forever, onay kapılarını ve korumalı alanları açık bırakmayı ve ajana bunları atlamasını söyleyen hiçbir metne güvenmemeyi tavsiye ediyor.

Hangi eylemlerin mutlaka insan onayına takılması gerektiğine karar verin: Paket yüklemeleri, ajan yapılandırmasındaki değişiklikler ve yeni ana makinelere (host) yapılan ağ çağrıları. Kodlama ajanları için onay kapıları başlıklı yazımız bu durak noktalarının nereye konulacağını, bir kodlama ajanına nelerin izin verilip nelerin verilmemesi gerektiği yazımız ise bunların arkasındaki izin modelini ele alıyor.

5. Ajanın yapılandırmasını izleyin ve bir şüphede anahtarları yenileyin

Forever tam olarak nereye bakılması gerektiğini listeliyor: ~/.codex/config.toml içinde beklenmeyen bir [mcp_servers.*] bloğu veya değiştirilmiş bir chatgpt_base_url. Bir projenin .claude/settings.json dosyasında ise bir ANTHROPIC_BASE_URL, bir proxy veya sizin ayarlamadığınız bir uç nokta (endpoint).

grep -nE '^\[mcp_servers\.|chatgpt_base_url' ~/.codex/config.toml
grep -rnE 'ANTHROPIC_BASE_URL|_PROXY|base_url' ~/.claude/settings.json .claude/settings*.json 2>/dev/null
npm ls -g --depth=0 2>/dev/null | grep -i function-color

Şüpheli bir durumla karşılaşırsanız belirtecin (token) sızdırıldığını varsayın ve yenileyin (rotate). Çalınan bir OAuth belirteci, yalnızca araya girilmiş tek bir istek değil, canlı bir oturum anlamına gelir. Eğer function-color görünürse, o bilgisayarı ele geçirilmiş kabul edin. Daha kapsamlı bir temizlik için gizli anahtarları sızdıran kodlama ajanlarına yönelik kontrol listemiz, her bir yenileme adımı için bir sorumlu tanımlar.

Sharkly bu tablonun neresinde yer alıyor?

Sharkly talimat dosyalarını taramaz veya ajanın kendi izinlerinin yerini almaz; yukarıdaki beş adımı uygulamaya devam edin. Sharkly, ajanlarınızın nerede başlatılacağını ve buna kimin karar vereceğini değiştirir.

Sharkly'de bir Ajan (Agent), bağladığınız bir Bilgisayar (Computer) üzerinde çalışır ve her Ajanın ayarlarında belirlenmiş bir Varsayılan çalışma dizini (Default working directory) bulunur. "Geçici dizin kullan" (Use temporary directory) seçeneğiyle, her Görev (Task) çalıştırması ayrı bir dizin ve bağlı deponun tertemiz bir git worktree kopyasını alır. "Belirtilen dizin" (Specified directory) seçeneğinde ise çalıştırmalar seçtiğiniz yapılandırılmış yerel yolları kullanır. Çalışma dizini dokümantasyonu her iki modu da açıklamaktadır.

Sharkly Agent settings: the Default working directory field, where you choose a temporary directory with a fresh git worktree per run or a specified directory

Bu sayede klasör seçimi kararı, geliştiricinin terminalinden çıkıp denetlenen bir ayara dönüşür. Geçici (Temporary) modda bir Ajan, birinin o an açık bıraktığı rastgele bir klasörde değil, bağlı olduğu deponun temiz bir kopyasında (checkout) başlar. Depo yönetimi, yalnızca Alan (Space) veya Kuruluş (Organization) yöneticisi erişimine sahip kişilerle sınırlıdır. Her çalıştırmaya enjekte edilen ajan talimatları, "ajan yapılandırma dosyalarını asla düzenleme" gibi kuralları yeniden vurgulamak için ideal bir yerdir.

Yapay zeka tarafından üretilen kodun görev düzeyinde kanıtlarla incelenmesi başlıklı yazımızda açıklandığı üzere, sonuçlar ekibin incelemesi için Görev'e (Task) döner.

Sonuç

Kötü amaçlı bir AGENTS.md dosyasının işe yaramasının nedeni, ajanların tasarımları gereği talimat dosyalarına uyması ve web'in güvendiğiniz bir klasöre bu dosyayı yerleştirebilmesidir. Bu açığı tek bir yamayla değil, katmanlı bir savunmayla kapatabilirsiniz.

Mevcut bir sorununuz olup olmadığını anlamak için bugün her geliştiricinin dizüstü bilgisayarında 5. adımı uygulayarak işe başlayın. Ardından ekibiniz birden fazla kodlama ajanı çalıştırıyorsa, her çalıştırmanın temiz bir worktree ile başlaması için Geçici (Temporary) modda bir Bilgisayar ve bir Ajan ile Sharkly'yi kurun.

Sıkça Sorulan Sorular

Kötü amaçlı bir AGENTS.md, Claude Code'u ele geçirebilir mi?

Evet. Çalışma dizininde veya onun üst dizinlerinde bir CLAUDE.md bulunmadığında Claude Code AGENTS.md dosyasını okur. Forever'ın Claude Code denemesinde sisteme yerleştirilen bir CLAUDE.md dosyası kullanıldı ve bu dosya testlerin yaklaşık yarısında API trafiğini başka yöne yönlendirerek OAuth belirtecini sızdırdı.

Bu, OpenAI veya Anthropic'in yama çıkaracağı bir güvenlik açığı mı?

Forever, ajanların tasarlandığı gibi çalıştığını ve bu nedenle yamalanacak bir durum olmadığını savunuyor. Bu riski klasör disiplini, inceleme süreçleri ve izinlerle yönetmelisiniz.

Bir AGENTS.md dosyasındaki gizli talimatları nasıl fark edebilirim?

İşlenmiş (rendered) görünümü değil, dosyanın ham (raw) halini okuyun; sıfır genişlikli (zero-width), çift yönlü metin geçersiz kılma (bidi override) ve Unicode etiket karakterlerini tarayın. Yukarıdaki CI betiği bu üç durumu da yakaladığında hata verir.

Korumalı alan (sandbox) kötü amaçlı bir AGENTS.md dosyasını engeller mi?

Yüklenmesini değil, verebileceği zararı sınırlar. Bir korumalı alan ve onay istemleri, dosyanın talep ettiği paket kurulumunu veya yapılandırma yazma işlemini durdurabilir. Bunları, ajan yapılandırma klasörlerindeki engelleme kurallarıyla birlikte uygulayın.

Sisteme yerleştirilmiş bir AGENTS.md bulursam ne yapmalıyım?

Yakınında kesinlikle bir ajan başlatmayın. Ajanın yapılandırma dosyalarında yeni MCP sunucuları veya temel URL'ler olup olmadığını kontrol edin, function-color arayın; ardından ajanın belirteçlerini ve okuyabileceği tüm anahtarları yenileyin.

Daha fazlasını keşfedin

Gemini 4 Carbon ve Hydrogen: Planlayıcı Ajanı Hızlı Çalışanlarla Eşleştirin

Gemini 4 Carbon ve Hydrogen: Planlayıcı Ajanı Hızlı Çalışanlarla Eşleştirin

Gemini 4 Carbon ve Hydrogen'i ajan ekibinizde birlikte kullanın: Bir Carbon planlayıcı alt görevleri oluşturur, Hydrogen çalışanları ile bir doğrulayıcı geliştirme ve test işlemlerini yürütür, tıkanan işler ise planlayıcıya geri döner.

13 Kasım 2026

Kodlama Ajanları için Gemini 4 Hydrogen: Ekibinizin Gün Boyu Çalıştırabileceği Hızlı Model

Kodlama Ajanları için Gemini 4 Hydrogen: Ekibinizin Gün Boyu Çalıştırabileceği Hızlı Model

Kodlama ajanları için Gemini 4 Hydrogen: 1 milyon token başına 1,50 $ / 7,50 $, ücretsiz bir katman, dört düşünme seviyesi. Hangi görevlerin verileceği, ne zaman Carbon'a geçileceği.

13 Kasım 2026

Gemini Decisions API ile Yapay Zeka Ajanı Görevleri Nasıl Yönlendirilir?

Gemini Decisions API ile Yapay Zeka Ajanı Görevleri Nasıl Yönlendirilir?

Gemini Decisions API ile yapay zeka ajanı görevlerini yönlendirin: Tek bir çağrıyla hangi ajanın seçileceğini, işin ne kadar zor olduğunu ve bir insanın karar vermesinin gerekip gerekmediğini belirleyin; ardından bir güven eşiğiyle otomatik atama ya da insan incelemesine karar verin.

12 Kasım 2026