La firma de seguridad Air reveló el jueves una vulnerabilidad que permite a un atacante ejecutar código en remoto en las máquinas de los desarrolladores que usan asistentes de programación con IA, sin que el usuario tenga que hacer nada. Bautizada Plugin4Shell en el informe de investigación de la compañía, afecta a Claude Code de Anthropic, Codex de OpenAI, GitHub Copilot y Gemini CLI de Google.
Dos de esos cuatro proveedores han publicado un parche. Anthropic lo corrigió en Claude Code 2.1.179 y OpenAI en Codex 0.146.0, mientras que Microsoft no ha lanzado nada para Copilot y Google afirma que no parcheará Gemini CLI, cuyo soporte ya ha finalizado.
Nada del ataque toca el modelo ni el razonamiento del agente. Se sitúa una capa por debajo, en la fontanería del mercado de extensiones que deposita los complementos en un portátil de trabajo; y un plugin se ejecuta con los mismos permisos que tenga el ingeniero que opera el agente.
Claves
- Los investigadores de Air Or Nevo, Dor Granat y Niv Hoffman encontraron el mismo paso de verificación ausente en Claude Code, Codex, GitHub Copilot y Gemini CLI.
- Anthropic publicó la corrección en Claude Code 2.1.179 y OpenAI en Codex 0.146.0; Microsoft no ha lanzado nada para Copilot y Google no parcheará Gemini CLI.
- La actualización automática de plugins en segundo plano, activada por defecto en Claude Code y Codex, es lo que elimina el clic del ataque.
Por qué el anclaje a un SHA debía haber zanjado esto
El anclaje existe porque la alternativa ya había fracasado en público. Buena parte de las pruebas las aportó el trabajo previo de la propia Air: una habilidad deliberadamente maliciosa que publicó en un mercado de confianza alcanzó más de 26.000 agentes, y un estudio posterior secuestró 925 habilidades que ya estaban en uso y llegó a 134.000 agentes. La respuesta del sector fue dejar de confiar en los nombres. Una rama o una etiqueta de versión pueden moverse; un hash de commit de 40 caracteres, no.
El razonamiento es sólido, y es exactamente el razonamiento que ha fallado aquí. El anclaje solo cumple su promesa si alguien comprueba el resultado, y resultó que el código del cliente que realiza la instalación comprobaba la petición en su lugar. Las empresas que más lejos llegaron —revisar el código del plugin, anclar un commit auditado, tratar el hash como evidencia de auditoría— heredaron el fallo de la forma más completa, porque todo su control dependía del paso que se estaba omitiendo.
Dónde desaparece la comprobación
Git es inusualmente permisivo con los nombres que admite para una rama. Su propio validador de formato de referencias acepta un nombre compuesto por 40 caracteres hexadecimales y, cuando una cadena es a la vez una referencia válida y un identificador de objeto verosímil, git elige la referencia y rebaja el conflicto a un aviso que nadie lee. Un atacante que controle el repositorio del plugin puede, por tanto, crear una rama cuyo nombre coincida carácter por carácter con el hash anclado, convertirla en la rama por defecto del repositorio y ver cómo se instala el contenido que él elija mientras el agente informa de que todo ha ido bien en el commit esperado. Claude Code, Codex y GitHub Copilot caen ante esa variante.
Gemini CLI se rompe por otra costura. Descarga correctamente el objeto anclado y lo escribe en el archivo FETCH_HEAD del repositorio, pero después hace un checkout de FETCH_HEAD por nombre: un nombre que un repositorio hostil puede reclamar libremente como su rama por defecto, momento en el que el commit correctamente descargado simplemente se descarta.
Lo que cierra ambas variantes es una única comprobación: una vez completado el checkout, resolver HEAD, compararlo con el hash solicitado y abortar si difieren. La distinción decisiva es verificar el resultado resuelto y no la referencia que se pidió, que es precisamente por donde se cuela la variante de Gemini.
El multiplicador de la actualización automática
Un fallo limitado al momento de la instalación ya sería grave. Este es peor porque los agentes repiten ese mismo checkout según su propio calendario. Claude Code y Codex refrescan los plugins instalados en segundo plano de forma predeterminada, así que un cambio de hash aguas arriba se propaga sin instalación, sin aviso y sin ningún evento visible. El atacante no necesita convencer a nadie de que instale nada: el plugin que le hace falta ya está en la máquina objetivo y ya goza de confianza.
De ahí se derivan dos vías de entrada, y ninguna exige comprometer un mercado. Un atacante puede publicar algo genuinamente útil, superar la revisión y cambiar su contenido más adelante. O puede apoderarse del repositorio que hay detrás de un plugin escrito por otra persona, el escenario exacto que el anclaje se adoptó para contener. Ambas mitades ya se han demostrado por separado, y eso es lo que hace que la cadena sea creíble y no teórica.
Dos proveedores parchearon, dos no
Air avisó a los cuatro proveedores en junio bajo divulgación coordinada, y las respuestas divergieron con claridad. Anthropic y OpenAI publicaron correcciones. Google declinó: dijo a los investigadores que Gemini CLI está descontinuado y remitió a los usuarios a su entorno Antigravity, que no tiene anclaje de plugins de mercado que subvertir. Microsoft, según los investigadores, nunca llegó a responder.
GitHub discute estar expuesto. Un portavoz declaró a The Register que la plataforma bloquea los nombres de ramas y etiquetas que se parecen a hashes de commit, de modo que la técnica no funciona allí. La respuesta de Air es que los agentes no solo consumen mercados alojados en GitHub: la documentación de Anthropic incluye Bitbucket y git autoalojado entre los backends admitidos, y estos aceptan con normalidad nombres de rama con forma de hash. Con Microsoft citando una adopción de Copilot cercana al 90 % entre las empresas del Fortune 500, la superficie sin parchear no es pequeña.
Qué significa para la gobernanza de plugins
El punto estructural incómodo es que ningún mercado puede arreglar esto en nombre de sus usuarios. El anclaje se evalúa en el cliente, así que la garantía que anuncia un mercado se aplica en un lugar donde no tiene código ejecutándose. Eso invierte el supuesto que sostiene buena parte de las compras corporativas actuales, donde un mercado aprobado se trata como la frontera de control. Iniciativas como el estándar Agent Plugins, neutral respecto al proveedor, pueden ayudar al convertir el comportamiento de verificación en algo especificable en lugar de dejarlo a criterio de cada fabricante. Por ahora el consejo práctico es acotado: actualizar Claude Code y Codex y, en el caso de Copilot y Gemini CLI, inventariar qué hay instalado y dónde está alojado. Quien siguiera el gusano ChainDrop que envenenó 444 paquetes npm con firmas válidas reconocerá el patrón: el mecanismo de integridad estaba presente, y su presencia se confundió con su aplicación.
Preguntas frecuentes
¿Me afecta Plugin4Shell?
Está expuesto si usa Claude Code, OpenAI Codex, GitHub Copilot o Gemini CLI con plugins instalados desde un mercado. Claude Code 2.1.179 y Codex 0.146.0 incluyen correcciones, así que actualizar cierra el problema en esos dos. Copilot y Gemini CLI no tienen parche disponible por ahora.
¿Me protege usar plugins alojados en GitHub?
En parte. GitHub rechaza nombres de rama y etiqueta con forma de hash de commit, lo que bloquea la variante principal en esa plataforma. Los investigadores de Air señalan que los agentes también admiten mercados en Bitbucket y en servidores git autoalojados, donde el truco sigue funcionando, y que la regla de GitHub no hace nada frente a la variante independiente de Gemini CLI.
¿Puede un mercado resolver esto por su cuenta?
No. El commit anclado se resuelve en la máquina del cliente cuando el agente ejecuta su checkout, así que solo un paso de verificación en el lado del agente puede garantizar que el anclaje se respetó. Un mercado puede restringir qué servidores git permite, pero eso reduce las configuraciones admitidas sin cerrar el fallo de fondo.






