- Secara kebetulan menemukan cara kerja OpenAI Code Execution
- Menjelaskan metode yang ditemukan, strategi prompt injection, cara kerjanya secara persis, serta metode reverse engineering yang memungkinkan C + JavaScript dijalankan
Proses penemuan
- Saat mencoba men-debug kode alokasi port, penulis meminta perintah CLI untuk memeriksa status port kepada ChatGPT, tetapi alih-alih menjawab, ChatGPT menjalankannya secara lokal
- Setelah mengirim beberapa permintaan handshake, ada respons dari localhost:8080/openapi.json → dari sini berhasil mengakses spesifikasi OpenAPI internal
- Namun, spesifikasi OpenAPI yang dihasilkan dari layanan FastAPI minim dokumentasi sehingga kurang berguna
Eksplorasi port tambahan
- Untuk memahami peran port lain, penulis meminta AI mencoba handshake HTTP, TCP, UDP, MySQL, dan Postgres
- @dexhorthy menemukan bahwa ada respons terhadap sinyal ZeroMQ
0xff00000000000000257 → respons 0xff00000000000000017f
- Dari hasil pencarian Google ditemukan tautan informasi terkait: Analisis protokol ZeroMQ
- Lalu diketahui bahwa itu bukan message queue, melainkan Jupyter Kernel (lingkungan eksekusi berbasis ZeroMQ)
Akses sistem file
- Meminta untuk menampilkan semua file di server tetapi ditolak
- Setelah mengunggah file, penulis menelusuri direktori unggahan dan direktori di atasnya
- Akhirnya menemukan direktori .openai_internal
- Server sebenarnya berjalan di dalam modul user_machine
- Meminta AI menampilkan nama file dan isi file sebagai dataframe pandas → berhasil merekonstruksi source code
Memahami lingkungan
- Mengonfirmasi variabel lingkungan bahwa sistem berjalan di Kubernetes
- Tidak menggunakan Docker atau Firecracker, melainkan gVisor untuk emulasi system call dan perlindungan sandbox
- Jaringan diblokir kecuali panggilan localhost (DNS dan akses ke situs eksternal tidak tersedia)
- Versi kernel Linux sangat lama, yaitu versi tahun 2016
Struktur sandbox
- Saat AI ditanya di mana ia berjalan, dipastikan bahwa ia berjalan di pusat data Azure
- Berjalan di Azure Kubernetes, menggunakan gVisor untuk isolasi proses
- Container menggunakan tini sebagai proses init
- Kode dieksekusi di Python Jupyter Kernel → output dikirim ke UI melalui OpenAI API
User Machine (lingkungan eksekusi kode)
- Menggunakan Python Jupyter Kernel
- Batas waktu eksekusi secara default adalah 30 detik (dapat diubah melalui API)
- Beberapa kernel dapat berjalan bersamaan di dalam sandbox
- Ukuran maksimum unggahan file: 1GB
Keamanan
- Koneksi ke jaringan eksternal diblokir sepenuhnya
- Akses ke file sistem diblokir, dan tidak ada celah yang terekspos seperti port jaringan lokal
- Keamanan OpenAI sangat kuat, dan selain kanal RPC tidak ada cara untuk mengekspor data
Menjalankan C dan JavaScript
- Ditemukan bahwa AI menyertakan biner
gcc
- Menulis program C sederhana → kompilasi → berhasil dijalankan
- Setelah mengunggah Duktape (runtime JavaScript ringan), berhasil mengompilasi file C
- Python mengompilasi C → membuat runtime JavaScript → berhasil menjalankan kode JS
Strategi prompt engineering
- Menipu AI agar mengenali bahwa dirinya berjalan di dalam sandbox
- Awalnya dimulai dari operasi matematika → lalu secara bertahap meminta akses sistem file
- Melalui penelusuran sistem file, AI mengenali status sandbox-nya → lalu mencoba menguji celah keamanan
Kesimpulan
- Lingkungan eksekusi kode OpenAI sangat kuat dan aman
- Namun, dari hasil reverse engineering terhadap cara kerja AI dan lingkungan internalnya, C dan JS ternyata bisa dijalankan
- Eksekusi kode sangat berguna untuk menangani respons API sederhana
- Jika membutuhkan eksekusi kode yang kompleks, pertimbangkan membangun solusi sendiri atau gunakan layanan seperti freestyle.sh
1 komentar
Komentar Hacker News
Pernah menulis ekstensi SQLite dalam C, mengompilasinya, lalu memuatnya ke Python untuk diuji
Cerita menarik yang baru-baru ini didengar di podcast Python
pip install, tetapi ditolakpip install foo?", ia menyatakan tidak ada galat dan paket pun terpasangTidak jelas apakah kode benar-benar dijalankan, atau LLM hanya menebak hasil eksekusinya lalu menampilkannya
Karena dijalankan di dalam container yang terkunci, tidak ada alasan untuk membatasinya hanya pada Python
Ini adalah cara mewujudkan bagian "Open" dalam "OpenAI"
Terima kasih untuk artikelnya yang menarik
Contoh Simonw yang bereksperimen dengan C di ChatGPT setahun lalu
Tahun lalu saya melakukan hal serupa, dan juga pernah mencoba menjalankan biner arbitrer
Kekhawatiran akan kegagalan keamanan sangat besar sehingga saya bahkan tidak terpikir untuk merilis aplikasi seperti itu secara online
Sangat keren, dan akan menarik juga mencoba hal lain seperti menjalankan daemon C++ atau menambahkannya ke cron