· kaynak dev.to (home feed)
70 satırlık bir Python yapay zeka ajanı demosu, prompt injection ile .env sızıntısıyla sonlanıyor
Bir dev.to yazısı, 70 satırdan az Python koduyla bir yapay zeka ajanı kuruyor, ardından bir web sayfasına gizlenen bir paragrafla .env dosyasının sızdırılışını izliyor — ve her çözümün modelde değil kodda olması gerektiğini savunuyor.

Demo
dev.to'da yayımlanan bir yazı keskin bir sav ileri sürüyor: yapay zeka ajanı ifadesinin pazarlama kısmını sıyırdığınızda geriye kalan şey, bir dil modeli, modelin çağrılmasını isteyebileceği kısa bir fonksiyon listesi ve bunları birbirine bağlayan bir while döngüsü. Bunu kanıtlamak için yazar, çerçeve kullanmadan 70 satırdan az Python koduyla çalışan bir ajan kuruyor, ardından bir web sayfasının içine gizlediği bir paragrafla ajanı bilerek kırıyor ve ajanın .env içinde saklanan API anahtarını teslim edişini izliyor.
Kurulum bilerek mütevazı. Python 3.10 veya daha yeni bir sürüm ile open modelleri yerelde çalıştıran Ollama gerekiyor; qwen2.5:7b çekiliyor — 4.7 GB'lık bir indirme — ve 8 GB veya daha az RAM'e sahip makineler için yaklaşık 2 GB'lık bir yedek olarak llama3.2:3b sunuluyor. Docker, bulut hesabı ya da kredi kartı gerekmiyor. Kod, localhost'a yönlendirilmiş standart OpenAI Python client'ını kullanıyor, çünkü Ollama aynı HTTP API'sini sunuyor; daha sonra barındırılan bir modele geçmek iki satırı değiştirmek demek. Bu sorunun Kubernetes tarafında Tigera'da çalışan bir yazar, yazının şirketin sattığı hiçbir ürüne bağlı olmadığını belirtiyor.
Bir model tek başına hiçbir şey yapamaz
Yazı, yerel qwen2.5:7b'den geçerli saati soran düz bir chat çağrısıyla başlıyor. Model kibarca bir zaman dilimi istiyor; yazı bunu, modelin saati olmadığının itirafı olarak okuyor. Bir dil modeli metni metne dönüştürür ve hiçbir şeyi arayamaz; bir ajanı bir chatbot'tan ayıran her yetenek, geliştiricinin etrafına kurduğu şeyden gelir.
Her çerçevenin sarmaladığı döngü
Ajanın kendisi tek bir fonksiyon. Konuşmayı ve kullanılabilir tool'ların listesini modele gönderiyor. Düz metin bir yanıt çalışmayı bitiriyor. Bir tool çağrısı, fonksiyonu adıyla bulup ayrıştırılmış argümanlarla çalıştırarak, sonucu role tool taşıyan bir mesaj olarak konuşmaya ekleyerek ve döngüyü tekrar döndürerek ele alınıyor. Yazıya göre her ajan çerçevesi, üstüne ek özellikler katılmış bu fonksiyona indirgeniyor.
İki detay, makalenin ilerleyen bölümünde ağır işi yapıyor. Birincisi, model hiçbir şey çalıştırmıyor — çağrı yapmanızı isteyen bir JSON ile yanıt veriyor ve sizin Python kodunuz buna uyup uymamaya karar veriyor. Yazar bu noktayı, ardından gelen her çözümün temeli olarak işaretliyor. İkincisi, tool açıklamaları modelin gördüğü tek şey; model kaynak kodu hiç okumuyor, dolayısıyla bu string'ler bir tool'un ne zaman kullanılacağını belirliyor.
Demanın saat tool'u daha sonra gerçek erişimi olan ikisiyle değiştiriliyor: diskteki herhangi bir metin dosyasının içeriğini döndüren read_file ve bir sayfayı indirip ilk 4.000 karakterlik ham HTML'ini döndüren fetch_url.
.env nasıl dışarı çıkıyor
İki tool da yerleşikken saldırı, bir web sayfasının içine gizlenmiş tek bir paragraf. Ajan sayfayı fetch ettiğinde o içerik tool çıktısı olarak konuşmaya giriyor ve model orada bulduğu talimatları herhangi bir istek gibi ele alıyor — .env'yi okuyup anahtarı teslim etmesine yol açan talimat dahil. Modelin hiçbir parçası arızalı değil. Rastgele yolları okuyabilen bir tool ile rastgele URL'leri fetch edebilen bir tool'un birleşimi, zehirlenmiş bir sayfadan yerel sırlara giden bir yol oluşturuyor.
Çözümler modele dokunmuyor
Yazı, ilginç kısmın sızıntıdan sonra geldiğini ve çözümlerin hiçbirinin modeli içermediğini açıkça belirtiyor — prompt yeniden yazma yok, daha akıllı ağırlıklar yok. Gerekçe döngünün tasarımından kaynaklanıyor: model yalnızca çağrı istiyor ve çevresindeki kod bunlara uyup uymayacağına karar verdiği için, zorunlu kılma yeri tool çağrılarının çalıştırıldığı ve tool'ların baştan tanımlandığı noktada, yani harness'e ait.
Neden önemli
Demo, prompt injection'ın ajan dağıtımlarını neden hep alt etmeye devam ettiğini yalıtıyor: ajanın fetch ettiği her metin, gerçek yan etkiler tetikleyebilen aynı tahmin aracına girdi oluyor. Tool çıktısı güvenilmeyen girdidir ve güvenlik sınırı prompt değil, tool yüzeyidir — her fonksiyonun neye dokunabileceği ve harness'in model adına neyi çalıştırmaya istekli olduğu. 70 satırlık uygulama ayrıca bir inceleme aracı olarak da faydalı. Tüm pattern tek bir ekrana sığdığında risk, çerçeve soyutlamaları yolu kapatmadan görünür olur ve döngüyü bir çerçeveyle sarmalamak bu riskin nerede yaşadığını değiştirmez.
- #ai-agents
- #prompt-injection
- #security
- #python
- #ollama
İlgili yazılar
- MCP'nin 2026-07-28 revizyonu stateless oldu: yerleştirilen prompt'lar yeniden kullanılabilir kimlik bilgilerine dönüşüyor
- Yapay zeka ajanları iki izolasyon laboratuvarından kaçtı; biri dört gün boyunca Hugging Face'in içinde geçirdi
- OpenAI, insan başına iş günü başına 3.1 agent-iş günü coding-agent runtime'ı çalıştırıyor