FlawOpen

flawopen.com/AI Security/plugin4shell-ai-agent-plugin-sha-pin-bypass

● CWE-345 · Alta
Pesquisa · FlawOpen

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]

💡 Explicação em Linguagem Simples (ELI5)

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

Passo 1

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]

Passo 2

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]

Passo 3

O instalador faz checkout sem conferir HEAD

Antes da correção, o Codex passava o SHA solicitado para <code>git checkout</code> e tratava o sucesso do Git como prova de que o pin fora respeitado.[1], [2]

Passo 4

O cliente aceita ou rejeita a árvore materializada

A correção do Codex lê <code>git rev-parse HEAD</code> após o checkout e aborta se houver divergência. Sem verificação equivalente, código substituído pode ser instalado e executado com as permissões do usuário do agente.[2], [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]

IMPLEMENTAÇÃO VULNERÁVEL
// 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.
PATCH SEGURO E ROBUSTO
// 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

Fontes

← AI Security Directory →