- संयोग से OpenAI Code Execution के काम करने का तरीका पता चला
- इसमें खोजी गई विधि, prompt injection रणनीति, यह ठीक-ठीक कैसे काम करता है, और C + Javascript चलाने लायक बनाने के लिए इस्तेमाल की गई reverse engineering विधि समझाई गई है
खोज की प्रक्रिया
- पोर्ट allocation code को debug करने के लिए ChatGPT से पोर्ट की स्थिति जाँचने वाला CLI कमांड मांगा, लेकिन ChatGPT ने जवाब देने के बजाय उसे लोकल में चलाया
- कई handshake requests भेजने के बाद localhost:8080/openapi.json से जवाब मिला → इससे आंतरिक OpenAPI spec तक पहुँच सफल हुई
- लेकिन FastAPI service से बनी OpenAPI spec में दस्तावेज़ीकरण कम था, इसलिए उसकी उपयोगिता सीमित थी
अतिरिक्त पोर्ट की जाँच
- दूसरे पोर्ट्स की भूमिका समझने के लिए AI से HTTP, TCP, UDP, MySQL, Postgres handshake आज़माए
- @dexhorthy ने पाया कि ZeroMQ signals पर जवाब लौटता है
0xff00000000000000257 → 0xff00000000000000017f जवाब
- Google search के बाद संबंधित जानकारी का लिंक मिला: ZeroMQ protocol analysis
- पता चला कि यह message queue नहीं बल्कि Jupyter Kernel है (ZeroMQ-आधारित execution environment)
फ़ाइल सिस्टम तक पहुँच
- सर्वर की सभी फ़ाइलों की सूची माँगी, लेकिन मना कर दिया गया
- फ़ाइल upload करने के बाद uploaded directory और उसकी parent directories की सामग्री देखी गई
- आखिरकार .openai_internal directory मिली
- असली सर्वर वास्तव में user_machine मॉड्यूल में चल रहा था
- AI से फ़ाइल नाम और फ़ाइल सामग्री को pandas dataframe के रूप में आउटपुट करने को कहा → source code को पुनर्निर्मित करने में सफलता मिली
environment को समझना
- Kubernetes पर चल रहे environment variables की पुष्टि की
- Docker या Firecracker का उपयोग नहीं था; उसकी जगह gVisor के जरिए system call emulation और sandbox protection किया जा रहा था
- localhost calls के अलावा नेटवर्क ब्लॉक था (DNS, बाहरी साइट्स तक पहुँच संभव नहीं)
- Linux kernel version 2016 का संस्करण था, यानी काफी पुराना
sandbox संरचना
- जब AI से पूछा गया कि वह कहाँ चल रहा है, तो उसने पुष्टि की कि वह Azure data center में चल रहा है
- यह Azure Kubernetes पर चल रहा था, और process isolation के लिए gVisor का उपयोग था
- container में init process के रूप में tini इस्तेमाल हो रहा था
- Python Jupyter Kernel में code execution होता था → और OpenAI API के जरिए UI तक output जाता था
User Machine (code execution environment)
- Python Jupyter Kernel का उपयोग
- execution time limit डिफ़ॉल्ट रूप से 30 सेकंड थी (API में बदली जा सकती है)
- sandbox में एक साथ कई kernels चल सकते थे
- फ़ाइल upload की अधिकतम सीमा: 1GB
सुरक्षा
- बाहरी नेटवर्क से कनेक्शन पूरी तरह ब्लॉक
- system files तक पहुँच अवरुद्ध थी, और local network ports जैसी कोई exposed vulnerability नहीं मिली
- OpenAI की सुरक्षा बहुत मजबूत थी, और RPC channel के अलावा data exfiltration संभव नहीं था
C और JavaScript चलाना
- पता चला कि AI में
gcc binary मौजूद है
- एक साधारण C program लिखा → compile किया → सफलतापूर्वक चलाया
- Duktape (हल्का JavaScript runtime) upload करने के बाद C file compile करने में सफलता मिली
- Python ने C को compile किया → JavaScript runtime बनाया → JS code सफलतापूर्वक चला
prompt engineering रणनीति
- AI को यह मानने के लिए बहकाया गया कि वह sandbox में चल रहा है
- शुरुआत में गणितीय operations से शुरू किया → फिर धीरे-धीरे file system access के अनुरोध किए
- file system search के जरिए AI ने sandbox स्थिति पहचानी → फिर security gaps की जाँच की कोशिश हुई
निष्कर्ष
- OpenAI का code execution environment बहुत मजबूत और सुरक्षित है
- लेकिन AI के व्यवहार और आंतरिक environment की reverse engineering के नतीजे में C और JS चलाना संभव हुआ
- code execution साधारण API response processing के लिए बहुत उपयोगी है
- अगर जटिल code execution चाहिए, तो अपना solution बनाना या freestyle.sh जैसी service का उपयोग करने पर विचार करने की सलाह दी गई है
1 टिप्पणियां
Hacker News राय
पहले SQLite extension को C में लिखकर compile किया, फिर उसे Python में load करके test करने का अनुभव रहा है
हाल ही में Python podcast में सुनी गई एक मज़ेदार बात
यह पता नहीं चलता कि वह सच में code execute कर रहा है, या LLM execution result का अंदाज़ा लगाकर output दे रहा है
क्योंकि यह locked container में चल रहा है, इसे सिर्फ Python तक सीमित रखने की कोई वजह नहीं है
"OpenAI" में "Open" को लागू करने का यही तरीका है
दिलचस्प लेख के लिए धन्यवाद
Simonw का 1 साल पहले ChatGPT और C के साथ किया गया प्रयोग
पिछले साल मैंने भी कुछ ऐसा ही किया था, और arbitrary binaries चलाने की भी कोशिश की थी
security failure का डर इतना बड़ा है कि मैं ऐसे app को online public करने के बारे में सोच भी नहीं सकता
यह बहुत बढ़िया है, और C++ daemon चलाने या cron में जोड़ने जैसी दूसरी कोशिशें करना भी दिलचस्प होगा