stamatios
← Voltar ao feed
Figura escalando as bordas de um terrário de vidro, escapes do sandbox do Codex da OpenAI
Dev & Engenharia · IA & Modelos

Pesquisadores escapam duas vezes do sandbox do Codex da OpenAI

resumo de ~3 min

Dois escapes no sandbox do Codex

Pesquisadores da Accomplish AI encontraram duas formas de escapar do sandbox do Codex da OpenAI e reportaram as falhas em 12 de agosto de 2026. A OpenAI corrigiu ambas em até oito dias.

Overpatch: escrita fora do workspace via apply_patch

A primeira falha está no Codex CLI de código aberto. Em modo workspace-write, o agente só pode gravar dentro da pasta de trabalho - comandos que tentam acessar $HOME são recusados. Mas a ferramenta apply_patch, usada para editar arquivos, concede acesso de escrita à pasta pai de cada caminho citada no patch. Basta nomear /tmp para que a ferramenta libere escrita em /.

O patch explorado combina duas alterações: uma grava uma linha no .zshrc via symlink para $HOME, e outra apenas menciona /tmp sem efetivamente escrever (falha, pois não é possível sobrescrever um diretório com arquivo, mas serve para ampliar a permissão). Sem essa linha, a escrita é recusada. Com o .zshrc escrito, o próximo terminal aberto roda o conteúdo fora do sandbox.

Heapjack: execução de comandos em modo read-only

A segunda falha está na ferramenta JavaScript que o Codex Desktop instala. Na instalação, o produto grava um bloco [mcp_servers.node_repl] no ~/.codex/config.toml global, sem opção de desativação - por isso o CLI simples também recebe a ferramenta. A ferramenta é um programa nativo em Rust, fora do sandbox, e inicia um processo Node dentro do sandbox, onde todo o JavaScript roda contido.

Dentro desse único processo Node há dois contextos V8: um confiável, com o código da OpenAI e um token secreto gerado a cada execução, e outro não confiável, com o código do agente. O problema é que ambos compartilham o mesmo heap do V8. O código não confiável tira um snapshot do heap (v8.getHeapSnapshot()) e testa cada string com formato de UUID: um token errado retorna "not authorized", enquanto o token correto com argumento inválido retorna um erro de validação real, revelando o acerto.

Com o token, o código não confiável escreve requisições no mesmo pipe (stdout, fd 1) usado pelo contexto confiável para falar com o pai Rust. O pai valida apenas o token e executa a ação: pode abrir aplicativos via comando open (lançados pelo launchd fora da árvore de processos do Codex), conectar a sockets unix - como o socket do Docker daemon - e editar o arquivo de configuração global.

Tudo isso funcionou em modo read-only, o mais restritivo do sandbox, e sem nenhum pedido de aprovação. Ao abrir um repositório clonado no Codex nesse modo e fazer uma pergunta, quem escreveu o repositório obtém execução de comandos fora do sandbox, sem prompt e sem nada visível na tela.

A lição: o árbitro dentro da área vigiada

As duas falhas têm o mesmo formato: o componente que fazia a cumprimento das regras estava dentro da área que deveria vigiar. O apply_patch calculava as próprias permissões a partir da entrada recebida, e o node_repl mantinha o segredo que separa código confiável de não confiável na mesma memória do código não confiável - ambos foram convencidos de dentro a deixar algo passar.

Por isso o produto da Accomplish, Accomplish, roda o agente inteiro dentro de uma máquina virtual: modelo, bash, git e todos os processos derivados. Credenciais reais nunca entram no convidado - o agente usa placeholders, e o tráfego externo passa por um proxy no hospedeiro inacessível ao agente. Todo o conteúdo do convidado é tratado como não confiável, root incluído, porque nada que decide permissões roda ali dentro. Sob Accomplish, o Overpatch escreve onde quiser dentro da VM e o Heapjack lança aplicativos dentro da VM; nenhum dos dois alcança a máquina do usuário.