Cuando el agente ejecuta su propio código: el CodeAgent de PraisonAI convierte la inyección de prompt en RCE
Divulgada el 11 de julio de 2026, una falla de severidad máxima en PraisonAI ejecuta Python generado por el LLM sin validación de AST, sin restricción de imports ni sandbox — un prompt bien diseñado se convierte en código arbitrario en el host.
¿Qué es esto?
El 11 de julio de 2026 se publicó una falla de ejecución remota de código de severidad máxima contra PraisonAI, un popular framework open source de orquestación multiagente. La vulnerabilidad reside en el componente CodeAgent, diseñado para permitir que un LLM escriba Python y luego lo ejecute. En todas las versiones anteriores a la 1.6.78, ese código se ejecutaba sin ningún control: sin inspección del árbol sintáctico, sin restricciones sobre qué módulos se podían importar y sin sandbox que contuviera el proceso. Calificada con 10.0 (crítica) en CVSS 4.0 y clasificada como inyección de código (CWE-94), es el tipo de hallazgo que convierte un prompt corriente en una shell sobre el host.
También es un ejemplo de manual de una clase de fallas a la que volvemos con frecuencia: en cuanto un framework de agentes puede ejecutar lo que el modelo genera, la inyección de prompt deja de ser un problema de contenido para convertirse en un problema de ejecución de código. Esta es una lectura defensiva de un problema divulgado públicamente y ya corregido — no una guía de explotación.
Cómo funciona
El diseño de CodeAgent es simple, y ahí está precisamente el problema. Se le entrega una tarea al agente, el LLM produce un fragmento de Python que cree que la resolverá, y el framework ejecuta ese fragmento para obtener un resultado. La parte peligrosa es el paso de ejecución, en la rutina _execute_python().
Tarea / prompt ──▶ El LLM genera Python ──▶ _execute_python() ──▶ se ejecuta en el host
(el atacante puede orientar │
este contenido) └── sin validación de AST
└── sin lista blanca de imports
└── sin sandbox / aislamiento
Como la cadena generada se pasa sin modificar a un intérprete activo, todo lo que se pueda inducir al modelo a escribir, el host lo ejecutará — con los privilegios del proceso de PraisonAI. Y el atacante no necesita acceder directamente al intérprete. La orientación ocurre un nivel más arriba, en el prompt: cualquier texto no confiable que el agente ingiera (un documento recuperado, el resultado de una herramienta, una página web, un mensaje de usuario) puede empujar al modelo a producir Python que lea variables de entorno, abra una conexión de red o toque el sistema de archivos. La divulgación describe el impacto concreto como la exfiltración de todos los secretos del entorno y la ejecución de comandos arbitrarios en el host.
El vector de severidad cuenta el resto: alcanzable por red, baja complejidad, sin privilegios ni interacción del usuario (AV:N/AC:L/PR:N/UI:N), con alto impacto en confidencialidad, integridad y disponibilidad. Ningún proof-of-concept público acompañó al advisory, y la falla no se reportó como explotada en la naturaleza al momento de la publicación (EPSS de alrededor del 0,5 %). La fecha de reserva fue el 9 de julio de 2026; la publicación siguió el 11 de julio de 2026.
Por qué importa
El instinto sería archivar esto como «una RCE más en un framework más». Eso subestima el asunto. Los componentes tipo CodeAgent — un LLM que escribe código y un runtime que lo ejecuta — son ya una pieza estándar en todo el ecosistema de agentes, vendida como la función que permite a los agentes «hacer trabajo real». Cada uno de esos componentes hereda la misma exposición estructural: el ejecutor confía en el modelo, y el modelo confía en su entrada. Rompa la entrada y romperá el host.
Dos propiedades lo hacen peor que un bug de inyección clásico. Primero, la superficie de ataque es semántica, no sintáctica. No hay una única cadena maliciosa que poner en lista negra; el atacante solo tiene que lograr que el modelo produzca Python peligroso pero válido, y hay infinitas maneras de formular esa petición. Segundo, los agentes están cada vez más conectados a contenido no confiable por diseño — corpus de recuperación, salidas de herramientas, páginas scrapeadas — de modo que el «prompt» que llega al modelo rara vez lo escribe un humano de confianza. Es la condición de la tríada letal (datos privados, contenido no confiable, ejecución de código/salida de red) colapsada en un único proceso.
Para cualquiera que ejecute PraisonAI, lo que está en juego es inmediato: una instancia autoalojada expuesta a la red, o alimentada con documentos fuera del límite de confianza, debe tratarse como ejecutable de forma remota hasta que se actualice. Para el resto, es una invitación a auditar si algún agente de su stack ejecuta código escrito por el modelo, y bajo qué confinamiento.
Defensas
El parche del proveedor es el primer paso; el resto es una arquitectura que aguante incluso cuando llegue la próxima función con forma de CodeAgent.
- Actualice a PraisonAI 1.6.78 o posterior. Es la remediación documentada para esta falla. Fije la versión en su manifiesto de dependencias y reconstruya cualquier imagen de contenedor que incluya una versión anterior.
- Nunca ejecute código generado por el modelo en el host. Si un agente debe ejecutar código, hágalo en un sandbox desechable y sin red — contenedor bloqueado, gVisor/microVM, o un servicio de intérprete dedicado — con raíz de solo lectura, sin secretos montados y salida de red denegada por defecto. El radio de impacto de una inyección de código lo define dónde se ejecuta el código, no cómo se generó.
- No coloque secretos en el entorno de ejecución. Las variables de entorno son lo primero que se exfiltra en esta clase de bugs. Inyecte las credenciales en el último momento a través de un broker que el sandbox no pueda alcanzar, para que un intérprete comprometido no tenga nada que robar.
- Limite lo que el intérprete puede siquiera expresar. Donde controle el ejecutor, aplique una lista blanca de AST y de imports antes de ejecutar nada, y rechace el código que recurra a
os,subprocess,socket, al import dinámico o a la reflexión. Es una mitigación, no un muro — trátela como defensa en profundidad detrás del sandbox, no en su lugar. - Trate toda entrada no humana como hostil. Documentos recuperados, respuestas de herramientas y páginas scrapeadas son controlables por el atacante. Etiquete su procedencia y prohíba que el contenido que llega por esos canales influya en un paso de ejecución de código. Registre el código exacto que el agente ejecuta y alerte sobre llamadas de red o al sistema de archivos.
- Inventaríe sus agentes. Pregúntese, para cada framework de agentes que despliegue: ¿ejecuta código escrito por el modelo, comandos de shell o SQL? Si es así, ¿dónde ocurre esa ejecución, qué puede alcanzar y cuál es su identidad? PraisonAI no es un caso aislado — es el modo de falla recurrente de la inyección de prompt hacia RCE en frameworks de agentes.
Status
| Elemento | Referencia | Fecha | Notas |
|---|---|---|---|
| CVE reservada | VulnCheck (CNA) | 2026-07-09 | Asignada a la falla de ejecución de código del CodeAgent de PraisonAI |
| Advisory publicado | NVD / GitHub Security Advisory GHSA-2xv2-w8cq-5gxw | 2026-07-11 | Puntuación base CVSS 4.0 de 10.0, CWE-94 |
| Versiones afectadas | Advisory de GitHub | — | PraisonAI (praisonaiagents) anterior a 1.6.78 |
| Versión corregida | Advisory de GitHub | 2026-07 | 1.6.78 y posteriores |
| Explotada en la naturaleza | OffSeq / NVD | 2026-07-11 | No observada en la publicación; EPSS ≈ 0,5 % |
| CVE de referencia | NVD | 2026-07-11 | CVE-2026-61447 |
La lección no trata de un framework en particular. Cada vez que deja que un modelo de lenguaje escriba código y luego lo ejecute, ha hecho pasar la inyección de prompt de «el modelo dijo algo malo» a «el modelo hizo algo malo». La defensa duradera consiste en asumir que la inyección tendrá éxito y asegurarse de que el código que produzca se ejecute en un lugar donde no pueda dañarle.