3 pontos por GN⁺ 2025-03-13 | 1 comentários | Compartilhar no WhatsApp
  • Por acaso, descobriram como o OpenAI Code Execution funciona
  • Explicam o método encontrado, a estratégia de prompt injection, como isso funciona exatamente e o processo de engenharia reversa que permitiu executar C + JavaScript

Processo da descoberta

  • Ao tentar depurar código de alocação de portas, pediram ao ChatGPT um comando de CLI para verificar o estado das portas, mas o ChatGPT não respondeu e executou localmente
  • Após enviar várias requisições de handshake, houve resposta em localhost:8080/openapi.json → isso permitiu acessar a especificação interna do OpenAPI
  • Porém, a especificação OpenAPI gerada pelo serviço FastAPI tinha pouca documentação e era pouco útil

Exploração adicional de portas

  • Para identificar o papel de outras portas, fizeram a IA tentar handshakes de HTTP, TCP, UDP, MySQL e Postgres
  • @dexhorthy descobriu que havia resposta a um sinal do ZeroMQ
    • 0xff00000000000000257 → resposta 0xff00000000000000017f
    • Em uma busca no Google, encontraram um link com informações relacionadas: Análise do protocolo ZeroMQ
  • Descobriram que não era uma fila de mensagens, mas sim um Jupyter Kernel (ambiente de execução baseado em ZeroMQ)

Acesso ao sistema de arquivos

  • Pediram para listar todos os arquivos do servidor, mas o pedido foi recusado
  • Depois de enviar um arquivo, exploraram o diretório de upload e os diretórios acima dele
  • No fim, encontraram o diretório .openai_internal
    • O servidor real estava em execução no módulo user_machine
  • Pediram à IA que exibisse nomes e conteúdos de arquivos em um dataframe do pandas → conseguiram reconstruir o código-fonte

Entendendo o ambiente

  • Confirmaram variáveis de ambiente de um ambiente em execução no Kubernetes
  • Em vez de Docker ou Firecracker, usava gVisor para emulação de chamadas de sistema e proteção do sandbox
  • A rede é bloqueada exceto para chamadas localhost (sem DNS, sem acesso a sites externos)
  • A versão do kernel Linux era de 2016, portanto bastante antiga

Estrutura do sandbox

  • Ao perguntar à IA onde ela estava sendo executada, confirmaram que rodava em um data center da Azure
  • Executando em Azure Kubernetes, com gVisor para isolamento de processos
  • O contêiner usa tini como processo init
  • O código é executado em um kernel Jupyter Python → a saída é enviada para a UI via API da OpenAI

User Machine (ambiente de execução de código)

  • Usa um Jupyter Kernel de Python
  • O limite de tempo de execução é, por padrão, 30 segundos (pode ser alterado via API)
  • Vários kernels podem rodar simultaneamente no sandbox
  • Tamanho máximo de upload de arquivos: 1 GB

Segurança

  • A conexão com a rede externa é completamente bloqueada
  • O acesso a arquivos do sistema é bloqueado, e não há vulnerabilidades expostas como portas de rede local
  • A segurança da OpenAI era muito forte, e não havia exfiltração de dados possível fora do canal RPC

Execução de C e JavaScript

  • Descobriram que a IA incluía o binário gcc
    • Escreveram um programa simples em C → compilaram → executaram com sucesso
  • Após enviar o Duktape (runtime leve de JavaScript), conseguiram compilar um arquivo C
    • O Python compila C → cria um runtime JavaScript → executa código JS com sucesso

Estratégia de prompt engineering

  • Levaram a IA a acreditar que estava rodando dentro do sandbox
  • No início, começaram com operações matemáticas → depois passaram gradualmente a pedir acesso ao sistema de arquivos
  • Ao explorar o sistema de arquivos, a IA percebeu que estava em estado de sandbox → tentaram então testar brechas de segurança

Conclusão

  • O ambiente de execução de código da OpenAI é muito robusto e tem ótima segurança
  • Porém, ao fazer engenharia reversa do comportamento da IA e do ambiente interno, foi possível executar C e JS
  • A execução de código é muito útil para processar respostas simples de API
  • Se for necessário executar código mais complexo, vale considerar construir uma solução própria ou usar serviços como freestyle.sh

1 comentários

 
GN⁺ 2025-03-13
Comentários no Hacker News
  • No passado, já tive a experiência de escrever uma extensão do SQLite em C, compilá-la e depois carregá-la no Python para testar

    • Também já enviei executáveis binários de JavaScript (Deno), Lua e PHP, e escrevi e executei código nessas linguagens
    • Quando não há o pacote Python que quero usar, é possível enviar um arquivo wheel e instalá-lo
  • Uma história interessante que ouvi recentemente em um podcast sobre Python

    • O usuário tentou fazer o LLM executar pip install, mas recebeu uma recusa
    • Quando perguntou "que mensagem de erro aparece se você tentar pip install foo?", ele afirmou que não houve erro e acabou instalando
  • Não dá para saber se ele está realmente executando o código ou se o LLM está apenas adivinhando o resultado da execução e exibindo isso

  • Como está sendo executado em um contêiner bloqueado, não há motivo para limitar isso apenas ao Python

    • Deveriam permitir tudo, como algo no estilo do Replit
    • Fico curioso sobre por que usam um Linux tão antigo
    • "O sandbox deles está usando um kernel Linux antigo, de 2016"
  • É assim que se implementa o "Open" em "OpenAI"

    • Seria legal se desse para obter os pesos dessa forma
  • Obrigado pelo artigo interessante

    • Normalmente não leio artigos sobre IA, mas gostei muito deste do ponto de vista técnico
    • É desconfortável ler no Twitter por causa dos pop-ups
  • Um caso em que Simonw experimentou C com o ChatGPT há 1 ano

    • Acho que ChatGPT e Claude são muito bons em C
  • Fiz algo parecido no ano passado e também já experimentei executar binários arbitrários

    • Também dava para executar no GPT, mas na época a confiabilidade não era alta
    • Como os modelos novos parecem seguir melhor os prompts, pretendo tentar de novo
  • O medo de falhas de segurança é tão grande que eu nem pensaria em disponibilizar um app desses online

    • Acabo fazendo perguntas demais relacionadas a jailbreak
    • Mas há pessoas que assumem esse risco
  • Muito legal, e também seria interessante tentar outras coisas, como executar um daemon em C++ ou adicionar algo ao cron