flawopen.com/AI Security/plugin4shell-ai-agent-plugin-sha-pin-bypass
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]
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
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]
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]
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]
// 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.
// 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
- ✓Después de cada checkout fijado por SHA, resuelve el commit materializado (por ejemplo, <code>git rev-parse HEAD</code>) y compáralo exactamente con el pin solicitado antes de cargar archivos del plugin.[2], [6]
- ✓Recomendación de implementación de FlawOpen: Falla de forma segura si hay una discrepancia, falta HEAD, falla el comando o el formato de revisión es inesperado; no vuelvas a intentarlo usando el nombre de una rama.[2]
- ✓Prueba el instalador con un repositorio local temporal cuya rama predeterminada coincida con el SHA de otro commit; verifica que se rechaza la materialización y no se carga código del plugin.[6]
- ✓Recomendación de implementación de FlawOpen: Mantén separados en los tipos y el flujo de control los nombres de refs y los pins SHA inmutables; registra el commit verificado en los metadatos de instalación.[1]
- ✓Inventaría las versiones de agentes afectadas y los hosts Git de los marketplaces. GitHub bloquea ramas con formato de SHA, pero esa regla específica no protege otros hosts compatibles ni la ruta FETCH_HEAD descrita para Gemini.[1], [4]
- ✓La divulgación de AIR citada indica que Codex se corrigió en 0.146.0 y Claude Code en 2.1.179, pero no ofrece rangos completos de versiones afectadas. Verifica la guía actual del proveedor antes de recomendar un estado o una acción para Copilot y Gemini CLI.[1], [3], [7]
- ✓Conserve la prueba de regresión de Codex
materialize_git_source_rejects_sha_that_resolves_to_hostile_default_branch; crea un repositorio local temporal y comprueba que se rechace un HEAD distinto antes de materializar el código del plugin.[6]
Fuentes
- AIR Security: divulgación de Plugin4Shell y estado coordinado de proveedores
- PR #34644 de OpenAI Codex: verificar checkouts Git de plugins por SHA
- Versión 0.146.0 de OpenAI Codex
- The Hacker News: cobertura independiente y matices según el host
- MITRE CWE-345: verificación insuficiente de la autenticidad de los datos
- Codex regression test: reject SHA resolving to hostile default branch
- Versión 2.1.179 de Anthropic Claude Code