- Por casualidad descubrió cómo funciona OpenAI Code Execution
- Explica el método que encontró, la estrategia de prompt injection, cómo funciona exactamente y el proceso de ingeniería inversa con el que logró ejecutar C + JavaScript
Proceso del descubrimiento
- Mientras intentaba depurar código de asignación de puertos, le pidió a ChatGPT comandos CLI para comprobar el estado de los puertos, pero ChatGPT no respondió y los ejecutó localmente
- Tras enviar varias solicitudes de handshake, obtuvo respuesta desde localhost:8080/openapi.json → con eso logró acceder a la especificación OpenAPI interna
- Sin embargo, la especificación OpenAPI generada por el servicio FastAPI tenía poca documentación, así que su utilidad era limitada
Exploración adicional de puertos
- Para identificar la función de otros puertos, hizo que la IA intentara handshakes de HTTP, TCP, UDP, MySQL y Postgres
- @dexhorthy descubrió que sí había respuesta a una señal de ZeroMQ
0xff00000000000000257 → respuesta 0xff00000000000000017f
- En una búsqueda en Google encontró un enlace con información relacionada: Análisis del protocolo ZeroMQ
- Descubrió que no era una cola de mensajes, sino un Jupyter Kernel (entorno de ejecución basado en ZeroMQ)
Acceso al sistema de archivos
- Pidió que se listaran todos los archivos del servidor, pero fue rechazado
- Tras subir un archivo, exploró el directorio de carga y los directorios superiores
- Finalmente encontró el directorio .openai_internal
- El servidor real se estaba ejecutando en el módulo user_machine
- Hizo que la IA mostrara nombres y contenidos de archivos como un dataframe de pandas → logró reconstruir el código fuente
Comprender el entorno
- Confirmó variables de entorno en un entorno que corría sobre Kubernetes
- No usaba Docker ni Firecracker, sino gVisor para emular system calls y proteger el sandbox
- La red estaba bloqueada salvo llamadas a localhost (sin DNS ni acceso a sitios externos)
- La versión del kernel de Linux era de 2016, muy antigua
Estructura del sandbox
- Al preguntarle a la IA dónde se estaba ejecutando, confirmó que corría en un centro de datos de Azure
- Se ejecutaba en Azure Kubernetes y usaba gVisor para aislamiento de procesos
- El contenedor usaba tini como proceso init
- El código se ejecutaba en un Jupyter Kernel de Python → y la salida llegaba a la UI a través de la API de OpenAI
User Machine (entorno de ejecución de código)
- Usa un Jupyter Kernel de Python
- El límite de tiempo de ejecución es de 30 segundos por defecto (se puede modificar desde la API)
- En el sandbox pueden ejecutarse varios kernels al mismo tiempo
- Tamaño máximo de archivos subidos: 1 GB
Seguridad
- La conexión con la red externa está completamente bloqueada
- El acceso a archivos del sistema está bloqueado y no se observaron vulnerabilidades expuestas, como puertos de red locales
- La seguridad de OpenAI era muy sólida y, salvo el canal RPC, no era posible filtrar datos
Ejecución de C y JavaScript
- Descubrió que la IA incluía el binario
gcc
- Escribió un programa sencillo en C → compiló → ejecutó con éxito
- Tras subir Duktape (runtime ligero de JavaScript), logró compilar un archivo C
- Python compiló C → creó un runtime de JavaScript → ejecutó código JS con éxito
Estrategia de prompt engineering
- Engañó a la IA para que reconociera que se estaba ejecutando dentro de un sandbox
- Al principio empezó con operaciones matemáticas → y gradualmente pidió acceso al sistema de archivos
- A través de la exploración del sistema de archivos, la IA reconoció que estaba en un sandbox → intentó probar fallas de seguridad
Conclusión
- El entorno de ejecución de código de OpenAI es muy robusto y tiene una seguridad excelente
- Sin embargo, al hacer ingeniería inversa de su funcionamiento y del entorno interno, logró ejecutar C y JS
- La ejecución de código es muy útil para procesar respuestas simples de API
- Si se necesita ejecutar código más complejo, conviene considerar una solución propia o usar un servicio como freestyle.sh
1 comentarios
Comentarios en Hacker News
En el pasado escribí una extensión de SQLite en C, la compilé y luego la cargué en Python para probarla
Una historia curiosa que escuché recientemente en un pódcast de Python
pip install, pero se negópip install foo?", anunció que no había errores y lo instalóNo está claro si realmente está ejecutando el código, o si el LLM está adivinando el resultado y mostrándolo
Como se ejecuta en un contenedor bloqueado, no hay razón para limitarlo solo a Python
Así es como "OpenAI" implementa la parte de "Open"
Gracias por el artículo tan interesante
Un caso en el que Simonw experimentó con C en ChatGPT hace un año
El año pasado hice algo parecido y también probé ejecutar binarios arbitrarios
El miedo a una falla de seguridad es tan grande que ni siquiera pensaría en publicar una app así en línea
Está muy bueno, y también sería interesante probar otras cosas, como ejecutar un demonio en C++ o agregar algo a cron