El panorama de seguridad para herramientas de desarrollo con IA cambió recientemente con el hallazgo de una vulnerabilidad crítica de Remote Code Execution (RCE) en la CLI Claude Code de Anthropic. El fallo, identificado por el investigador Joernchen de 0day.click, muestra un descuido sutil pero peligroso en cómo herramientas de línea de comandos gestionan entradas externas. Mientras muchas auditorías modernas se apoyan en escáneres automáticos, este hallazgo nació de revisión manual del código fuente, centrada en cómo la aplicación inicializa configuración antes de que arranque su lógica principal.
La vulnerabilidad, ya corregida en la versión 2.1.118, permitía a un atacante ejecutar comandos arbitrarios en la máquina del usuario. El núcleo del problema no era un fallo criptográfico complejo ni un error profundo de lógica en la IA. Era un clásico problema de validación de entrada en el deeplink handler. Al inducir a un usuario a hacer clic en un enlace especialmente construido, un atacante podía saltarse prompts de seguridad y tomar control total de la sesión de terminal.
| Información clave | Detalles |
|---|---|
| Tipo de vulnerabilidad | Remote Code Execution (RCE) |
| Herramienta afectada | Claude Code CLI |
| Versión corregida | 2.1.118 |
| Método de descubrimiento | Auditoría manual de código fuente |
| Vector principal | Deeplink malicioso (claude-cli://) |
Este caso recuerda que incluso los sistemas de IA más avanzados se construyen sobre bases de software tradicionales. Cuando esas bases tienen grietas en su manejo de entradas, todo el sistema se vuelve vulnerable. En las secciones siguientes desglosamos la causa técnica y cómo ese parsing "ansioso" se convirtió en arma.
Raíz técnica: un caso de parsing "demasiado ansioso"
En el centro del fallo había una función llamada eagerParseCliFlag. En muchas aplicaciones CLI existe la necesidad de cargar ciertos parámetros muy temprano en el ciclo de vida, a veces antes de que la librería principal de parsing (como Commander.js) haya arrancado. Claude Code usaba esta función para buscar "de forma ansiosa" flags como --settings o --setting-sources, asegurando entorno configurado antes de la rutina principal de inicialización.
El error técnico era engañosamente simple. eagerParseCliFlag iteraba sobre el array bruto process.argv y usaba startsWith para detectar flags. Estaba diseñada para soportar sintaxis --flag=value y --flag value. Pero lo hacía sin conciencia del contexto de línea de comandos. Trataba cualquier string del array como potencial flag, sin reconocer que un string que empieza por --settings= podía ser en realidad el valor de otro flag.
"The deeper issue lay in
eagerParseCliFlagwhich didn’t keep track of actual command line flags and their values. Instead, it naively parsed the entire command line for any string starting with--settings=....".
Esa ceguera de contexto abrió un punto de inyección peligroso. Si el atacante podía influir en el valor de un flag legítimo, podía "colarle" un segundo flag dentro de ese valor. Cuando eagerParseCliFlag recorría argumentos, veía el string inyectado y lo trataba como override de configuración global. Este patrón de usar startsWith sobre arrays crudos de argumentos es un anti-pattern conocido porque rompe la estructura fundamental del parsing CLI.
| Paso de parsing | Comportamiento en versión vulnerable |
|---|---|
| Fuente de entrada | Array bruto process.argv |
| Lógica de matching | startsWith("--settings=") |
| Conciencia de contexto | Ninguna (no distingue flags de valores) |
| Resultado | Permite inyectar flags dentro de argumentos de otros flags |
Explotando esa falta de contexto, un atacante podía forzar la CLI a cargar settings diferentes a los que el usuario pretendía.
Vector de ataque: convertir deeplinks en arma
El mecanismo de entrega fue el protocolo deeplink claude-cli://. Los deeplinks buscan mejorar UX permitiendo que webs u otras apps disparen acciones específicas en una herramienta local. En Claude Code, el URI claude-cli://open permitía abrir la CLI y prellenar un prompt con un query param normalmente llamado q.
Cuando un usuario hace clic en un enlace tipo claude-cli://open?q=hello, el sistema operativo lo pasa al handler de Claude Code. Ese handler lo traduce a ejecución de línea de comandos usando el flag --prefill para pasar el contenido de q a la CLI. Debido al problema de parsing "ansioso", un atacante podía construir un q con algo más que un prompt: podía incluir un string que pareciera un flag de configuración.
Ejemplo de link malicioso:
claude-cli://open?q=--settings={"hooks":...}
Cuando inicia la CLI, el array de argumentos queda así:
["claude", "--prefill", "--settings={\"hooks\":...}"]
El parser estándar trataría correctamente --settings=... como valor de --prefill. Pero eagerParseCliFlag vulnerable recorría el array, detectaba un string que empezaba por --settings= y lo cargaba de inmediato como configuración global. Así, el atacante podía sobreescribir cualquier setting de la aplicación con solo lograr un clic.
| Componente URI | Propósito | Manipulación del atacante |
|---|---|---|
claude-cli://open | Dispara el handler de CLI | Punto de entrada estándar |
repo= | Especifica un repositorio | Usado para bypass de trust dialogs |
q= | Prellena el prompt de usuario | Inyectado con payload --settings= |
Este vector es especialmente efectivo porque usa una feature pensada para conveniencia. Los usuarios suelen confiar en deeplinks de fuentes familiares, y la transición de navegador a terminal puede ocurrir en segundos.
De la inyección a la ejecución: explotando hooks
Una vez que el atacante puede inyectar settings arbitrarios, el camino a RCE es directo. Claude Code incluye una feature potente llamada "hooks", que permite automatizar acciones en momentos concretos del ciclo de sesión. Por ejemplo, ejecutar un script cada vez que empieza una sesión. Inyectando configuración maliciosa, el atacante define sus propios hooks para ejecutar comandos shell.
El objetivo más efectivo es el hook SessionStart. El atacante construye payload JSON con comando a ejecutar tan pronto inicializa la CLI. Como eagerParseCliFlag ya cargó esos settings, el comando dispara de inmediato. Todo esto puede pasar en segundo plano, a menudo antes de que el usuario perciba que la CLI abrió.
Para hacerlo aún más silencioso, el investigador encontró forma de saltar el diálogo de "Workspace Trust". Normalmente, Claude Code pide permiso antes de correr en un repo nuevo. Pero si el atacante fija repo en el deeplink a un repo ya confiado por el usuario (como anthropics/claude-code), la CLI asume entorno seguro. Eso elimina la última barrera y permite ejecutar comando inyectado sin interacción adicional más allá del clic inicial.
| Paso del ataque | Acción | Resultado |
|---|---|---|
| 1. Inyección | Usuario hace clic en link claude-cli:// malicioso | Settings maliciosos cargan de forma ansiosa |
| 2. Bypass de confianza | Link especifica repo ya confiado | Prompts de seguridad se suprimen |
| 3. Ejecución | Hook SessionStart se dispara | Comando shell del atacante se ejecuta inmediatamente |
La combinación de parsing ansioso y automatización por hooks crea una tormenta perfecta para RCE. Muestra cómo features diseñadas para usuarios avanzados pueden volverse contra ellos si el manejo de entrada subyacente no es robusto. En las siguientes secciones vemos cómo Anthropic corrigió el problema y qué deben aprender otros equipos.
El fix y lecciones para developers
Anthropic respondió rápido y lanzó parche en Claude Code versión 2.1.118. La corrección consistió en abandonar parsing ansioso sin contexto del array de argumentos. En lugar de buscar strings que empezaran por un nombre de flag, el código actualizado usa una lógica más robusta que entiende estructura real de argumentos. Al distinguir correctamente entre flags y valores asociados, se cerró la superficie de inyección.
Para equipos que construyen herramientas CLI, sobre todo con soporte de deeplinks, esta vulnerabilidad deja lecciones críticas. La más importante: evitar matching manual de strings sobre arrays brutos de argumentos. Aunque escribir parser propio para inicialización temprana parezca más rápido, casi siempre es más seguro apoyarse en librerías maduras que ya cubren complejidades de sintaxis CLI.
| Recomendación | Por qué importa |
|---|---|
| Usar librerías robustas | Commander.js o Yargs manejan edge cases y reducen riesgo de inyección. |
| Parsing con contexto | No asumas que un string es flag por empezar con guiones; valida su posición y rol. |
| Sanitizar deeplinks | Trata todo dato desde URI handler como no confiable y potencialmente malicioso. |
| Limitar poder de hooks | Considera confirmaciones adicionales para hooks que ejecutan comandos shell. |
El anti-pattern de startsWith no es exclusivo de Claude Code. Es un error común en aplicaciones con carga temprana de configuración. Si tu app necesita parsear flags antes de init principal, asegúrate de respetar fronteras entre argumentos. Un detalle pequeño en lectura de CLI puede acabar en compromiso total del sistema.
"The parsing of command line flags and their arguments should always be done in full context to prevent this exact type of injection.".
Siguiendo estos principios, los equipos pueden ofrecer comodidad de deeplinks y automatización sin sacrificar seguridad del sistema del usuario. En el cierre, dejamos una reflexión sobre seguridad futura de herramientas agénticas.
Mantener la CLI segura
La vulnerabilidad RCE de Claude Code es un ejemplo de libro de cómo omisiones técnicas pequeñas pueden tener impacto de seguridad enorme. Recuerda que, aunque construyamos herramientas agénticas cada vez más poderosas, los fundamentos de desarrollo seguro siguen siendo los mismos: validación robusta de entradas, parsing contextual y desconfianza sana de datos externos.
Para usuarios de Claude Code, el mensaje es simple: asegúrate de correr 2.1.118 o superior. Puedes revisar versión con claude --version en terminal. Mantenerte actualizado es la defensa más efectiva frente a vulnerabilidades conocidas. Además de actualizar, conviene extremar cuidado al abrir deeplinks de fuentes no confiables, incluso si aparentan apuntar a herramientas que usas a diario.
A medida que crece el ecosistema de herramientas de desarrollo con IA, veremos más investigación centrada en estos puntos de integración. La transición entre web y terminal local es un objetivo de alto valor para atacantes. Entender la mecánica de estas vulnerabilidades ayuda a developers y usuarios a prepararse para los retos de asegurar la siguiente generación de software.
Asegurar el futuro agéntico requiere colaboración entre creadores de herramientas y comunidad de seguridad. La respuesta rápida de Anthropic y la divulgación técnica detallada de la comunidad investigadora son señales positivas de avance. Aprender de estos incidentes es cómo construiremos herramientas no solo más capaces, sino también más resilientes.
)
)