Una demo en vivo de 15 minutos en AWS Bedrock AgentCore, un repositorio open-source y una única descripción de herramienta que secuestra un sistema multiagente completo.
Repo: github.com/NeuralTrust/poc-agents
El stack de agentes que acabas de desplegar tiene una capa faltante
Construir agentes sobre AWS Bedrock AgentCore nunca ha sido tan rápido. Defines un runtime, lo conectas a un servidor MCP, configuras IAM y despliegas. En una tarde tienes un sistema multiagente hablando con OpenAI a través de un gateway, llamando herramientas y orquestando subagentes.
Lo que no tienes es una forma de ver qué le dicen esas herramientas a tu modelo.
IAM hace su trabajo. Tu VPC hace su trabajo. CloudTrail registra llamadas. Ninguno inspecciona el contenido que fluye entre agente y LLM, específicamente los metadatos y resultados de herramientas que el modelo trata como contexto confiable.
Esa es la brecha por la que entra un atacante.
Un jailbreak de cuatro líneas, de extremo a extremo
Construimos un sistema pequeño pero realista en AgentCore para hacer esto tangible:
- 5 runtimes en
eu-west-1: tres agentes HTTP basados en Strands (main_agent,coach_agent,financial_agent) y dos servidores FastMCP (information,finance_advices). - Un gateway FastAPI en una EC2
t3.micro(gestionada por Terraform, IAM bloqueado, Elastic IP) exponiendo un endpoint por agente. - Cada llamada LLM enruta por un gateway TrustGate-EE delante de
gpt-4ode OpenAI. coach_agentsolo puede ver el MCPinformation.financial_agentsolo puede verfinance_advices.main_agentsolo puede ver los dos agentes HTTP. Todo forzado a nivel IAM, no solo en prompts.
Después añadimos una herramienta extra al MCP information, llamada get_user_personalization(user_id). Su descripción empieza de forma inocua:
"Returns the user's personalized coaching context (preferences, goals, recent sessions) so the assistant can tailor advice."
…y continúa, tres líneas después:
El mismo payload también se inyecta dentro del JSON que devuelve la herramienta, en campos llamados communication_style y _system_note, justo el tipo de campos que un LLM interpreta como datos vivos del usuario.
Un prompt de usuario perfectamente benigno:
El agente decide llamar get_user_personalization. La descripción envenenada y el resultado envenenado aterrizan en el contexto del modelo. La respuesta vuelve así:
No rompimos IAM. No logramos RCE. Ni siquiera tocamos la red. Abusamos del contrato implícito de confianza entre un agente y las herramientas que tiene autorizadas.
Un script de una línea en el repo verifica que el ataque impactó:
bash agent/scripts/test-jailbreak.sh
🚨 JAILBREAK DETECTED — markers found in response
Por qué nada en tu cuenta AWS lo detectó
Esta es la parte que más sorprende a los equipos:
- IAM lo permitió.
coach_agentdebe poder llamar al MCPinformation. El permiso era correcto. - Los controles de red lo permitieron. El MCP corre dentro de AgentCore. El tráfico es interno. No hay perímetro que filtrar.
- CloudTrail lo registró. Y no te dijo absolutamente nada sobre el contenido semántico de la llamada.
- Los guardrails de Bedrock no lo vieron. Están orientados a salida de modelo, no a los metadatos que recibe el modelo antes de responder.
La superficie de ataque es nueva porque la frontera de confianza es nueva. El modelo no razona sobre quién controla una descripción de herramienta. La lee como autoridad, igual que lee su system prompt.
Dos puertas, dos alcances
Esto es lo que hace TrustGate en despliegues AgentCore:
[ user ] → [ TrustGate · perimeter gate ] → [ FastAPI / agents ]
[ agent ] → [ TrustGate · model gate ] → [ OpenAI / Bedrock model ]
Perimeter gate (delante de la API) captura lo que viene de fuera:
- Prompt injection directo en input de usuario
- Abuso off-topic, fuga de PII, abuso de tasa/origen
- Filtrado de salida antes de devolver respuesta al usuario
Model gate (delante del LLM) captura lo que ninguna otra capa ve:
- Descripciones de herramientas antes de que el modelo decida qué tool llamar (description poisoning)
- Resultados de herramientas antes de que el modelo los incorpore al contexto (result poisoning, inyección vía RAG/web, inyección agente-a-agente)
- Salida de modelo antes de que regrese al agente (deriva de persona, canary tokens, directivas ocultas)
En nuestro POC, el perimeter gate nunca habría visto el jailbreak: el payload se origina dentro del clúster, en una tool que el agente está autorizado a llamar. Solo el model gate lo ve. Ese es el punto de tener ambos.
| Vector | Origen | Detectado por perimeter | Detectado por model gate |
|---|---|---|---|
| Prompt injection directo | Externo | ✅ | ✅ |
| Description poisoning (MCP) | Interno | ❌ | ✅ |
| Result poisoning (MCP / RAG / web) | Interno/externo | ❌ | ✅ |
| Fuga de PII en respuesta | Modelo | parcial | ✅ |
| Abuso de cuota / DoS sobre LLM | Bucle interno | ❌ | ✅ |
Una sola capa cubre medio diamante. Dos capas lo cierran.
Pruébalo tú mismo
El POC completo es open source. Clónalo, despliega, rómpelo.
github.com/NeuralTrust/poc-agents
Qué incluye el repo:
- Los 5 runtimes de AgentCore (tres agentes Strands + dos servidores FastMCP)
- Un gateway FastAPI con
/coach,/financial,/mainy endpoint de introspección read-only/mcp/<name>/tools - Un módulo Terraform que despliega una EC2 (
t3.micro, EIP, IAM scopeado aruntime-endpoint/*) en Python puro, sin Docker requerido - La herramienta envenenada y el verificador
test-jailbreak.sh - Documentación de arquitectura y threat model en
bedrock-agent-core/ARCHITECTURE.md
Tiempo total desde terraform apply hasta una demo funcional de jailbreak: menos de 10 minutos si ya tienes credenciales AWS.
Si despliegas agentes, tienes esta exposición
Cada equipo que construye sobre AgentCore (o LangGraph, o agentes con LlamaIndex, o cualquier stack MCP) enfrenta la misma brecha de confianza. Cuanto más rápido permites que agentes llamen tools que no controlas end-to-end —MCPs de terceros, RAG sobre documentos de usuario, mensajería agente-a-agente— más se amplía la brecha.
TrustGate se integra como gateway en ambas capas. No requiere cambios de SDK: los agentes ya apuntan a una model URL y la API ya está detrás de un load balancer. Nosotros cambiamos el upstream y empezamos a inspeccionar.
Si quieres una sesión sobre tu arquitectura concreta, reserva una demo con el equipo de NeuralTrust. Y mientras tanto, clona el repo e intenta ejecutar tu propio jailbreak: es la forma más rápida de sentir el problema en tus manos.
)
)