Segurança do Codex na prática: permissões, sandbox e proteção contra vazamento de secrets

"A documentação de segurança do OpenAI Codex explica sandbox mode, approval policy, Cloud setup/agent phase, network proxy e ciclo de vida de secrets; ela é a principal fonte para avaliar os limites de segurança deste artigo."
Na raiz do seu projeto existe um arquivo .env com a senha do banco de dados e chaves API de terceiros. Você abre o Codex para pedir ajuda na refatoração dos testes. No menu aparecem read-only, workspace-write e danger-full-access. Qual você escolhe?
Depois de escolher workspace-write, o Codex pede aprovação para executar npm install. Você aprova. Já parou para pensar se aquele script postinstall meio esquecido no package.json pode, nesse momento, ler suas variáveis de ambiente ou enviar uma requisição para um serviço que você nem conhece?
Você coloca o Codex no GitHub Actions para automatizar PR review. No workflow está escrito OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}. Parece seguro, afinal é secrets. Mas os scripts de teste, third-party actions e hooks de instalação de dependências no mesmo job também podem ler essa chave.
Três limites respondem diretamente a essas perguntas: instrução não é permissão, aprovação não é isolamento, sandbox não é auditoria. A seguir, uma checklist de permissões mínimas para local, Cloud e CI.
Permissão não se resolve com regra verbal: entenda as três camadas sandbox, approval e permission profile
Muita gente acha que escrever uma linha em AGENTS.md, como “não leia o arquivo .env”, impede o Codex de acessar informações sensíveis. Isso não é controle de permissão, é orientação de projeto. O limite de segurança real vem de três camadas: sandbox restringe o alcance dos spawned commands, approval policy decide quando parar e pedir confirmação, e permission profile aplica controle de acesso obrigatório.
Segurança no Codex não funciona com uma camada só. sandbox define o que git, gerenciadores de pacotes e test runners podem acessar como spawned commands. approval policy decide se o Codex precisa da sua aprovação antes de operações críticas. permission profile é a camada onde você realmente escreve "**/*.env" = "deny". As três camadas juntas formam a permissão efetiva.
Comparação dos modos sandbox: read-only, workspace-write, danger-full-access
| modo sandbox | Definição | Cenário indicado | Risco |
|---|---|---|---|
read-only | Permite apenas leitura de arquivos; não permite escrita nem execução de comandos | Revisão de código, análise de arquitetura, geração de documentação, verificação CI somente leitura | Não protege todos os secrets no runner; o processo ainda roda no runner |
workspace-write | Permite escrever no active workspace; rede fechada por padrão | Desenvolvimento local diário, alteração de código, execução de testes | Pode ler por padrão todos os arquivos no workspace, incluindo .env; precisa de deny glob |
danger-full-access | Remove limites de filesystem e rede | isolated CI runner/container, ambiente de teste totalmente controlado | Pode acessar ~/.ssh, /tmp, variáveis de ambiente e serviços locais; não use como padrão diário |
sandbox limita spawned commands, não apenas operações internas de arquivo do Codex. git, gerenciadores de pacotes e test runners herdam o mesmo limite. A plataforma também influencia: Linux/WSL2 depende de bubblewrap ou user namespace, macOS usa a sandbox do sistema, e Windows depende dos recursos de sandbox disponíveis.
approval policy decide quando parar e perguntar:
| approval policy | Definição | Combinação comum | Permissão efetiva |
|---|---|---|---|
on-request | Pausa antes da operação e solicita aprovação | workspace-write + on-request para automação local | Menor risco; escrita, comandos e rede passam por confirmação humana |
never | Não abre aprovação interativa; executa direto | read-only + never para CI somente leitura; danger-full-access + never em ambiente controlado | Alto risco; workspace-write + never sem permission profile é arriscado |
Combinações de baixo risco: read-only + never para CI somente leitura e workspace-write + on-request para desenvolvimento local. Combinação de alto risco: danger-full-access + never, só em ambiente controlado.
Configuração de permission profile: filesystem deny, network rules
permission profile é controle de acesso obrigatório, não orientação verbal. Permissões filesystem aceitam read/write/deny; regras mais específicas substituem regras mais amplas, e deny tem prioridade.
Exemplo de deny glob para .env:
{
"filesystem": {
"rules": {
"**/*.env": "deny",
"**/.env.local": "deny",
"**/secrets/**": "deny",
"workspace/**": "write"
}
}
}
Com essa configuração, arquivos .env continuam ilegíveis em workspace-write, mesmo que o workspace seja gravável por padrão. deny ganha, e regras concretas substituem regras amplas.
network profile pode configurar enabled = true e regras allow/deny por domínio; deny também tem prioridade. local/private network tem proteção padrão. Permitir localhost ou Docker socket é uma exceção explícita. Docker socket é um escape hatch local: pode alcançar serviços locais, contêineres e redes. Abra com cuidado.
network proxy restringe o acesso de rede de comandos já habilitados; ele não concede rede por si só. Um allow global * é acesso amplo à rede e deve ser usado com cautela.
Checklist local de permissões mínimas: de revisão read-only a full access
No desenvolvimento local, permissão maior não significa menos problema. Approval consegue barrar algumas operações, mas o isolamento real vem de sandbox e permission profile. Comece pela permissão mais estreita e amplie conforme a tarefa exigir.
Tabela de decisão: quando usar read-only e quando usar workspace-write
| Cenário | modo sandbox | approval policy | permission profile | Risco |
|---|---|---|---|---|
| Revisão de código / análise de arquitetura | read-only | never | Não precisa | Baixo |
| Desenvolvimento diário / alteração de código | workspace-write | on-request | Configurar deny para .env | Médio-baixo |
| Rodar testes / instalar dependências | workspace-write | on-request | deny para .env, auditoria de scripts | Médio |
| CI somente leitura | read-only | never | Não precisa | Baixo |
| CI precisa escrever arquivos | workspace-write | never | deny, isolated runner | Médio-alto |
| Precisa de full access | danger-full-access | never | Só ambiente controlado | Alto |
Passos para proteger .env e arquivos de secrets:
- Descubra o caminho do arquivo de configuração do permission profile usado, seguindo a documentação Codex Permissions.
- Adicione
"**/*.env" = "deny"às permissões filesystem. - Confirme que regras mais específicas substituem regras amplas e que deny tem prioridade.
- Teste: em modo
workspace-write, uma tentativa de ler.envdeve ser negada. - Amplie se necessário com
"**/.env.local" = "deny"e"**/secrets/**" = "deny".
Não dependa de regra verbal. AGENTS.md orienta, mas não aplica controle de acesso obrigatório. O Codex pode seguir a orientação, mas também pode ler por outros motivos. Só o deny do permission profile é uma barreira obrigatória.
Risco na instalação de dependências: npm postinstall, pip hooks, Docker socket
Instalar dependências não é só baixar arquivos. postinstall e prepare de npm/pnpm, além de hooks de pip install, rodam automaticamente durante a instalação. Esses scripts podem ler variáveis de ambiente, enviar requisições de rede ou modificar arquivos do sistema.
Checklist de risco:
- postinstall desconhecido pode ler variáveis de ambiente: mesmo com deny para
.env, postinstall roda no ambiente dos spawned commands e pode ver environment variables. - Pode enviar requisições de rede: baixar binários extras, enviar telemetria, conectar a repositórios privados.
- Pode modificar arquivos do sistema: escrever configuração global, alterar PATH.
Recomendações de auditoria:
- Revise scripts e origem primeiro: campo
scriptsdepackage.json,setup.pyde pacotes pip. - Use fontes confiáveis: fixe versões e evite upgrade automático para versões desconhecidas.
- Aprove em ambiente controlado: localmente, use
workspace-write + on-requeste veja o que o Codex quer instalar antes de aprovar.
Docker socket é um escape hatch local. Permitir Docker socket pode dar acesso a serviços locais, contêineres e rede. Configure apenas quando houver necessidade clara, nunca por padrão.
Limites em Cloud: setup vs agent phase, ciclo de vida dos secrets
Uma Cloud task não roda localmente, mas em um contêiner isolado hospedado pela OpenAI. sandbox pode limitar spawned commands, mas a proteção real dos secrets vem do ciclo de vida do Cloud secrets: disponível na fase setup, removido antes da agent phase. sandbox não é auditoria; segurança vem de separação em camadas.
Ciclo de vida do Cloud container:
- Criar container
- Fazer checkout do repo
- Executar setup script
- Aplicar configurações de rede
- agent executa o loop de comandos
- Emitir answer/diff
Limite entre setup e agent phase: secrets só no setup
| fase | Acesso à rede | secrets disponíveis | environment variables | Instalação de dependências |
|---|---|---|---|---|
| setup scripts | Com rede | Disponíveis | Presentes o tempo todo | Permitida |
| agent phase | Offline por padrão | Removidos | Presentes o tempo todo | Offline por padrão |
Na setup phase, rede, instalação de dependências e secrets estão disponíveis. Na agent phase, o ambiente fica offline por padrão, os secrets já foram removidos e só restam environment variables.
setup scripts rodam em uma sessão Bash separada; export não passa automaticamente para a agent phase. Se você fizer export MY_KEY=xxx no setup, a agent phase não herda essa variável. Entre fases, só Cloud secrets e environment variables seguem suas regras.
secrets vs environment variables: diferença essencial
| Tipo | Criptografia | Fase disponível | Uso | Ciclo de vida |
|---|---|---|---|---|
| environment variables | Sem criptografia adicional | setup + agent o tempo todo | Configuração não sensível, caminhos, switches | Presentes durante toda a vida do container |
| secrets | Criptografia adicional | Só setup scripts | Acesso a repositórios privados, autenticação de dependências | Removidos antes da agent phase |
secrets ficam disponíveis apenas em setup scripts. Servem para instalar dependências e acessar repositórios privados. A agent phase não deve conter secrets de produção. environment variables permanecem o tempo todo e servem para configuração não sensível.
Limites de instalação de dependências:
- setup phase pode instalar dependências com rede.
- agent phase fica offline por padrão.
- setup scripts podem acessar secrets; scripts desconhecidos podem vazar esses dados.
- Recomendação: revise scripts e origem, use fontes confiáveis e evite executar scripts desconhecidos no setup.
O container cache dura no máximo 12 horas. Mudanças em setup, maintenance, env ou secrets acionam cache invalidation.
CI e GitHub Action: codex exec, proibições com API key e estratégia segura da official Action
codex exec usa read-only sandbox por padrão, mas muita gente coloca OPENAI_API_KEY como job-level environment variable no workflow. Scripts de teste, third-party actions e dependency lifecycle scripts no mesmo job podem ler essa chave. sandbox não é auditoria; segurança vem de permissões mínimas e proteção da chave.
Proibição de API key: não use job-level env
Não defina OPENAI_API_KEY ou CODEX_API_KEY como job-level environment variable em workflow que faz checkout ou executa código do repositório. Código do repositório, testes, dependency lifecycle scripts e third-party actions podem acessar variáveis de ambiente no mesmo job.
Checklist de proibição:
- Não coloque
OPENAI_API_KEYcomo job-level env. - Não configure uma job-level key em workflows que fazem checkout ou executam código do repositório.
auth.json/ ChatGPT-managed auth não é adequado para workflows de repositórios public/open-source.- Não execute código não confiável no mesmo process environment da chave.
Formas corretas:
- Invocation inline única: defina
CODEX_API_KEYapenas para uma invocation decodex exec.
- name: Run Codex
run: CODEX_API_KEY=${{ secrets.CODEX_API_KEY }} codex exec "review PR #${{ github.event.number }}"
- Proxy da official Action: use o proxy de
openai/codex-action@v1.
- uses: openai/codex-action@v1
with:
prompt: "review PR #${{ github.event.number }}"
sandbox: read-only
safety-strategy: drop-sudo
danger-full-access em CI só faz sentido em isolated CI runner/container. Não deve ser padrão, porque permite acessar todos os recursos do runner.
Checklist de segurança no GitHub Action: limitar gatilhos, proteger chave, rotacionar chave
Parâmetros da official Action:
| parâmetro | valor padrão | descrição |
|---|---|---|
safety-strategy | drop-sudo | Remove permissões sudo |
sandbox | - | Escolhe read-only/workspace-write/danger-full-access |
allow-users | usuários com write access | Apenas usuários específicos podem disparar |
allow-bots | - | Se bots podem disparar |
read-only não significa que todos os secrets do runner estejam protegidos. A Action ainda roda no runner; ela apenas restringe o filesystem a leitura. drop-sudo remove sudo. sandbox deve ser o modo mais estreito que conclui a tarefa.
Checklist de segurança do GitHub Action:
- Limitar gatilhos:
allow-usersapenas para usuários específicos,allow-botscom cautela. - Limpar entradas de PR/issue/prompt: evitar prompt injection e não passar input não confiável diretamente ao Codex.
- Proteger API key: não usar job-level env; usar invocation inline única ou proxy.
- Executar Codex como último passo: reduzir o tempo de exposição da chave.
- Se suspeitar de vazamento, rotacionar a chave: não investigue primeiro; primeiro reduza o dano.
Entradas de PR/issue/prompt devem ser tratadas como não confiáveis. Não passe PR comment ou issue body diretamente para o prompt do Codex.
Como reagir a vazamento de secret: o primeiro passo após suspeita
Se houver suspeita de vazamento, o primeiro passo não é investigar, mas rotacionar a chave. Primeiro reduza o dano, depois audite. sandbox pode limitar spawned commands, mas não impede que o Codex escreva uma chave em logs, PR comments ou answer.
Passos diante de vazamento: rotação de chave, auditoria, revogação
Primeiro passo: rotacionar a chave. Não procure a origem antes; invalide a chave antiga.
Depois:
- Auditar logs: verificar o histórico de uso da chave e procurar chamadas anormais.
- Revogar token: garantir que a chave antiga está completamente inválida e que nenhuma session ativa sobrou.
- Buscar origem: revisar Codex log, saídas do GitHub Action, scripts de instalação de dependências e third-party actions.
Medidas preventivas:
- Não coloque API key em código frontend nem no repositório.
- Não coloque API key como job-level env (CI).
- Use permission profile deny para
.env. - Rotacione chaves regularmente, como recomenda o OWASP Secrets Management Cheat Sheet.
Limite do Codex Security: não substitui SAST nem aplica patch automaticamente
Codex Security é um LLM-driven security analysis toolkit que roda em um ephemeral isolated container e produz findings estruturados e sugestões de patch. Ele pode ajudar a encontrar e verificar vulnerabilidades, mas não substitui SAST nem revisão manual de segurança.
Checklist de limites:
- Não substitui SAST.
- Não substitui manual security review.
- proposed patch precisa de review do usuário e não é aplicado automaticamente.
- Uso: ajudar a descobrir, verificar e sugerir, não reparar automaticamente.
Não trate Codex Security como um scanner universal de segurança. AI-driven analysis consegue encontrar alguns problemas, mas segurança real vem de camadas: escopo legível, escopo gravável, rede, secrets, approval, review e revogação.
Conclusão
O limite de segurança do Codex vem de três camadas: sandbox restringe o alcance dos spawned commands, approval policy decide quando parar e perguntar, e permission profile aplica controle de acesso obrigatório. As três juntas formam a permissão real.
Três limites para lembrar:
- Instrução não é permissão:
AGENTS.mdé guia, não controle de acesso obrigatório. Não proteja.enve API key só com regra verbal. - Aprovação não é isolamento: approval policy pode parar algumas operações, mas o isolamento real vem de sandbox e permission profile.
- sandbox não é auditoria: sandbox pode limitar spawned commands, mas não impede que o Codex escreva uma chave em logs, PR comments ou answer. Segurança vem de camadas.
Checklist rápida:
- Você configurou deny glob para
.env? - Evita job-level API key em CI?
- Limita quem pode disparar GitHub Action?
- Auditou scripts de instalação de dependências?
- Tem um plano de rotação de chaves?
Limites de segurança não bloqueiam bugs de lógica. O Codex pode respeitar todas as regras de permissão e ainda gerar código com bug, testes podem falhar e rollback pode ser necessário. Revisar diff, rodar testes e preparar rollback é a segunda linha de defesa fora da fronteira de segurança.
Próximos passos:
- Retrospectiva de falhas e fluxo de validação: entender como lidar com erros do Codex, validar diffs e preparar rollback.
- Automação com codex exec e CI: aprofundar modo não interativo, desenho de workflows e tratamento de erros em CI.
- Regras de projeto AGENTS.md: aprender a escrever regras de projeto, lembrando que são guia, não sistema de permissões.
Leituras relacionadas:
- Panorama de ferramentas de AI coding 2026: entender o ecossistema geral de ferramentas de AI coding.
- Fundamentos de GitHub Actions CI: revisar os conceitos básicos de CI workflow.
- Estratégia de deploy com GitHub Actions: entender os limites de uso de secrets em deploy.
- Risco de vazamento de API key no frontend: entender por que chaves não devem entrar no frontend nem no repositório.
Definir o limite mínimo de segurança para uma tarefa do Codex
Escolha sandbox, approval, permission, secrets e limites de job em CI de acordo com o risco da tarefa, evitando colocar permissão de escrita, rede, scripts de dependência e chave API no mesmo ambiente sem barreiras.
⏱️ Estimated time: 30 min
- 1
Step 1: Primeiro decida se a tarefa precisa ler, escrever ou usar rede
Revisões e planejamento começam com read-only. Para alterar código, use workspace-write + on-request. full access só deve entrar em runner isolado ou contêiner controlado. - 2
Step 2: Tire arquivos sensíveis do escopo legível ou aplique deny explicitamente
Configure deny-read para .env, *.pem, credentials.json e diretórios secrets. Não dependa só de uma orientação em AGENTS.md. - 3
Step 3: Antes de aprovar instalação de dependências, leia os scripts
Revise package.json, postinstall, prepare, pip hooks, scripts de download e destinos de rede antes de permitir install ou network. - 4
Step 4: Separe Cloud setup e agent phase
Coloque tokens de repositórios privados e autenticação de dependências em Cloud secrets, usados apenas pelos setup scripts. Na agent phase, deixe só env vars não sensíveis e necessárias. - 5
Step 5: Separe o job do Codex do job com permissão de escrita em CI
Não coloque a chave API como job-level env. O job do Codex deve ser o mais read-only possível e gerar um patch artifact; comentários, PR ou merge ficam para um job controlado posterior. - 6
Step 6: Valide a saída e prepare rotação de chaves
Revise diff, logs, artifacts e resultados de teste. Se houver suspeita de vazamento, rotacione a chave primeiro e audite a origem depois.
FAQ
Escrever no AGENTS.md que .env não deve ser lido é suficiente?
Com workspace-write, o Codex pode ler .env, ~/.ssh ou /tmp?
Quando posso dar danger-full-access ao Codex?
Um secret do Cloud pode ser lido pelo agent do Codex?
Como proteger uma chave API ao rodar codex exec em CI?
Codex Security substitui SAST ou revisão manual de segurança?
13 min de leitura · Publicado em: 26 jul 2026 · Atualizado em: 27 jul 2026
Guia prático de OpenAI Codex
Se você chegou pela busca, o caminho mais rápido é ir para o post anterior ou próximo desta série.
Anterior
Automatizar issues, changelogs e verificações de documentação com codex exec
Use stdin, JSONL e schemas do codex exec para criar changelogs, classificar issues e verificar a documentação com permissões de CI separadas.
Parte 7 de 10
Próximo
Casos de falha com Codex: por que a IA quebra código e como validar mudanças
Um guia prático para revisar mudanças do Codex: detectar diffs grandes demais, testes enfraquecidos, atalhos na CI, falta de review e scope ambíguo, e validar cada patch com scope, plan, patch, verify, review e rollback.
Parte 9 de 10



Comentários
Entre com GitHub para comentar