Exponer una herramienta no es autorizar la llamada en los frameworks de agentes
Una auditoría de junio de 2026 sobre LangChain, LlamaIndex y el Stripe Agent Toolkit halla que ninguno revalida los argumentos reales de una llamada antes de ejecutarla: un pago inyectado pasa.
¿Qué es esto?
El 27 de junio de 2026, un breve artículo de arXiv de David Mellafe Zuvic (2606.28679) puso nombre preciso a un fallo que comparten muchas pilas de agentes: tratan la exposición de una herramienta como si equivaliera a autorización. El artículo audita tres piezas muy usadas — LangChain/LangGraph, LlamaIndex y el Stripe Agent Toolkit — con una pregunta acotada: antes de que se ejecute una llamada de herramienta emitida por el modelo, ¿revalida el framework los valores concretos de los argumentos frente a una política? En los commits públicos fijados que se examinaron, la respuesta es la misma para los tres: controlan qué herramientas puede invocar el modelo, pero ninguno incorpora por defecto una comprobación determinista y cerrada por defecto de lo que la llamada intenta hacer en realidad.
Esa brecha es el problema clásico del diputado confuso (confused deputy), descrito por Norm Hardy en 1988: a un programa privilegiado se le induce, mediante un invocador menos privilegiado, a hacer mal uso de una autoridad que ostenta legítimamente. La nota de investigación de la Cloud Security Alliance de marzo de 2026 documenta por qué este patrón ha resurgido como una clase de alto impacto en los despliegues de agentes.
Cómo funciona
Un agente que lee contenido no confiable — un correo, un documento recuperado, un resultado de herramienta — y a la vez posee herramientas con efectos secundarios (pagos, correo, CRM, API de infraestructura) no tiene una frontera nítida entre datos e instrucciones. Si un atacante puede escribir en cualquier canal que el agente lee, el texto inyectado puede orientar al modelo hacia una llamada que el operador nunca pretendió.
El punto clave de la auditoría es dónde falta la defensa. Una compuerta de capacidad responde a «¿es create_payment una herramienta permitida?» — y puede responder que sí con razón, porque se supone que el agente realiza pagos. Lo que ningún control por defecto resuelve es «¿esta llamada create_payment, con estos argumentos (este beneficiario, este importe), está autorizada ahora?». Al faltar la comprobación a nivel de argumentos, una instrucción inyectada que produce una llamada bien formada pero no autorizada pasa:
# Compuerta de capacidad: pasa — create_payment es una herramienta expuesta
# Falta: autorización por llamada sobre los valores {payee, amount}
create_payment(payee="attacker-controlled", amount=9999)
El artículo indica que ese mismo pago no autorizado se ejecuta con el despacho por defecto de LangChain (con una prueba de concepto asociada en LlamaIndex), mientras que la misma llamada se deniega cuando se coloca una compuerta de autorización por valor delante de la ejecución. Aquí no hay ninguna primitiva de explotación novedosa y el artículo no reivindica ningún CVE: la conclusión es que la postura por defecto falla de forma abierta sobre los valores.
Por qué importa
Los agentes se conectan cada vez más a herramientas con efectos irreversibles: enviar dinero, difundir correo a muchos destinatarios, modificar controles de acceso, borrar datos. Cuando la única capa de aplicación es el seguimiento de instrucciones del propio modelo, una sola inyección exitosa hereda toda la autoridad del operador. La nota de la CSA lo vincula a un incidente real de cadena de suministro en 2026, donde un ticket de repositorio manipulado indujo a un agente de código autenticado a instalar un paquete controlado por el atacante: la cadena del diputado confuso en el mundo real, no solo sobre el papel.
Las arquitecturas multiagente lo empeoran: un subagente que confía en su orquestador por el mismo canal que sus instrucciones legítimas propagará una única inyección a través de varios conjuntos de credenciales, sin humano en el bucle en cada paso.
Defensas
Reautorice cada llamada por sus valores, no solo por su nombre. Coloque un punto de decisión de política delante del despacho de herramientas que evalúe los argumentos concretos — beneficiario, importe, lista de destinatarios, recurso objetivo — y deniegue por defecto. El diseño de referencia del artículo, ScopeGate, lo estructura en cinco etapas: alcance (scope), autorización, techo monetario, idempotencia y denegación por defecto. No necesita esa implementación exacta; necesita la propiedad de que un valor no autorizado se rechace de forma determinista, antes de ejecutarse.
Trate el contenido recuperado como datos, nunca como instrucciones. Haga que las instrucciones que disparan acciones provengan solo de principales autorizados. El contenido de páginas web, correos, documentos y respuestas de herramientas no debe poder originar por sí solo una llamada con efectos secundarios.
Exija confirmación humana para las acciones irreversibles. Pagos, envíos masivos, cambios de credenciales y borrados deben requerir aprobación explícita fuera de banda, aplicada en el runtime, sea cual sea el origen aparente de la instrucción.
Acote las credenciales, no ceda autoridad ambiental. Sustituya las concesiones OAuth amplias por otras estrechas y por propósito; dé al agente su propia identidad para que las acciones anómalas destaquen. Limite el radio de impacto (topes de gasto, destinatarios/dominios en lista blanca) para que un diputado confuso tenga poco margen.
Haga explícita cada transferencia de autoridad en los grafos multiagente. Los subagentes no deben heredar de forma implícita los permisos de un orquestador; registre y firme los mensajes entre agentes para que un orquestador manipulado no pueda delegar en silencio.
Estado
| Elemento | Detalle |
|---|---|
| Fuente | arXiv 2606.28679, «Capability Gates Are Not Authorization» (enviado el 27 de junio de 2026) |
| Auditado | LangChain/LangGraph, LlamaIndex, Stripe Agent Toolkit (commits públicos fijados) |
| Hallazgo | Control de capacidad presente por defecto; sin autorización por llamada, cerrada por defecto, sobre los valores |
| Control de referencia | ScopeGate (PDP/PEP) — alcance, autorización, techo monetario, idempotencia, denegación por defecto |
| Resultados reportados | El pago no autorizado se ejecuta con LangChain por defecto; denegado por la compuerta probada (0/48 elusiones estáticas, 0/29 intentos adaptativos, 0/10 denegaciones erróneas) |
| CVE | Ninguno reivindicado por el autor |
| Contexto | Nota de investigación de la CSA sobre ataques de diputado confuso a agentes (publicada el 23 de marzo de 2026) |
Este artículo resume investigación defensiva divulgada públicamente y no contiene instrucciones operativas de ataque.