Un fallo en el bloqueo de plugins expone a los agentes de programación con IA a sustituciones silenciosas en la cadena de suministro
Plugin4Shell permite eludir el bloqueo de plugins en Claude Code, Codex, Copilot y Gemini CLI e instalar código malicioso mostrando la versión aprobada.
Texto generado por inteligencia artificial, publicado sin revisión humana. Transparencia IA
Imagen ilustrativa generada con IA
El propietario de un repositorio puede eludir los bloqueos de versión de los plugins en cuatro agentes de programación con IA ampliamente utilizados, haciendo que instalen código no revisado mientras siguen mostrando la versión esperada.
La vulnerabilidad de la cadena de suministro, bautizada como Plugin4Shell por Air Security, afecta a Anthropic Claude Code, OpenAI Codex, GitHub Copilot y Google Gemini CLI. Air probó con éxito el ataque contra los cuatro productos en mayo y notificó a sus proveedores en junio.
Anthropic y OpenAI han publicado correcciones. Según Air, GitHub Copilot sigue sin estar parcheado, mientras que Google no tiene previsto corregir Gemini CLI, que está en proceso de retirada. A fecha del 18 de septiembre de 2026 no se había publicado ningún CVE ni aviso de seguridad de los proveedores, y no había indicios de explotación en ataques reales.
Un commit bloqueado no garantiza que el código también lo esté
Los agentes de programación con IA pueden ampliar sus capacidades descargando plugins de marketplaces y repositorios externos de código fuente. Para impedir que el código cambie después de revisarlo, un marketplace puede identificar cada plugin aprobado mediante un hash de commit de Git.
Ese hash debería representar una única instantánea inmutable del repositorio. Sin embargo, en los agentes afectados, el proceso de instalación no verifica adecuadamente que el contenido descargado corresponda al commit especificado.
Plugin4Shell explota la ambigüedad en la forma en que Git resuelve las referencias. En un servicio de repositorios que lo permita, el propietario puede crear una rama con un nombre similar al hash de commit bloqueado del plugin. A continuación, el atacante dirige esa rama a otro commit que contiene código malicioso.
Cuando el agente solicita lo que cree que es el commit aprobado, Git puede interpretar el valor como el nombre de una rama controlada por el atacante. Como consecuencia, el instalador obtiene el código de otro commit, pero el agente sigue indicando que el plugin se encuentra en la versión esperada y bloqueada.
Esto anula tanto la revisión como la transparencia de versiones. Un plugin puede parecer inalterado para el usuario aunque su contenido ejecutable haya sido sustituido.
El cambio público de OpenAI para Codex describe el mismo modo de fallo: Git puede tratar un SHA de commit solicitado como una referencia de rama, lo que permite que el origen de un plugin se resuelva en un commit distinto del registrado en el archivo de bloqueo. La corrección está incluida en Codex 0.146.0.
La explotación depende del proveedor del repositorio
La técnica de la rama con forma de hash no funciona de manera uniforme en todas las plataformas de alojamiento. GitHub prohíbe los nombres de ramas y etiquetas que se parecen a hashes de commit, lo que bloquea este método concreto en los repositorios alojados allí.
Air comprobó que el ataque funciona en Bitbucket y en servidores Git operados de forma privada, que pueden permitir esos nombres. Los agentes de programación afectados admiten plugins procedentes de ese tipo de repositorios externos.
Esta distinción reduce considerablemente la exposición de los usuarios que solo recurren a los marketplaces predeterminados. Una revisión de los catálogos de los agentes y de la vulnerabilidad subyacente realizada el 18 de septiembre reveló que el catálogo de la comunidad de Anthropic y los catálogos predeterminados de Claude Code y Copilot hacían referencia a repositorios de GitHub.
Sin embargo, el alojamiento en GitHub no corrige por sí solo la lógica defectuosa de validación. Copilot, por ejemplo, puede instalar plugins desde repositorios ajenos a GitHub. Los usuarios que añadan un repositorio de Bitbucket, un servidor Git privado u otro host que permita nombres de referencia ambiguos seguirán expuestos si utilizan un agente sin parchear.
Gemini CLI también presenta un problema independiente de resolución de repositorios. Según Air, su instalador puede verse influido por un repositorio cuya rama principal se llame FETCH_HEAD. La restricción documentada de GitHub sobre los nombres similares a hashes no excluye claramente FETCH_HEAD, por lo que los plugins de Gemini CLI alojados en GitHub no pueden considerarse definitivamente seguros frente a esta variante.
Las actualizaciones automáticas pueden evitar la necesidad de otra confirmación
La configuración de mayor riesgo es aquella en la que un agente actualiza en segundo plano un plugin que ya es de confianza. Una vez que los usuarios aprueban la instalación inicial, el propietario de un repositorio podría cambiar el destino de una referencia ambigua y distribuir código de sustitución sin solicitar otra confirmación.
Air informó de que las actualizaciones de plugins en segundo plano están activadas de forma predeterminada en Claude Code y Codex. Esto no significa, sin embargo, que todas las instalaciones predeterminadas estén expuestas de inmediato.
Las actualizaciones automáticas solo están activadas de forma predeterminada para los marketplaces integrados en los productos, que están alojados en GitHub. La documentación de Anthropic y GitHub indica que las actualizaciones desde marketplaces externos están desactivadas o son opcionales. Por tanto, las reglas de nomenclatura de GitHub bloquean la principal técnica de la rama con forma de hash en esos catálogos predeterminados.
El riesgo aumenta cuando las organizaciones configuran marketplaces privados o instalan plugins directamente desde repositorios compatibles que no están alojados en GitHub. El operador de un marketplace no puede reparar los agentes ya desplegados porque la validación de referencias se realiza en el equipo de cada usuario. El propio agente debe confirmar que el objeto recuperado es exactamente el commit bloqueado.
Las correcciones difieren notablemente entre los cuatro agentes
| Producto | Estado actual | Respuesta recomendada |
|---|---|---|
| Anthropic Claude Code | Según Air, el problema está corregido en 2.1.179 | Actualizar a la versión 2.1.179 o posterior |
| OpenAI Codex | Corregido en 0.146.0 | Actualizar a la versión 0.146.0 o posterior |
| GitHub Copilot | Según Air, no se ha publicado ninguna corrección | Evitar plugins procedentes de hosts externos de repositorios que no sean de confianza |
| Google Gemini CLI | Google no tiene previsto corregir el producto, que está en proceso de retirada | Migrar a Antigravity cuando sea posible |
Las notas de la versión de Claude Code 2.1.179 de Anthropic no identifican Plugin4Shell. La afirmación de que esta versión resuelve el problema procede de la evaluación de Air. OpenAI, en cambio, documentó públicamente la corrección relacionada con la resolución de referencias de Git.
Air afirmó haber informado a Microsoft en junio, pero no se había publicado ninguna actualización correspondiente de Copilot. Hasta que eso cambie, los usuarios de Copilot deberían tratar como potencialmente vulnerables los plugins alojados en Bitbucket, servidores Git privados y servicios similares.
Google dejó de ofrecer Gemini CLI para consumidores en junio y ha dirigido a los usuarios hacia Antigravity. Air afirmó que Antigravity no es susceptible a este ataque. Google ha declarado que el acceso empresarial a Gemini CLI seguirá recibiendo actualizaciones, aunque no se sabe si esas actualizaciones corregirán Plugin4Shell.
Los plugins maliciosos heredan los permisos del usuario
Un plugin sustituido se ejecuta con los privilegios disponibles para la persona que utiliza el agente de programación. Por tanto, su alcance práctico depende de los permisos locales, los secretos almacenados, la configuración del agente y las sesiones autenticadas.
Entre las posibles consecuencias se incluyen la lectura del código fuente y de los archivos locales, la extracción de credenciales guardadas y el acceso a sistemas de desarrollo o empresariales disponibles mediante la autenticación existente del usuario. Los equipos de los desarrolladores son especialmente sensibles porque suelen combinar acceso a repositorios, credenciales de la nube, material de firma y conectividad con redes internas.
A fecha del 18 de septiembre de 2026 no se conocían intrusiones confirmadas ni campañas de explotación activas. No se había asignado ningún identificador CVE y ninguno de los cuatro proveedores había publicado un aviso de seguridad específico.
No obstante, Plugin4Shell demuestra que la versión mostrada no prueba la identidad del código instalado. El bloqueo solo es fiable si el instalador verifica el objeto de Git resultante en lugar de confiar en la resolución del nombre.
Las instalaciones existentes requieren una revisión independiente
Actualizar Claude Code o Codex debería evitar futuras sustituciones, pero la información disponible no permite determinar si alguna de las dos actualizaciones detecta o elimina los plugins que ya hayan sido sustituidos. Por tanto, las organizaciones deberían tratar la corrección y la revisión retrospectiva como tareas independientes.
Los administradores y desarrolladores deberían:
- Actualizar Claude Code a la versión 2.1.179 o posterior.
- Actualizar Codex a la versión 0.146.0 o posterior.
- Evitar las fuentes externas de plugins de Copilot hasta que GitHub publique una corrección.
- Migrar de Gemini CLI a Antigravity cuando sea viable desde el punto de vista operativo.
- Comparar de forma independiente el contenido de los plugins instalados con el commit de confianza del repositorio.
- Revisar los plugins instalados antes de actualizar el agente, en lugar de asumir que el parche los elimina.
- Restringir el acceso de los plugins a archivos, credenciales, tokens y sistemas autenticados.
- Examinar los repositorios de plugins y la actividad de actualización para detectar cambios de referencia no explicados.
- Supervisar las credenciales y los servicios conectados para detectar accesos inesperados después de actualizaciones sospechosas de plugins.
Los usuarios pueden reducir la exposición dando preferencia a los catálogos predeterminados de los agentes, alojados en GitHub, donde la restricción de nomenclatura documentada bloquea el ataque de la rama con forma de hash. Esta protección es condicional, especialmente en Gemini CLI debido a la variante FETCH_HEAD.
La solución duradera es una validación más estricta en el cliente: después de recuperar el contenido, el agente debe demostrar que el código fuente instalado se resuelve en el commit exacto registrado por el marketplace o el archivo de bloqueo. Cualquier medida inferior deja una brecha entre la versión que se muestra al usuario y el código que realmente se ejecuta.
Fuentes
Este artículo es una reelaboración original basada en las siguientes fuentes.
