FlawOpen

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

● CWE-345 · Alta
Investigación · FlawOpen

Plugin4Shell: bypass del pin SHA

Cuatro instaladores de plugins de IA fijaban la revisión Git, pero no verificaban el commit descargado. Plugin4Shell expuso la falla; comprueba el SHA final.[1]

💡 Explicación en Lenguaje Sencillo (ELI5)

Una biblioteca reserva una edición concreta de un libro mediante su número único de catálogo. El empleado pide ese número, pero acepta otro libro si una etiqueta de estantería tiene el mismo texto. El pin SHA es el número de catálogo; el instalador debe comprobar el commit obtenido antes de confiar en el plugin o ejecutarlo.[1]

Conceptos Clave y Términos

Commit SHA
Hash que identifica un objeto commit concreto de Git. Un flujo seguro de fijación debe comparar el checkout resuelto con este valor.[1], [2]
Ambigüedad de refs en Git
Git acepta tanto identificadores de objetos como nombres de ramas como expresiones de revisión. En ciertas condiciones, un nombre que parece un ID de commit puede resolverse como una ref.[1]
Marketplace de plugins
Catálogo que distribuye extensiones de agentes y puede registrar una revisión aprobada. El cliente instalador sigue siendo responsable de hacer cumplir el pin.[1]
CWE-345
Verificación insuficiente de la autenticidad de los datos: el sistema utiliza datos sin comprobar adecuadamente que sean el valor auténtico esperado.[5]

Mapeos de marcos

  • Referencia CWE para la debilidad descrita en esta guía: CWE-345

Flujo de Ataque Paso a Paso

Paso 1

El marketplace registra un commit revisado

Una entrada del plugin apunta a un repositorio y a un SHA de commit específico que los revisores esperan que use el instalador.[1]

Paso 2

El controlador del repositorio puede cambiar las refs

AIR Security informa de que, en hosts que permiten esos nombres, quien controla el repositorio puede crear una rama predeterminada cuyo nombre coincida con el SHA solicitado. Describe por separado una ruta de resolución mediante FETCH_HEAD para Gemini CLI.[1]

Paso 3

El instalador hace checkout sin verificar HEAD

Antes de la corrección, Codex pasaba el SHA solicitado a <code>git checkout</code> y consideraba que el éxito de Git demostraba que se había respetado el pin.[1], [2]

Paso 4

El cliente acepta o rechaza el árbol materializado

La corrección de Codex lee <code>git rev-parse HEAD</code> tras el checkout y aborta si no coincide. Sin una comprobación equivalente, puede instalarse y ejecutarse código sustituido con los permisos del usuario del agente.[2], [1]

Código Fuente: Vulnerable vs. Seguro

La ruta vulnerable confundía la resolución correcta de un nombre con la prueba de identidad del objeto. El parche compara el HEAD resultante con el pin del marketplace y rechaza materializar otro commit. Este par refleja la corrección de Codex; los otros productos tenían instaladores distintos y no se debe asumir que usan la misma corrección.[2], [6]

IMPLEMENTACIÓN VULNERABLE
// Forma anterior a la corrección del PR #34644 de OpenAI Codex
if let Some(target) = sha.or(ref_name) {
    run_git(&["checkout", target], Some(destination))?;
}
// Se consideraba que un checkout correcto demostraba que coincidía el SHA.
PARCHE SEGURO Y ROBUSTO
// Corrección de Codex: verificar el commit resuelto, no solo el 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 Verificación de Seguridad para Ingeniería

Fuentes

← AI Security Directory →