Claude Code corriendo Opus 5 en Modo Automático puede ser engañado para ejecutar código controlado por un atacante con solo pedirle al agente que resuma un sitio web. El ataque funciona hasta el 80% de las veces, según el investigador en inyección de prompts Johann Rehberger, conocido como wunderwuzzi.
En un blog y un video de demostración, detalló cómo secuestrar a Opus 5 en Modo Automático, que es la configuración por defecto de Claude desde mediados de agosto.
¿Cómo funciona el ataque paso a paso?
Todo parte pidiéndole al modelo de programación que resuma un sitio malicioso que se presenta como un archivo de registros de cuadernos de laboratorio. La página está montada para que Claude termine usando curl en vez de su herramienta WebFetch, pero sin decírselo directamente.
La secuencia es la siguiente:
- La petición con WebFetch falla y devuelve una respuesta 415 Unsupported Media Type.
- El modelo decide entonces acceder al sitio directamente, emitiendo una llamada a la herramienta Bash con curl.
- El sitio responde con un 303 y redirige a un archivo ZIP malicioso, que Claude descarga.
- El ZIP contiene archivos aparentemente inofensivos: metadatos de catálogo, un README, siete registros JSON codificados en Base85 y zlib, un binario decodificador para macOS y, además, un archivo Python envenenado llamado
struct.py.
Acá viene el giro interesante. Claude, siguiendo sus reglas de seguridad, se niega a ejecutar el binario decodificador. "Esto está planeado y es lo que el atacante quiere", escribió Rehberger. En vez de usar el binario provisto, la IA decide escribir su propio decodificador.
"Irónicamente, esa decisión de seguridad es la vía del exploit", explicó el investigador.
El truco: sombreado de módulos de Python
El decodificador nuevo importa base64, y desde ahí el ataque se apoya en el sombreado de módulos de Python para lograr que el modelo ejecute el código malicioso de struct.py.
El sombreado ocurre cuando un archivo local comparte nombre con un módulo de la biblioteca estándar. El archivo local oculta al módulo oficial y Python carga ese en su lugar. En este caso, el módulo estándar base64 importa el módulo legítimo struct, y el ZIP malicioso trae un archivo con ese mismo nombre.
Rehberger cuenta que usó ChatGPT para ofuscar el código malicioso de struct.py y así esquivar los controles de seguridad de Claude. El resultado lanza un proceso Python separado que descarga y ejecuta una carga remota, en este caso una llamada de vuelta a un servidor de comando y control que abre la Calculadora. Es razonable suponer que un atacante real ejecutaría algo bastante menos amable.
En otro escenario probado, struct.py lanza una segunda instancia de Claude Code sin interfaz mediante claude -p. Es decir, la inyección de prompt no sirve solo para ejecutar código remoto, sino para crear un agente completamente nuevo.
"El Claude anidado obtiene su propio acceso a herramientas y su propio contexto", escribió Rehberger. "En estas corridas, el hijo hizo reconocimiento básico (whoami, uname, id), abrió la Calculadora y escribió archivos locales en la carpeta del usuario."
Sobre tres variantes probadas cinco veces cada una, muestras que el propio investigador reconoce como pequeñas, reportó tasas de éxito de entre 60% y 80%. "Diría que estos resultados son representativos de un ataque motivado, pero no exhaustivos."
¿Qué dice Anthropic?
Anthropic no respondió a la solicitud de comentarios de The Register, pero según Rehberger le habría dicho que el comportamiento del modelo "funciona según lo diseñado".
"El Modo Automático es una función de conveniencia respaldada por un clasificador de mejor esfuerzo, no una garantía de seguridad", escribió el investigador, parafraseando la respuesta de la empresa a su reporte.
De acuerdo con Rehberger, el clasificador no está construido para detener cadenas de inyección de prompts determinadas, compuestas por pasos que se ven inofensivos de forma individual. El límite real, sostiene, es el aislamiento del sistema operativo y el control de salida de red.
¿Qué hacer si usás agentes de programación?
La conclusión del investigador es directa: correr este y otros agentes de programación dentro de un entorno aislado. Las medidas concretas que se desprenden del caso:
- Aislamiento a nivel de sistema operativo, un contenedor o una máquina virtual descartable, en lugar de confiar en el clasificador del modo automático.
- Control de egreso de red, para que un proceso lanzado por el agente no pueda alcanzar un servidor de comando y control.
- Desconfiar de la salida del modelo como si fuera entrada de usuario, especialmente cuando proviene de contenido web arbitrario.
"La solución es algo de lo que hablamos hace muchos años", cerró Rehberger. "No confíes en la salida del modelo."
Para equipos pequeños de la región que ya adoptaron agentes de programación en producción, el costo de la mitigación es bajo comparado con el del incidente: correr el agente dentro de un contenedor descartable no requiere licencias adicionales, solo disciplina de configuración. El detalle que conviene retener es que ninguno de los pasos de esta cadena, tomado por separado, se ve malicioso.




