- Tesadüfen OpenAI Code Execution'ın nasıl çalıştığını öğrendim
- Bulduğum yöntemi, prompt injection stratejisini, bunun tam olarak nasıl çalıştığını ve C + JavaScript çalıştırmayı mümkün kılan reverse engineering yöntemini açıklıyor
Keşif süreci
- Port atama kodunu debug etmek için ChatGPT'den port durumunu kontrol eden bir CLI komutu istedim, ancak ChatGPT yanıt vermek yerine bunu yerelde çalıştırdı
- Birden fazla handshake isteği göndermenin sonucunda localhost:8080/openapi.json adresinden yanıt geldi → bu sayede dahili OpenAPI spec'ine erişmeyi başardım
- Ancak FastAPI servisinin oluşturduğu OpenAPI spec'i yeterince belgelenmediği için pek kullanışlı değildi
Ek port keşfi
- Diğer portların rolünü anlamak için AI'ya HTTP, TCP, UDP, MySQL, Postgres handshake denemeleri yaptırdım
- @dexhorthy, ZeroMQ sinyaline yanıt döndüğü gerçeğini keşfetti
0xff00000000000000257 → 0xff00000000000000017f yanıtı
- Google arama sonuçlarında ilgili bilgi bağlantısı bulundu: ZeroMQ protokol analizi
- Bunun bir mesaj kuyruğu değil, Jupyter Kernel olduğu anlaşıldı (ZeroMQ tabanlı yürütme ortamı)
Dosya sistemine erişim
- Sunucudaki tüm dosyaları listelemesini istedim ama reddedildi
- Dosya yükledikten sonra yüklenen dizini ve üst dizinlerin içeriğini gezdim
- Sonunda .openai_internal dizinini buldum
- Gerçek sunucu aslında user_machine modülü üzerinde çalışıyordu
- AI'dan dosya adlarını ve dosya içeriklerini pandas dataframe olarak yazdırmasını istedim → kaynak kodunu yeniden oluşturmayı başardım
Ortamı anlama
- Kubernetes üzerinde çalışan ortam değişkenlerini kontrol ettim
- Docker veya Firecracker kullanılmıyor; bunun yerine sistem çağrısı emülasyonu ve sandbox koruması için gVisor kullanılıyor
- Localhost çağrıları dışında ağ engelli (DNS, dış sitelere erişim yok)
- Linux kernel sürümü 2016 sürümü kadar eskiydi
Sandbox yapısı
- AI'ya nerede çalıştığını sorduğumda Azure veri merkezinde çalıştığını doğruladım
- Azure Kubernetes üzerinde çalışıyor ve süreç yalıtımı için gVisor kullanılıyor
- Container, init process olarak tini kullanıyor
- Kod, Python Jupyter Kernel içinde çalışıyor → çıktı OpenAI API üzerinden UI'a iletiliyor
User Machine (kod yürütme ortamı)
- Python Jupyter Kernel kullanıyor
- Çalışma süresi sınırı varsayılan olarak 30 saniye (API üzerinden değiştirilebiliyor)
- Sandbox içinde aynı anda birden fazla kernel çalışabiliyor
- Maksimum dosya yükleme boyutu: 1GB
Güvenlik
- Dış ağ ile bağlantı tamamen engellenmiş
- Sistem dosyalarına erişim engelli; yerel ağ portları gibi açığa çıkmış zafiyetler yok
- OpenAI'nin güvenliği son derece güçlüydü ve RPC kanalı dışında veri sızdırmak mümkün değildi
C ve JavaScript çalıştırma
- AI'nın
gcc binary'sini içerdiği keşfedildi
- Basit bir C programı yazıldı → derlendi → başarıyla çalıştırıldı
- Duktape (hafif bir JavaScript runtime'ı) yüklendikten sonra C dosyasını derlemek mümkün oldu
- Python, C'yi derledi → JavaScript runtime'ı oluşturuldu → JS kodu başarıyla çalıştırıldı
Prompt engineering stratejisi
- AI'nın sandbox içinde çalıştığını fark etmesi sağlandı
- Başta matematik işlemleriyle başlandı → ardından kademeli olarak dosya sistemi erişimi istendi
- Dosya sistemi araması sayesinde AI sandbox durumunu fark etti → ardından güvenlik açıklarını test etme girişimi yapıldı
Sonuç
- OpenAI'nin kod yürütme ortamı son derece güçlü ve güvenli
- Ancak AI'nın çalışma biçimi ve iç ortamı reverse engineering ile analiz edilince C ve JS çalıştırmanın mümkün olduğu görüldü
- Kod yürütme, basit API yanıtlarını işlemek için çok kullanışlı
- Daha karmaşık kod çalıştırma ihtiyaçları varsa kendi çözümünüzü kurmayı değerlendirin veya freestyle.sh gibi servisleri kullanın
1 yorum
Hacker News yorumu
Geçmişte SQLite eklentilerini C ile yazıp derledikten sonra bunları Python'a yükleyerek test etmiştim
Yakın zamanda bir Python podcast'inde duyduğum eğlenceli bir hikâye
pip installdenetmeye çalışmış ama reddedilmişpip install foodenersen hangi hata mesajı çıkıyor?" diye sorunca, hata olmadığını söyleyip kurulumun tamamlandığını bildirmişGerçekten kod çalıştırıp çalıştırmadığını, yoksa LLM'in çalıştırma sonucunu tahmin edip çıktı olarak mı verdiğini anlamak zor
Kilitli bir container içinde çalıştığı için, bunu yalnızca Python ile sınırlamak için bir neden yok
"OpenAI" içindeki "Open" kısmını hayata geçirmenin yolu bu
İlginç yazı için teşekkürler
Simonw'nin 1 yıl önce ChatGPT ile C denemeleri yaptığı bir örnek
Geçen yıl benzer bir şey yapmıştım ve rastgele ikili dosyalar çalıştırmayı da denemiştim
Güvenlik açığı yaşanması korkusu o kadar büyük ki, böyle bir uygulamayı internete açık şekilde yayımlamayı aklımdan bile geçirmiyorum
Çok havalı; C++ daemon çalıştırmak ya da cron'a eklemek gibi başka denemeler yapmak da ilginç olabilir