flawopen.com/AI Security/plugin4shell-ai-agent-plugin-sha-pin-bypass
Plugin4Shell: desvio do SHA do plugin
Quatro instaladores de plugins de agentes IA não verificavam o commit após fixar a revisão Git. Plugin4Shell expôs a falha; confira o SHA final.[1]
Uma biblioteca reserva uma edição específica de um livro pelo número único do catálogo. O atendente pede esse número, mas aceita outro livro quando uma etiqueta de prateleira tem o mesmo texto. O pin SHA é o número do catálogo; o instalador deve conferir o commit obtido antes de confiar no plugin ou executá-lo.[1]
Conceitos Centrais e Termos
Commit SHA- Hash que identifica um objeto commit específico do Git. Um fluxo seguro de pinning precisa comparar o checkout resolvido com esse valor.[1], [2]
Ambiguidade de ref no Git- O Git aceita IDs de objetos e nomes como branches como expressões de revisão. Em determinadas condições, um nome que parece ID de commit pode resolver para uma ref.[1]
Marketplace de plugins- Catálogo que distribui extensões de agentes e pode registrar uma revisão aprovada. Ainda cabe ao cliente instalador impor o pin.[1]
CWE-345- Verificação insuficiente da autenticidade dos dados: o sistema usa dados sem confirmar adequadamente que correspondem ao valor autêntico esperado.[5]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-345
Fluxo de Ataque Passo a Paso
O marketplace registra um commit revisado
Uma entrada de plugin aponta para um repositório e para um SHA específico que os revisores esperam que o instalador use.[1]
O controlador do repositório pode alterar refs
A AIR Security relata que, em hosts que permitem nomes assim, o controlador pode criar uma branch padrão com o mesmo nome do SHA solicitado. Para Gemini CLI, descreve separadamente uma resolução pela ref FETCH_HEAD.[1]
Código-Fonte: Vulnerável vs. Seguro
O caminho vulnerável confundia a resolução bem-sucedida de um nome com a prova da identidade do objeto. O patch compara o HEAD resultante com o pin do marketplace e recusa materializar outro commit. Este par corresponde ao patch do Codex; os outros produtos tinham implementações diferentes e não se deve presumir que usem esta mesma correção.[2], [6]
// Formato anterior à correção no PR #34644 do OpenAI Codex
if let Some(target) = sha.or(ref_name) {
run_git(&["checkout", target], Some(destination))?;
}
// Um checkout bem-sucedido era tratado como prova de que o SHA correspondia.
// Correção do Codex: verifique o commit resolvido, não apenas o argumento solicitado
if let Some(sha) = sha {
run_git(&["checkout", sha], Some(destination))?;
let checked_out_sha =
run_git_output(&["rev-parse", "HEAD"], Some(destination))?;
if !checked_out_sha.eq_ignore_ascii_case(sha) {
return Err(format!(
"checked out Git SHA {checked_out_sha} does not match requested SHA {sha}"
));
}
} else if let Some(ref_name) = ref_name {
run_git(&["checkout", ref_name], Some(destination))?;
}
Lista de Verificação de Segurança para Engenharia
- ✓Após cada checkout fixado por SHA, resolva o commit materializado (por exemplo, <code>git rev-parse HEAD</code>) e compare exatamente com o pin solicitado antes de carregar arquivos do plugin.[2], [6]
- ✓Recomendação de implementação da FlawOpen: Interrompa em caso de divergência, HEAD ausente, erro no comando ou formato inesperado de revisão; não tente novamente usando o nome de uma branch.[2]
- ✓Teste o instalador com um repositório local temporário cuja branch padrão colida com o SHA de outro commit; confirme que a instalação é recusada e nenhum código do plugin é carregado.[6]
- ✓Recomendação de implementação da FlawOpen: Mantenha instalações por nome de ref separadas dos pins SHA imutáveis nos tipos e no fluxo de controle; registre o commit verificado nos metadados de instalação.[1]
- ✓Inventarie as versões dos agentes afetados e os hosts Git dos marketplaces. O GitHub bloqueia branches com formato de SHA, mas essa regra não protege outros hosts suportados nem a rota FETCH_HEAD relatada para Gemini.[1], [4]
- ✓A divulgação da AIR citada informa correções no Codex 0.146.0 e no Claude Code 2.1.179, mas não fornece intervalos completos de versões afetadas. Confira as orientações atuais dos fornecedores antes de recomendar status ou ações para Copilot e Gemini CLI.[1], [3], [7]
- ✓Mantenha o teste de regressão do Codex
materialize_git_source_rejects_sha_that_resolves_to_hostile_default_branch; ele cria um repositório local temporário e verifica que um HEAD divergente é rejeitado antes da materialização do código do plugin.[6]
Fontes
- AIR Security: divulgação do Plugin4Shell e situação coordenada dos fornecedores
- PR #34644 do OpenAI Codex: verificar checkouts Git de plugins por SHA
- Versão 0.146.0 do OpenAI Codex
- The Hacker News: reportagem independente e ressalvas por host
- MITRE CWE-345: verificação insuficiente da autenticidade dos dados
- Codex regression test: reject SHA resolving to hostile default branch
- Versão 2.1.179 do Anthropic Claude Code