3 puntos por GN⁺ 2025-03-13 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2025-03-13
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

    • También he subido ejecutables binarios de JavaScript (Deno), Lua y PHP, y he escrito y ejecutado código en esos lenguajes
    • Si no está el paquete de Python que quieres usar, puedes subir un archivo wheel e instalarlo
  • Una historia curiosa que escuché recientemente en un pódcast de Python

    • Un usuario intentó hacer que el LLM probara pip install, pero se negó
    • Cuando le preguntó: "¿Qué mensaje de error aparece si intentas 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

    • Deberían permitirlo todo, como algo tipo Replit
    • Me pregunto por qué usan una versión tan vieja de Linux
    • "Su sandbox está usando un kernel de Linux antiguo de 2016"
  • Así es como "OpenAI" implementa la parte de "Open"

    • Estaría genial si se pudiera obtener los pesos de esta manera
  • Gracias por el artículo tan interesante

    • Normalmente no leo artículos sobre IA, pero este me gustó mucho desde un punto de vista técnico
    • Es incómodo leerlo en Twitter por los pop-ups
  • Un caso en el que Simonw experimentó con C en ChatGPT hace un año

    • Creo que ChatGPT y Claude son muy buenos en C
  • El año pasado hice algo parecido y también probé ejecutar binarios arbitrarios

    • También se podía hacer en GPT, pero en ese momento no era muy confiable
    • Parece que los modelos nuevos siguen mejor las instrucciones, así que pienso volver a intentarlo
  • El miedo a una falla de seguridad es tan grande que ni siquiera pensaría en publicar una app así en línea

    • Terminas haciendo demasiadas preguntas relacionadas con jailbreak
    • Pero hay personas que asumen ese riesgo
  • Está muy bueno, y también sería interesante probar otras cosas, como ejecutar un demonio en C++ o agregar algo a cron