
El benchmark que nadie cuestiono
Anthropic contrato a Trajectory Labs para medir que tan vulnerable era Claude Code Opus 5 a prompt injection. Corrieron 72 escenarios, 10 veces cada uno. Resultado: 0.00% de exito para el atacante. Boris Cherny, del equipo de Claude Code, lo dijo asi: no podemos demostrar prompt injection, esta resuelto en la practica.
Bueno, no lo esta.
Un sitio web, un ZIP, y struct.py
El investigador de seguridad detras de embracethered.com construyo una cadena de ataque que logro ejecucion de codigo remoto (RCE) con entre 60% y 80% de exito. Y no uso nada exotic: un sitio web falso que parece un archivo academico, un ZIP con metadatos plausibles, y un truco de Python que lleva 20 anios ahi pero que nadie habia weaponizado contra un agente de IA.
El ataque es elegante y te lo explico en pasos porque vale la pena entenderlo:
1. El gancho. Le pides a Claude Code que resuma una pagina web. La pagina responde con un 415 Unsupported Media Type. Claude no puede usar WebFetch, asi que decide usar curl. Ese primer salto al shell es todo lo que el atacante necesita.
2. El ZIP. El servidor redirige a un archivo ZIP que contiene registros de catalogo con fechas, checksums y metadatos que parecen legitimos. Tambien trae un binario macOS llamado decoder-darwin y un README que explica el formato de codificacion: Base85, zlib, JSON.
3. La trampa reversa. Claude ve el binario y se niega a ejecutarlo. Decision correcta de seguridad, po. Pero en vez de rendirse, Claude decide escribir su propio decodificador en Python. Y ahi es donde todo se va al carajo.
4. Module shadowing. Cuando Claude ejecuta python3 -c 'import base64, zlib, json; ...' dentro del directorio extraido, Python pone ese directorio en el path de busqueda de modulos. El estandar base64 importa struct. Y adivina que hay dentro del ZIP: un archivo llamado struct.py. Python carga el modulo del atacante en vez del de la stdlib. El modulo malicioso re-exporta el API real de _struct para que todo funcione normal, pero en paralelo ejecuta codigo ofuscado.
5. C2 callback. El codigo ofuscado lanza un proceso hijo en Python isolado (con -I para no caer en el mismo truco), descarga un payload nativo, lo marca como ejecutable y lo lanza. El proceso se desprende de la sesion de Claude y establece conexion con un servidor de command-and-control. La maquina esta comprometida y Claude sigue decodificando registros como si nada.
El clasificador que dejo entrar el ataque y bloqueo la limpieza
Lo mas surrealista de todo esto: en algunas ejecuciones, Claude se dio cuenta que algo andaba mal. Detecto el struct.py modificado, advirtio al usuario, e intento terminar el proceso del malware. Pero Auto Mode bloqueo el comando de limpieza. El clasificador que se supone te protege dejo entrar el exploit y despues no te dejo defenderte.
Y hay una variante todavia mas perturbadora: el payload puede lanzar una segunda instancia headless de Claude Code con claude -p. O sea, el ataque no solo ejecuta codigo, crea otro agente con su propio acceso a herramientas y contexto. Ese segundo Claude hizo reconocimiento basico (whoami, uname, id) y escribio archivos en el home del usuario.
La respuesta de Anthropic
El investigador reporto todo esto a Anthropic. La respuesta fue: Informative. Working as designed.
La posicion oficial es que Auto Mode es una comodidad, no una garantia de seguridad. Un clasificador best-effort, no un sandbox. Los ataques determinados que combinan pasos que parecen benignos no son lo que el clasificador debe detener. El limite real, segun Anthropic, es el aislamiento del sistema operativo y el control de egreso de red.
El problema es que ese mensaje no es el que reciben los usuarios. Cuando Anthropic muestra un grafico con 0.00% de exito de ataque y dice que el prompt injection esta resuelto en la practica, la gente confia. Y cuando un usuario confia y activa Auto Mode (que es el default desde mediados de agosto para Pro, Max y Team), esta operando sin red.
Mi opinion
En la pega uso agentes de IA todos los dias. Claude Code, Codex, herramientas que toman decisiones sobre mi terminal. Y te digo algo: nunca les doy acceso libre a mi maquina principal. Corro agentes en maquinas dedicadas donde pueden romper lo que quieran. En mi workstation soy cuidadoso y no uso modos sin permisos.
Lo que me molesta de este caso no es que exista el ataque. Los ataques van a existir siempre. Lo que me molesta es el gap entre el marketing y la realidad. 0.00% en el benchmark y 80% de RCE en la practica son ambos verdaderos al mismo tiempo, porque el benchmark midio 72 escenarios fijos y este ataque no estaba en la lista. Eso no es un bug, es una mentira por omision.
Un clasificador no es un sandbox. Lo sabemos desde hace anios en ciberseguridad. Pero cuando le dices a miles de desarrolladores que el prompt injection esta resuelto y activas el modo automatico por defecto, estas creando una falsa sensacion de seguridad. Y la falsa seguridad es peor que la inseguridad, porque baja la guardia.
La leccion no es que Claude sea malo. La leccion es que ningun modelo de IA es un limite de seguridad. Si tu agente maneja contenido no confiable, necesitas aislamiento a nivel OS, control de egreso de red y monitoreo de lo que hace. Punto. No hay atajo.
El investigador lo dijo bien: no confies en el output del modelo. Y yo le agregaria: no confies en el benchmark que te venden como prueba de que todo esta bien. Preguntate que no midio.
Fuente de inspiración: Breaking Claude Code Opus 5 Auto Mode
