Cuando los prompts se vuelven shells: de la inyección al RCE en frameworks de agentes
Dos CVE en Microsoft Semantic Kernel y cuatro en CrewAI — todos divulgados a comienzos de 2026 — convierten un único prompt inyectado en ejecución remota de código sobre el host. El patrón es estructural, no accidental.
¿De qué se trata?
A lo largo de la primera mitad de 2026, varios frameworks de agentes han publicado vulnerabilidades en las que un único prompt — entregado directamente o mediante inyección indirecta — se convierte en un RCE funcional sobre el equipo que ejecuta el agente. El 7 de mayo de 2026, el equipo Microsoft Defender Security Research publicó un análisis detallado de dos de estos fallos en Microsoft Semantic Kernel (CVE-2026-25592 y CVE-2026-26030). Seis semanas antes, el 30 de marzo de 2026, el CERT/CC publicó VU#221883 describiendo cuatro CVE en CrewAI (CVE-2026-2275, 2285, 2286, 2287) que encadenan una inyección de prompt en lectura arbitraria de archivos, SSRF y ejecución remota de código.
Los frameworks difieren, pero la clase de bug subyacente es la misma. Este artículo trata sobre esa clase.
Cómo funciona
El patrón es consistente entre divulgaciones. El LLM hace exactamente aquello para lo que fue entrenado: convertir una instrucción en lenguaje natural en una llamada estructurada a una herramienta. La vulnerabilidad vive una capa más abajo, en el código de pegamento entre la salida del modelo y el runtime que ejecuta la herramienta.
En el In-Memory Vector Store de Semantic Kernel (CVE-2026-26030), el filtro de búsqueda era una lambda Python ensamblada por interpolación de cadenas y pasada a eval(). Una blocklist intentaba atrapar llamadas obvias (eval, exec, open, __import__) pero no cubría el acceso por atributos a través de la jerarquía de tipos de Python. Un argumento controlado por el modelo podía cerrar la cadena, atravesar ().__class__.__bases__[0].__subclasses__(), localizar BuiltinImporter y ejecutar os.system("calc.exe").
# Patrón vulnerable, simplificado
new_filter = f"lambda x: x.city == '{kwargs[param.name]}'"
# kwargs[param.name] lo controla el modelo y solo lo filtra
# una blocklist AST de Python que no cubre la traversía de atributos.
eval(new_filter, {"__builtins__": {}}) # sigue accesible vía tuple().__class__...
El segundo fallo de Semantic Kernel (CVE-2026-25592) es más simple: DownloadFileAsync en el plugin sandbox .NET había sido decorado por error con [KernelFunction], exponiendo al modelo una primitiva File.WriteAllBytes sin restricciones. Se podía inducir al modelo a escribir un payload en la carpeta de Inicio de Windows, evadiendo la sandbox por diseño.
En CrewAI, el Code Interpreter Tool debería ejecutar Python no confiable dentro de un contenedor Docker. Cuando Docker no está disponible, la herramienta cae silenciosamente a una sandbox Python in-process, donde el módulo ctypes no está en la blocklist — y por tanto llamadas C arbitrarias reabren un RCE sobre el host (CVE-2026-2275, CVE-2026-2287). Otros dos CVE de la misma divulgación cubren un SSRF en la herramienta de búsqueda RAG (CVE-2026-2286) y lectura arbitraria de archivos locales en el JSON loader (CVE-2026-2285), aportando a un atacante primitivas suficientes para encadenar hacia robo de credenciales.
En términos MITRE ATLAS, la técnica es AML.T0051 (LLM Prompt Injection) cascadeando hacia AML.T0016 (Obtain Capabilities).
Por qué importa
El modelo ya no solo genera texto: elige herramientas, suministra sus argumentos y dispara sus efectos colaterales en el host. Cualquier parámetro que el modelo pueda influir debe tratarse como controlado por el atacante, exactamente igual que un parámetro de query string en seguridad web clásica.
No se trata de 0-day exóticos. Semantic Kernel tiene más de 27.000 estrellas en GitHub y se embarca en las integraciones de Microsoft 365 Copilot. CrewAI se usa ampliamente en demos multi-agente y pilotos productivos. Los caminos de código vulnerables son las configuraciones por defecto, y la inyección indirecta (documentos RAG envenenados, páginas web hostiles navegadas por el agente, respuestas de herramientas maliciosas) basta para disparar el ataque — sin necesidad de acceso privilegiado al chat del usuario.
Defensas
El equipo de Microsoft formula la lección central con claridad: su LLM no es una frontera de seguridad. Las herramientas que expone definen la superficie de ataque. En concreto:
- Parchee primero. Actualice
semantic-kernela ≥ 1.39.4 (Python) y ≥ 1.71.0 (.NET). Para CrewAI, desactiveallow_code_execution=True, retire el Code Interpreter Tool donde sea posible y verifique que Docker está realmente activo — no permita el fallback silencioso a la sandbox in-process. - Trate los parámetros de herramientas como entradas no confiables. Nunca pase una cadena suministrada por el modelo a
eval,exec, SQL dinámico, shell,File.WriteAllByteso cualquier sink equivalente. Use APIs parametrizadas o allowlists estrictas; las blocklists en lenguajes dinámicos fallan por construcción. - Audite el registro de herramientas. Cada función expuesta al modelo forma parte de la superficie de ataque. Retire decoradores (
[KernelFunction],@tool) de todo lo que no necesite ser invocable por el modelo. - Defensa en profundidad en el host. Detección endpoint sobre el proceso del agente: alertas sobre lanzamiento de shells, escritura en carpetas de inicio, conexiones salientes desde el runtime. El post de Microsoft publica consultas KQL útiles para Defender XDR.
- Investigue la ventana vulnerable. Si una versión afectada estuvo en producción, el parche cierra el fallo pero no aclara si ya fue explotado. Defina la ventana entre despliegue y actualización, y busque telemetría post-explotación dentro de ella.
Estado
| Framework | CVE | Divulgación | Parchado en |
|---|---|---|---|
| Semantic Kernel (Python) | CVE-2026-26030 | 2026-05-07 | 1.39.4 |
| Semantic Kernel (.NET) | CVE-2026-25592 | 2026-05-07 | 1.71.0 |
| CrewAI Code Interpreter | CVE-2026-2275 | 2026-03-30 | parcial — ctypes añadido a la blocklist en próxima release |
| CrewAI fallback Docker | CVE-2026-2287 | 2026-03-30 | parcial — opción fail-closed en evaluación |
| CrewAI JSON loader | CVE-2026-2285 | 2026-03-30 | sin parche completo al cierre de este texto |
| CrewAI RAG search SSRF | CVE-2026-2286 | 2026-03-30 | sin parche completo al cierre de este texto |
El equipo de Microsoft ha anunciado una serie de investigación continua; cabe esperar hallazgos similares en otros frameworks en las próximas semanas. Las vulnerabilidades de CrewAI fueron reportadas por Yarden Porat (Cyata); las de Semantic Kernel por Uri Oren, Amit Eliahu y Dor Edry (Microsoft Defender Security Research Team).