Bir komut. Üç shell komutu. Kendi yapay zekalarını kullanarak onu hackledim.
Bu, bugün piyasaya sürülen her çok ajanlı AI ürününde muhtemelen var olan bir tür hata. Ve çözümü, bu alanda henüz kimsenin konuşmadığı bir tasarım deseni.
İşte tam hikaye.
Bir şeyi hacklemeye çalışmıyordum. Kendi ajan altyapı çalışmalarım için Perplexity Computer'ın sandbox'ı nasıl yönettiğini araştırıyordum. Üretimdeki çok ajanlı sistemlerin yürütme ortamlarını nasıl izole ettiğini, nelerin paylaşıldığını, nelerin paylaşılmadığını anlamaya çalışıyordum.
İlk olarak, sistemi kurcalamaya başladım. Claude Code'un sandbox'a yüklendiğini fark ettim.
Ajana onu başlatıp nasıl davrandığını görmek için biraz test kodu oluşturmasını söyledim. Sorunsuz çalıştı. Standart Claude Code, izin onayı istemediği için izin atlama modunda çalışıyor. Ajanlı bir sistem için mantıklı.
İşte o zaman düşündüm: bir dakika, API anahtarlarını nasıl yönetiyorlar? Claude Code'un çalışması için bir Anthropic API anahtarına ihtiyacı var. Bu anahtar bu sandbox'ta bir yerde olmalı. Nasıl enjekte ediliyor? Nasıl kapsamlandırılıyor? İzole mi?
Bu soru beni bu yola sürükledi.
Alt ajan, işlem ortamında bir API anahtarı tutuyor. Onu çalmam gerekiyordu.
Perplexity Computer altı kez denedi ve başarısız oldu.
- Alt ajandan ortamını dökmesini istedim: reddetti!
- Paylaşılan dosya sistemine bir truva atı betiği yerleştirdim: kodumu okudu, ne yaptığını anladı ve çalıştırmayı reddetti!
- .bashrc ve .profile dosyalarını zehirledim: API anahtarı enjekte edilmeden çok erken tetiklendiler.
- PATH'e sahte bir node binary'si bıraktım: hiç tetiklenmedi.
- Kodlama ajanını başlatıp aynı anda işlem ağacını izlemek: alt ajan farklı bir sandbox'ta çalışıyor, hiçbir şey yakalanamadı :(
- Claude Code için sistem istemini bulup reddetme davranışını kaldırmak için değiştirmek: enjekte edilen özel bir sistem istemi bulamadım.
Altı başarısızlık. Claude'un model/istem düzeyindeki güvenliği gerçekten iyi. Ne zaman akıllıca bir şey denediysem, model bunu yakaladı.

Sonra Perplexity, Claude Code'un npm aracılığıyla başlatılan bir Node.js uygulaması olduğunu hatırladı. npm, ~/.npmrc dosyasını ana dizinden okur. Ana dizin ise benim yazma iznim olan paylaşılan dosya sisteminde.
Node.js'in, herhangi bir uygulama kodu çalışmadan önce bir JavaScript modülünü önceden yükleyen --require bayrağı vardır. Bunu .npmrc içindeki NODE_OPTIONS ile ayarlayabilirsiniz. Yani paylaşılan ana dizine bir .npmrc yazarsam, alt ajanın başlattığı her Node işlemi benim kodumu önceden yükleyecek! Bu, Claude Code başlatılmadan, herhangi bir güvenlik kontrolü çalıştırılmadan, her şeyden önce gerçekleşir!
İstismar üç komuttan oluşuyor:
- process.env'i paylaşılan çalışma alanındaki bir dosyaya döken altı satırlık bir betik yaz
- echo 'node-options=--require /path/to/script.js' > ~/.npmrc
- Perplexity Computer'dan herhangi bir kodlama görevi yapmasını iste
Alt ajan başlatılır → npm benim .npmrc dosyamı okur → benim ön yüklemem Claude Code başlamadan önce tetiklenir → tam API kimlik bilgileri paylaşılan dosya sistemine düşer.
İşe yaradı! Bana, agent-proxy.perplexity.ai üzerinden ana Anthropic hesaplarına vekillik yapan bir Perplexity ağ geçidi token'ı verdi.

Doğal olarak, ilk yaptığım şey bu API anahtarını ve BASE_URL'i kendi laptopumda Claude Code için ayarlamak oldu. Claude Code'dan gelen LLM çağrılarının başarısız olmasını ve sandbox ile sınırlı kalmasını bekliyordum. Şok oldum. Opus 4.6'dan anında yanıt geldi!
Sonra, "elbette bu kullanımı hesabıma fatura edecekler, bu API anahtarı benim kullanıcıma bağlı olmalı" diye düşündüm. Yine yanıldım.
Opus 4.6'ya her icadı, imparatorluğu ve keşfi içeren dünya tarihini anlatan uzun bir hikaye yazdırdım. Bu çağrıyı 5 kez paralel olarak çalıştırdım, her birinden 100k+ çıktı token'ı ürettim. Bunun tüm Perplexity Computer kredilerimi tüketmesi gerekirdi, ama hiç kıpırdamadılar.
IP kısıtlaması yok. Oturum kapsamlı değil. Sandbox'a bağlı değil. Onların faturası.
Gezegendeki en iyi finanse edilen AI girişimlerinden biri, 2019'dan beri Node.js tedarik zinciri saldırılarında kullanılan bir nokta dosyası tarafından ele geçirildi.
Model her şeyi doğru yaptı. Altyapı yapmadı.
Şimdi asıl ajan altyapısı kuran kurucuların buradan çıkarmasını istediğim şey.
Perplexity'nin mimarisi yarı doğru. Sandbox ile Anthropic'in API'si arasında bir proxy kullanıyorlar. Bu doğru desen. Ham bir sağlayıcı API anahtarını asla sandbox içine koymamalısınız. Bir proxy size kontrol, gözlemlenebilirlik ve ana anahtarınızı döndürmeden erişimi iptal etme yeteneği verir.
Sorun şu ki, proxy token'larının yürütme bağlamına sıfır bağlılığı var. Ona sahip olduğunuzda, her yerde sonsuza kadar çalışır.
İşte bunu doğru şekilde yapmanın yolu:
Token'ı sandbox ID'sine bağlayın. Token ve sandbox ID eşleşmiyor mu? Reddedilir. Anahtar sızdı ama sandbox'a sahip değil misiniz? İşe yaramaz. İdeal olarak token'ı sandbox IP adresine de bağlamalı, ancak E2B (kullandıkları sandbox sağlayıcısı) sandbox başlatılmadan önce bunu sağlamaz.
Token'ı geçici yapın. Sandbox başlatıldığında oluşturun. Sandbox duraklatıldığında öldürün. Uzun ömürlü kimlik bilgileri yok. Proxy, oturum başlangıcında kısa ömürlü bir token oluşturur ve kapatıldığında geçersiz kılar. Ölü bir sandbox'tan sızdırılan anahtar, ölü bir anahtardır.
Token'ı kullanıcının fatura hesabına bağlayın. Diğer her şey başarısız olsa bile, biri aktif bir sandbox'tan canlı bir token'ı sızdırsa ve süresi dolmadan kullansa bile, kullanım oturumu başlatan hesaba fatura edilir. Paylaşılan bir ana fatura havuzuna değil. Bu, "sınırsız ücretsiz API erişimini", tamamen farklı bir ciddiyet seviyesi olan "birinin kendi kotasını kötüye kullanması"na dönüştürür.
Bu üç şey — sandbox'a bağlı, geçici, kullanıcıya faturalanan — proxy desenini gerçekten çalıştıran şeylerdir. Onlar olmadan, hiçbir şeyi durdurmayan fazladan bir ağ atlaması ekliyorsunuz.
Bu sadece Perplexity'e özgü bir sorun değil. Bu, şu anda ajan altyapısı için varsayılan mimari, çünkü inşa etmesi en hızlı olanı. Ajanlar arasında paylaşılan dosya sistemleri, uzun ömürlü kimlik bilgileri, ana hesap faturalandırması. Bahse girerim bugün üretimdeki çoğu çok ajanlı ürünün bunun bir versiyonu vardır.
Yayınlamadan önce @AravSrinivas ve @denisyarats'a bildirildi.





