La herramienta shell de MS-Agent: una denylist regex convierte la inyección de prompt en RCE
CVE-2026-2256 permite que contenido malicioso induzca a MS-Agent (ModelScope) a ejecutar comandos del sistema. La causa raíz es un antipatrón conocido: proteger una herramienta shell con una denylist regex en lugar de una allowlist.
¿Qué es esto?
CVE-2026-2256 es una falla de inyección de comandos en MS-Agent de ModelScope, un framework de código abierto para construir agentes de IA con herramientas. Se divulgó mediante la nota de vulnerabilidad de CERT/CC VU#431821, publicada el 2 de marzo de 2026, y fue reportada por el investigador Itamar Yochpaz. ModelScope fue notificado el 15 de enero de 2026; según CERT/CC, no se obtuvo ninguna declaración ni parche del proveedor durante la coordinación. SentinelOne sitúa el rango afectado en v1.6.0rc1 y anteriores y clasifica el problema como CWE-77 (inyección de comandos).
Lo interesante no es que un framework de agentes tenga un RCE. Es cómo se alcanza el fallo: no porque un operador escriba un comando malicioso, sino porque contenido no confiable —un documento, un repositorio de código, un log, una entrada de investigación— induce al agente a ejecutar uno. Es una inyección de prompt indirecta que termina en un shell real.
Cómo funciona
MS-Agent incluye una herramienta Shell que permite a un agente ejecutar comandos del sistema operativo para completar tareas. La herramienta intenta ser segura: un método check_safe() filtra comandos peligrosos. El problema es cómo filtra: con una denylist basada en expresiones regulares.
Las denylists para entradas de shell son un callejón sin salida bien conocido. Hay demasiadas formas de expresar el mismo efecto: codificación, ofuscación de comandos, sintaxis de shell alternativa, intérpretes de confianza y la propia semántica de parsing del shell ofrecen rutas que el patrón nunca anticipó. La nota de CERT/CC es contundente: «El filtrado basado en denylist es intrínsecamente frágil y a menudo puede eludirse mediante codificación, ofuscación de comandos o sintaxis de shell alternativa.»
La cadena de ataque es:
contenido no confiable (doc / repo / log / resultado web)
│ contiene texto que orienta al agente…
▼
el agente decide usar la herramienta Shell
│ construye una cadena de comando con texto bajo influencia del atacante
▼
denylist regex check_safe() ──► [ELUDIDA]
│
▼
el shell ejecuta la cadena con los privilegios del proceso del agente
No se reproduce ningún payload aquí. Lo que importa es la forma: el propio agente ensambla y envía el comando como parte de su flujo de ejecución normal, por lo que no hay «mal uso del operador» al que señalar. El filtro ve una cadena que juzgó benigna; el shell ve lógica ejecutable.
Por qué importa
Una vez eludida la denylist, el atacante ejecuta comandos con los privilegios del proceso MS-Agent. CERT/CC y el reporte describen el radio de impacto realista: lectura de secretos como claves de API, tokens y archivos de configuración; colocación de payloads; modificación del estado del workspace; establecimiento de persistencia; pivote hacia servicios internos; y envenenamiento de salidas de build o informes consumidos aguas abajo.
Una observación sobre la puntuación: SentinelOne indica un CVSS de 6,5 (medio), con impacto bajo en confidencialidad e integridad en el vector. Tómelo como un piso, no un techo. Las métricas base de CVSS no capturan el contexto agéntico —un agente que ingiere contenido externo y mantiene credenciales es exactamente el montaje de la «tríada letal» (datos privados + entrada no confiable + capacidad de actuar)—, y allí el resultado práctico escala hacia el compromiso del host. La calificación «medio» refleja una visión técnica estrecha; la realidad de despliegue es más grave.
La lección más amplia trasciende a MS-Agent. Cualquier agente que exponga una herramienta de shell, de ejecución de código o de archivos, e intente hacerla segura bloqueando cadenas conocidas como malas, repite este error. Los límites de las llamadas a herramientas son un problema de autorización, no de coincidencia de patrones.
Defensas
- Reemplace las denylists por allowlists. No intente enumerar comandos peligrosos. Enumere el pequeño conjunto de operaciones permitidas y rechace todo lo demás. Es el único cambio que corrige la clase de fallo, no solo una elusión.
- Evite
shell=True. Cuando una herramienta shell sea inevitable, ejecute vectores de argumentos directamente (sin interpretación del shell) para que la semántica de parsing no pueda convertirse en inyección. Nunca concatene texto derivado del modelo o del contenido en una cadena de shell. - Aísle la herramienta y aplique mínimo privilegio. Ejecute los agentes con capacidad de shell en un contenedor con capacidades retiradas, sistema de archivos de solo lectura, no-new-privileges y un perfil MAC (AppArmor/SELinux). Si el proceso no puede leer sus secretos, una elusión no puede exfiltrarlos.
- Trate todo el contenido ingerido como no confiable. Documentos, repositorios, logs y resultados web están controlados por el atacante por defecto. Ejecute MS-Agent solo sobre contenido que confíe, valide o sanee, exactamente lo que recomienda el aviso de CERT/CC.
- Rompa la tríada letal. No reúna el acceso a datos privados, la entrada no confiable y una herramienta capaz de actuar en un solo agente sin supervisión. Separe privilegios, o condicione las llamadas a herramientas a una validación humana o de política.
- Monitoree la elusión. Registre las cadenas de comando que envía el agente y alerte sobre metacaracteres de shell (
;,|,&&,$(), comillas invertidas), procesos hijo inesperados generados por el agente y llamadas tipoexecve()con argumentos sospechosos.
Estado
| Elemento | Referencia | Fecha | Notas |
|---|---|---|---|
| CVE-2026-2256 | VU#431821 | 2026-03-02 | Inyección de comandos en la herramienta Shell de MS-Agent mediante elusión de la denylist check_safe() |
| Versiones afectadas | SentinelOne | 2026-03 | ModelScope ms-agent v1.6.0rc1 y anteriores; CWE-77; CVSS 6,5 (medio) |
| Respuesta del proveedor | VU#431821 | 2026-03-02 | Notificado el 2026-01-15; no se obtuvo declaración ni parche durante la coordinación |
La conclusión para los desarrolladores: una herramienta shell protegida por una denylist regex no está protegida. Si su agente puede ejecutar comandos, el límite que realmente controla son los privilegios del proceso y la confiabilidad de lo que lee: diseñe esos elementos, y asuma que el filtro de cadenas fallará.