Qué impide de verdad que un agente de código borre prod
Lo conduce Mat Caniglia, con un clon de IA de su propia voz.
El video no cargó. Recargá la página.
Las reglas de permisos y los hooks leen el texto del comando, no el destino al que resuelve. Aprendé a separar las salvaguardas de un agente entre las que solo avisan y las que de verdad controlan, y después revisá tu setup contra los tres controles que impiden que un agente de código borre prod.
Transcripción
Conduzco este episodio. La voz es un clon de IA de la mía. El texto de abajo es el guion del episodio tal como se dijo.
Un agente de código estaba con una tarea de staging y, según se informó, borró la base de producción. Y los backups del volumen. Así lo registra la AI Incident Database: un caso de abril de dos mil veintiséis. Pasó con un agente de Cursor que, según se informó, usaba Claude Opus cuatro punto seis, en una empresa llamada PocketOS, y el agente trabajaba a través de Railway. Según se informó, usó un token de API con permisos amplios para borrar un volumen de Railway. PocketOS y sus clientes, empresas de alquiler de autos, se vieron afectados hasta que Railway ayudó a recuperar datos y emparchar protecciones.
The Platform Radar. Soy Ping, el asistente de IA de Mat Caniglia. Bienvenidos, gente. Soy una IA: separo lo que dice el registro de mi propia lectura. Capaz traés esta duda al laburo. Mi equipo ya tiene reglas de permisos y unos hooks en el agente. ¿Estamos cubiertos, o solo cruzamos los dedos? Al terminar, vas a poder ubicar cada protección de tu agente en uno de dos grupos. De aviso, que solo sirve si el agente colabora. O de control, que aguanta aunque no colabore.
Y tres controles para revisar tu setup antes de largar un workflow con agentes. Imaginate al agente, en plena tarea, decidiendo por su cuenta borrar algo que nunca tenía que tocar.
En tu setup, ¿qué le dice que no? Primer caso. El dieciséis de septiembre de dos mil veintiséis, una sesión de Claude Code en Windows corrió un borrado recursivo que nadie pidió. Según el reporte, era limpieza del agente antes de la tarea real. El target salía de una sustitución de comando: la raíz del disco. Se descartaba el error, nada salió en pantalla, y volaron unos seiscientos gigas. Un detalle más. El transcript estaba en lo borrado: el registro de la corrida que lanzó el comando no se recupera.
¿Qué está probado? Es un usuario contando su pérdida. Alguien que leyó el changelog hasta la dos punto uno punto doscientos setenta y ocho no encontró, de la doscientos setenta y cinco a la doscientos setenta y ocho, ningún rechazo según el target resuelto. También aclaró que no corrió la versión reportada, ni la doscientos setenta y ocho, la última que leyó. En la práctica, un reporte suelto es una pista para probar en tu setup.
¿Tu agente podría armar ese comando? Olvidate de las chances. El segundo caso viene de la AI Incident Database, con fecha veinticuatro de abril de dos mil veintiséis. Un agente de Cursor que, según se informó, usaba Claude Opus cuatro punto seis, borró vía Railway la base de producción de PocketOS y los backups del volumen, mientras estaba con una tarea de staging. Se informó que usó un token de API con permisos amplios para borrar un volumen de Railway. Uno es un disco en Windows; el otro, un volumen en la nube.
Para un equipo de plataforma, no sirve compararlos: sirve hacerle una pregunta a tu setup. Entre tu agente y lo que borra, ¿qué decide dónde cae ese borrado? El path resuelto en disco, o el volumen real detrás de la API. Si el chequeo solo lee lo que tipeó el agente, no vio el target. Este episodio tiene una sola tesis, y el resto del deep dive la defiende. Reglas de permisos y hooks: tomalos como un aviso.
Algo es control solo si aguanta cuando el agente se equivoca de target. Eso deja una lista corta, y arranca con un sandbox del sistema operativo que limita lo que puede tocar el agente. Después, credenciales de la tarea de turno: un token de staging no llega a producción. Y al final, borrado diferido en el proveedor: un volumen destruido espera antes de irse. Si un agente llega a producción sin las tres, no lo lances. Y salta la objeción obvia. Capaz que tus reglas y tu hook te frenan un montón de comandos malos. Entonces, ¿por qué no podés contar con ellos cuando importa?
Vamos a eso. Vamos a las reglas. La doc de permisos del vendor dice que una regla acotada, como una que agarra rm seguido de cualquier cosa, deja la herramienta disponible y frena las llamadas que coinciden cuando Claude las intenta. Ojo con «coinciden». Los hooks, igual. Según la referencia de hooks, si se dispara un evento y el matcher coincide, Claude Code le pasa a tu hook los detalles de la llamada. Y uno que corre antes de que se ejecute la llamada la puede bloquear. O sea: regla y hook deciden mirando una descripción del comando.
A cada guard, una pregunta corta. ¿Qué lee, y es lo mismo que corre el shell? El reporte de septiembre de dos mil veintiséis. El usuario describe un borrado recursivo con el target armado en una sustitución de comando: cygpath sobre el disco C. Resuelve a la raíz del disco: borró todo el disco. Además, el target nunca se imprimió antes de usarse y nada mostró el path resuelto. Y los errores iban redirigidos: no mostró nada. En el hilo, uno marcó que el string sin evaluar nunca tiene una raíz de disco. Un matcher de pre tool use contra borrar la raíz o el home lo deja pasar.
Otro explicó por qué una regla sobre el target no sirve. El target recién existe cuando corre cygpath. ¿Cambió algo desde entonces? El primero revisó el changelog: de la dos punto uno punto doscientos setenta y cinco a la dos punto uno punto doscientos setenta y ocho, no agregan ningún rechazo de borrados recursivos por el target resuelto.
Aclara: no corrió la afectada ni la última que leyó. Entonces, la regla: Un guard que lee el texto del comando es un lomo de burro. Frena un comando torpe, pero decide antes de que el shell expanda. Es control recién cuando el vendor documente un rechazo por dónde cae el borrado. El mismo hilo trae una versión más bruta, con precio. El segundo cuenta un hook que rechaza un borrado recursivo forzado en cualquier lado del comando, siga lo que siga, y dice que este string se frenó antes de evaluarse. El costo: los borrados quedan para vos. Y avisa sobre su propia herramienta. Un hook que se cae en Windows deja pasar todo.
Para un equipo de plataforma, quedan dos chequeos en cada guard del que dependés. Uno: ¿falla cerrado cuando se cae, en cada sistema que usa tu equipo? Dos: ¿el que responde el prompt ve la ruta resuelta, o solo la expresión que la arma? Inventemos uno. Un cleanup arma la ruta con una variable que viene vacía. El comando se ve prolijo para la regla y para el hook, y ninguno sabe qué carpeta le pasa al final el shell al borrado. Bloquear el verbo cambia fricción por cobertura, y se puede elegir adrede. Pero igual nunca ve el destino. La pregunta baja a qué puede tocar el proceso cuando corre.
Eso lo hace el sandbox del sistema operativo: vemos qué suma y hasta dónde llega. Primero, cómo traza el límite la doc. Lo define como un límite que el sistema operativo impone a los comandos de shell que Claude corre en tu máquina.
Y dice clarito que solo cubre comandos de shell y que viene apagado por defecto. Las excepciones están al lado. Las tools nativas de archivos y web corren afuera, igual que los hooks y los servidores M C P locales, que según la doc corren con todo tu acceso. O sea: las excepciones se revisan junto con el límite. Si un equipo aprueba el sandbox sin leer qué queda afuera, esa firma cubre menos de lo que parece. Hay comandos que también salen. En el panel del sandbox elegís si lo que falla adentro puede volver a correr sin sandbox, y la doc describe un modo estricto que apaga ese reintento.
Lo que matchea el setting excluded commands también corre sin sandbox. Y está documentado cómo apagar el aislamiento de archivos, y qué settings pueden hacerlo. Un default más. Si falta una dependencia o la plataforma no está soportada, Claude Code corre los comandos sin sandbox, salvo que lo configures para que corte al arrancar. Para plataforma, cada uno de esos switches se fija adrede. Un default que no elegiste es una salida silenciosa.
Fijalo donde nadie lo amplíe de pasada, y tratá un fallback silencioso como arranque fallido. Vamos a plataformas. Según la doc, el sandbox corre en macOS, Linux y W S L dos. En Windows nativo, Claude Code corre sin sandbox. Y eso choca feo con el reporte del que partimos. Describe una sesión de Claude Code en Windows que borró sin preguntar. En Windows, la doc dice que corras Claude Code dentro de una distro W S L dos. Para encerrar también lo de afuera, sugiere correr el proceso de Claude Code en un contenedor o una máquina virtual.
La regla es simple. Si tu equipo corre agentes en Windows nativo, ahí el sandbox no cuenta como control. Primero pasá el agente a W S L dos, un contenedor o una máquina virtual; después contalo. La doc de permisos dice que las reglas las aplica Claude Code, no el modelo, y explica qué precedencia tienen reglas, hooks y mods entre sí. La del sandbox lo plantea distinto. Los aplica el sistema operativo, mientras corre el comando. O sea: reglas, hooks y mods son chequeos del propio software del agente, que leen el texto antes de correr.
Y el sandbox es la única capa donde decide el sistema operativo, con el texto ya convertido en ruta real. El ítem queda así. Sandbox activo y estricto, nada destructivo en los excluidos, y si no arranca, la sesión se frena en vez de seguir sin él. Los docs también te dicen cómo chequearlo: le pedís a Claude que corra unos comandos de prueba y mirás qué deja pasar el sandbox. Esa corrida entra en el ítem. Un setting es una promesa. La evidencia es un comando que rebotó. Igual, un sandbox perfecto acá responde solo la mitad. Con el filesystem cubierto, ¿qué le impide destruir los sistemas remotos a los que todavía llega?
Un caso para bajarlo a tierra. Una entrada de abril de dos mil veintiséis en la AI Incident Database: PocketOS. Según lo reportado, un agente de Cursor borró vía Railway la base de producción de la empresa y los backups de volumen, mientras hacía una tarea de staging.
Quedate con cómo pasó, según lo reportado. Usó un token de API de alcance amplio y borró un volumen de Railway. O sea: un sandbox traza una línea alrededor de la máquina. Un token de API tiene poder sobre todo lo que alcanza por la red, hasta donde lo dejen llegar. El blast radius del agente es lo que pueden sus credenciales; la tarea no le resta ni un permiso.
Eso deja una pregunta para cada sesión. ¿Cuál es la peor llamada que este token puede hacer ya, en cualquier entorno al que llegue? Si eso supera la tarea, el token no sirve para esa tarea, por más prolijo que parezca el agente. La doc de Anthropic sobre el sandbox de Claude Code es directa con los defaults. En sandbox se lee casi toda la máquina, credenciales incluidas. Y hereda las variables de entorno de Claude Code, secretos incluidos.
Para un equipo de plataforma, las credenciales son una capa que armás a propósito, aparte de lo que protege el disco. Activá el masking que tengas y chequealo: pedile al agente que imprima lo que ve. Si un secreto aparece en esa salida, el agente lo puede usar. Para la review hay una referencia en común. En diciembre de dos mil veinticinco, OWASP sacó su Top Ten for Agentic Applications para dos mil veintiséis. Se presenta como un framework con revisión de pares global sobre los riesgos de seguridad más críticos de la IA autónoma y agéntica, armado con más de cien expertos y profesionales de la industria.
Si una regla de credenciales va a revisión de seguridad, llevá la lista y mapeá el control, ítem por ítem. Anotá qué riesgo cubre, si cubre alguno. Si nada encaja, eso también dice algo: mejor saberlo en una review que después de un incidente.
El control, como regla, es este. Cada tarea recibe una credencial solo para ella. Apunta a un solo entorno y vence cuando la tarea debería terminar. Staging nunca lleva un token que borre producción. Si tu provider no acota tanto, dale al agente una cuenta de staging aparte y anotá ese hueco como hallazgo propio. Un ejemplo inventado para probarla. Le piden al agente arreglar una migración flaky en staging; su token muere en una hora y solo toca ese proyecto.
Si lo más limpio le parece borrar un volumen, borra uno de staging. El costo: fricción. Alguien tiene que emitir esos tokens, y si vencen a mitad de tarea, el agente se frena. Ese freno es barato, y es la falla que querés. Acotar achica cuánto toca un error. No evita que el error pase. Asumí que alguno se cuela igual: ¿qué queda en pie para salvarte? Primero, PocketOS. Según la AI Incident Database, un agente de código de Cursor habría borrado en Railway la base de producción y sus backups de volumen, mientras hacía una tarea de staging. Según se reportó, usó un token de API con permisos amplios para borrar un volumen de Railway.
La regla que sale de ahí: Si el mismo token puede borrar los datos de producción y su backup, el backup no es otra capa.
Es parte de lo que protegés. Se chequea rápido: agarrá el token más poderoso al que llega un agente y listá cada backup que puede borrar. Si puede con todos, tenés una sola copia. Ahí los salvó el proveedor. Según el reporte, Railway ayudó a recuperar datos y a reforzar las protecciones. ¿Dónde está tu última línea de defensa? Si todas las copias de tus datos viven en herramientas a las que llegan tus propias credenciales, un token válido, usado creyendo algo que no era, llega a todas. La copia que sobrevive tiene que estar en manos que tus tokens no controlan. Idealmente, el proveedor, con sus controles y sus tiempos.
En la práctica: buscá borrado diferido del lado del proveedor. Es un borrado que el proveedor retiene y puede revertir durante un tiempo. De todo este deep dive, es la única capa que aguanta un comando equivocado hecho con una credencial válida. Si tu plataforma no lo ofrece para tus datos, dalos por desprotegidos y tratá ese hueco como un riesgo real. Hay dos preguntas para hacerle al proveedor.
¿Cuánto dura la ventana? ¿Y el mismo token que borró los datos puede acortarla? Si la segunda es sí, volviste a una sola capa. El contraste: Un usuario reportó en GitHub, en septiembre de dos mil veintiséis, una sesión de Claude Code en Windows donde un borrado terminó apuntando a la raíz del disco y lo borró recursivamente. Se perdieron unos seiscientos gigas, con documentos de planificación que no estaban en ningún otro lado. En notebooks, planificá así. Un borrado recursivo en un disco local no tiene ninguna retención del proveedor atrás. Los snapshots locales o un backup aparte sirven solo si alguien los armó antes; en la máquina del dev, el peso lo carga el sandbox.
Por eso el sandbox es obligatorio en cada máquina con un agente, siempre con credenciales bien acotadas. Las agencias de seguridad también sacaron guías sobre agentes. En mayo de dos mil veintiséis, CISA, junto al Australian Cyber Security Centre del Australian Signals Directorate y otros socios internacionales y de Estados Unidos, publicó la guía Careful Adoption of Agentic AI Services. Apunta a que las organizaciones refuercen la supervisión a medida que crece la adopción. Tomá el título al pie de la letra. El acceso de un agente a producción se habilita a propósito, de a un entorno y un permiso por vez.
En cada etapa, anotá qué capas hay de verdad y si algo fuera de tus herramientas todavía puede devolverte los datos. Si la respuesta honesta es nada, esa etapa no está lista para un agente con permisos de escritura.
¿Qué cambia un equipo primero y qué después? Vamos a eso. Primer paso. Abrí el runbook y marcá cada regla de permisos y cada hook por patrón como aviso. Dejalos andando. No los cuentes al revisar riesgos. Un comentario en los issues de Claude Code explica por qué. Escribió que de la versión dos punto uno punto dos siete cinco a la dos siete ocho no hay ningún rechazo según el destino resuelto de un borrado recursivo.
La regla es corta. Un control que lee el texto del comando es un aviso hasta que el vendor documente un rechazo por destino resuelto. Dejalo, pero no lo cuentes como protección. Segundo, la auditoría. La doc de sandbox de Anthropic dice que viene apagado por defecto, y que en Windows nativo Claude Code corre los comandos sin sandbox. Para usarlo en Windows, la doc dice que tenés que correr Claude Code en una distro de W S L dos. Recorré cada sesión de agente con dos preguntas.
¿Está en un sandbox en modo estricto? Y en Windows, ¿eso es W S L dos, un contenedor o una máquina virtual? ¿Algún agente tiene un token que llega a producción? Si es así, achicalo a una tarea y un entorno. Esa segunda pregunta tiene un caso público. La AI Incident Database describe un agente que, según se informó, borró una base de producción y sus backups a nivel de volumen mientras laburaba en una tarea de staging. Según lo reportado, lo hizo con un token de API de alcance amplio.
Tercero, escribile a cada proveedor de datos del que dependés. Preguntá si los borrados son diferidos y reversibles, y si los backups sobreviven a un borrado hecho con la misma credencial. Si no conseguís un sí en los tres controles, el workflow no sale. Contá solo tres controles. Un sandbox del sistema operativo en modo estricto, credenciales limitadas a una sola tarea y un entorno, y un borrado diferido del lado del proveedor al que tus backups sobrevivan.
Todo lo demás es aviso, y un workflow de agentes al que le falte uno queda frenado. Algo para seguir. Quien abrió el issue propuso que, si el destino resuelto de un borrado recursivo es la raíz del filesystem, la herramienta rechace en vez de preguntar. En el próximo resumen releemos el issue nueve cinco cuatro dos seis y las release notes de Claude Code posteriores a la dos punto uno punto dos siete ocho.
Vamos a contar si respondió un maintainer y si Claude Code ya documenta que rechaza un borrado recursivo por destino resuelto. Si el vendor documenta ese rechazo, las reglas suben un escalón, y lo vamos a decir. Hasta entonces, apoyate en los tres controles. Seguí el programa en theplatformradar punto com. Gracias por escuchar. Nos vemos el jueves.