Plugin4Shell: un bypass del SHA-pinning convierte la autoactualización en RCE
AIR Security (17 sep. 2026) halló un fallo zero-click que permite que una actualización de plugin de confianza sustituya código malicioso en Claude Code, Codex, Copilot y Gemini CLI.
¿De qué se trata?
Los días 17 y 18 de septiembre de 2026, los investigadores Or Nevo, Dor Granat y Niv Hoffman, de AIR Security, publicaron Plugin4Shell, un fallo de ejecución remota de código zero-click en la lógica de instalación de plugins de cuatro agentes de codificación con IA muy usados: Claude Code (Anthropic), Codex (OpenAI), GitHub Copilot (Microsoft) y Gemini CLI (Google). El hallazgo se remonta a mayo de 2026, y la divulgación a los proveedores a junio de 2026, de modo que la publicación pública respeta el plazo estándar de divulgación responsable de más de 90 días. AIR Security la presenta como una de las primeras vulnerabilidades de cadena de suministro documentadas específicas del ecosistema de agentes de IA.
El fallo no afecta a los pesos del modelo ni a los prompts. Apunta al SHA-pinning: la práctica, usada por los marketplaces de plugins de estos cuatro agentes, de fijar una extensión instalada al hash de commit exacto que un revisor aprobó — precisamente para que una actualización posterior sin revisar no pueda cambiar en silencio lo que realmente se instala.
Cómo funciona
Los cuatro agentes fallan en la misma comprobación de fondo, de dos maneras distintas, ambas relacionadas con cómo git checkout resuelve los nombres.
En Claude Code, Codex y GitHub Copilot, el agente extrae un plugin por su hash de commit de 40 caracteres, pero nunca confirma que el árbol de trabajo resultante corresponda realmente a ese commit. Git, cuando una rama y un commit comparten nombre, prioriza la referencia de rama. Un atacante que controle el repositorio del plugin puede entonces crear una rama literalmente llamada como el hash aprobado, apuntarla a código completamente distinto, y fijarla como rama por defecto del repositorio — el checkout se resuelve entonces en silencio hacia la rama maliciosa, mientras el pin sigue pareciendo respetado para quien audite la ficha del marketplace.
Gemini CLI rompe la misma garantía por una vía propia: obtiene el commit fijado en FETCH_HEAD, pero el checkout puede redirigirse a una rama con ese nombre en lugar del objeto realmente obtenido, descartando por completo el pin.
La cadena de ataque no requiere ninguna interacción de la víctima: (1) un atacante publica un plugin inocuo que pasa la revisión del marketplace y queda fijado; (2) usuarios lo instalan; (3) el atacante publica una actualización de apariencia rutinaria, y el marketplace vuelve a fijar el pin al nuevo commit; (4) el atacante crea una rama con el mismo nombre apuntando a código malicioso y la fija como predeterminada; (5) la actualización automática en segundo plano de cada instalación — el comportamiento por defecto en Claude Code y Codex — vuelve a ejecutar el checkout defectuoso y trae el código del atacante sin que nadie haga clic en nada.
Ejemplo de prompt
Un prompt defensivo para dar a su agente de código antes de que aplique actualizaciones de plugins. Vuelve a verificar el pin tras el checkout en lugar de confiar en la ficha del marketplace, y la rama hostil está censurada — lo que importa es la discrepancia que hay que buscar, no un montaje funcional.
# Defensive check — before an agent applies a plugin update
For each installed plugin, report: pinned commit hash, the hash actually
checked out (git rev-parse HEAD), and the default branch of its repository.
Flag any plugin where:
- the checked-out HEAD differs from the pinned hash
- a branch name equals a 40-char commit hash, e.g. [branch named like a hash]
- the update came in through background auto-update with no review
Do not install, update, or run anything. Output the verification table only.
Por qué importa
Los marketplaces de plugins para agentes de codificación heredaron el modelo de confianza de los registros de paquetes, pero el punto de aplicación del control está en el lugar equivocado: como dice AIR Security, el pin se resuelve dentro del agente, de modo que ninguna comprobación del lado del marketplace puede sustituir una implementación correcta — el arreglo tiene que llegar en el propio binario del agente. Un plugin que “pasó la revisión” da una falsa sensación de permanencia si nada vuelve a verificar el pin en el momento del checkout. Como las actualizaciones se aplican automática y silenciosamente, la ventana de exposición cubre cualquier máquina que ejecute un agente afectado con plugins instalados, no solo a los usuarios que decidieron actualizar. Los agentes de codificación además operan con privilegios locales elevados — acceso al sistema de archivos, ejecución de comandos, credenciales presentes en el entorno —, por lo que el código sustituido de esta forma hereda el mismo alcance que cualquier otra acción del agente.
Defensas
- Actualizar de inmediato donde exista parche: Claude Code 2.1.179 (junio de 2026) y Codex 0.146.0 (12 de agosto de 2026) corrigen ambos el fallo de checkout subyacente.
- GitHub Copilot no tiene parche a la fecha de publicación — trate los plugins de Copilot instalados como no verificados y evite instalar nuevos de editores poco conocidos hasta que Microsoft publique una corrección.
- Gemini CLI está descontinuado, sin parche previsto; Google dirige a los usuarios hacia Antigravity, que no usa el mismo mecanismo de SHA-pinning del marketplace.
- Desactive la actualización automática de plugins en segundo plano cuando su agente lo permita, y revise manualmente los plugins antes de aplicar una actualización.
- Si mantiene su propio mecanismo de fijación de plugins o extensiones para algún framework de agentes, verifique el hash de commit real del árbol extraído tras el checkout, no solo que el comando de checkout referenciara el pin correcto — y rechace cualquier repositorio donde el nombre de una rama colisione con un hash de commit del que dependa.
- Trate los marketplaces de plugins como parte de su cadena de suministro de software: aplíqueles el mismo rigor de fijación de registro y procedencia (commits firmados, ramas protegidas, sin rama por defecto que un atacante pueda renombrar) que aplicaría a una dependencia de npm o PyPI.
Status
| Aspecto | Detalle |
|---|---|
| Fuente principal | AIR Security, Plugin4Shell, publicado el 17-18 de septiembre de 2026 |
| Investigadores | Or Nevo, Dor Granat, Niv Hoffman (AIR Security) |
| Descubrimiento → divulgación → publicación | Mayo de 2026 → junio de 2026 → septiembre de 2026 |
| Afectados | Claude Code (Anthropic), Codex (OpenAI), GitHub Copilot (Microsoft), Gemini CLI (Google) |
| Anthropic | Corregido — Claude Code 2.1.179 (junio de 2026) |
| OpenAI | Corregido — Codex 0.146.0 (12 de agosto de 2026) |
| Microsoft | Sin corregir a la fecha de publicación |
| Sin parche previsto — Gemini CLI descontinuado, se recomienda migrar a Antigravity |