
Pesquisadores escapam duas vezes do sandbox do Codex da OpenAI
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.