- 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
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
Uma história interessante que ouvi recentemente em um podcast sobre Python
pip install, mas recebeu uma recusapip install foo?", ele afirmou que não houve erro e acabou instalandoNã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
É assim que se implementa o "Open" em "OpenAI"
Obrigado pelo artigo interessante
Um caso em que Simonw experimentou C com o ChatGPT há 1 ano
Fiz algo parecido no ano passado e também já experimentei executar binários arbitrários
O medo de falhas de segurança é tão grande que eu nem pensaria em disponibilizar um app desses online
Muito legal, e também seria interessante tentar outras coisas, como executar um daemon em C++ ou adicionar algo ao cron