
Ejecución Remota de Código (RCE) en el Sistema de Control de Misiones Yamcs mediante Inyección de Sentencias Java en Identificadores de Comillas Dobles de Yarch SQL
Prueba de concepto no armada y documentación técnica para CVE-2026-55511, una vulnerabilidad autenticada de inyección de código Java en el compilador de expresiones agregadas StreamSQL de Yamcs.
| Campo | Valor |
|---|---|
| Producto | Yamcs (org.yamcs:yamcs-core) |
| Aviso | GHSA-3g44-3m7x-cgg2 |
| Debilidad | CWE-94: Control Inadecuado de la Generación de Código |
| Gravedad | Crítica, CVSS 3.1: 9.1 |
| Vector | CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Privilegio requerido | SystemPrivilege.ControlArchiving |
| Versiones corregidas | Yamcs 5.13.2 y 5.12.8 |
| Parche principal | b65a3d78178ba99a58b753feda6ecc3b5a694f13 |
Yamcs acepta nombres entre comillas dobles para objetos StreamSQL y, en versiones afectadas, permite casi cualquier carácter dentro de esos nombres. Las expresiones agregadas como sum(...) construyen dinámicamente código fuente Java utilizando nombres de columna y compilan ese código fuente con Janino SimpleCompiler.
El código vulnerable aplica una desinfección de nombres mínima antes de colocar un nombre de columna en un identificador Java generado. Por lo tanto, un usuario autenticado con ControlArchiving puede crear un nombre de columna entre comillas dobles manipulado, llegar al compilador de agregados a través de POST /api/archive/{instance}:executeSql y ejecutar Java influenciado por el atacante dentro de la JVM del servidor Yamcs.
Esto cruza el límite de autorización previsto de Yamcs: ControlArchiving permite la gestión de archivos, tablas y streams, pero no concede intencionalmente la ejecución arbitraria de Java en el servidor.
| Línea de versión | Afectada | Corregida |
|---|---|---|
| 5.13.x | 5.13.1 y anteriores | 5.13.2 |
| 5.12.x | 5.12.7 y anteriores | 5.12.8 |
Actualice a Yamcs 5.13.2, 5.12.8, o a una versión posterior compatible.
El flujo de datos vulnerable es:
POST /api/archive/{instance}:executeSql
-> TableApi.executeSql
-> Yarch StreamSQL parser
-> nombre de objeto entre comillas dobles
-> SelectExpression aggregate binding
-> SumExpression.aggregateFillCode_newData
-> Expression.fillCode_InputDefVars
-> CompilableAggregateExpression.getCompiledAggregate
-> Janino SimpleCompiler.cook
-> Java influenciado por el atacante se ejecuta en la JVM de Yamcs
Tres condiciones se combinan para crear el problema:
S_DOUBLE_QUOTED_IDENTIFIER acepta cualquier carácter excepto CR, LF y ".Expression.fillCode_InputDefVars deriva un nombre de variable Java del nombre de columna. Su ayudante sanitizeName reemplaza solo / y -.Esto deja caracteres de sintaxis Java como punto y coma, espacios en blanco, paréntesis, operadores de asignación y puntos disponibles en el método newData(Tuple) generado. A diferencia de una ruta de expresión simple, el método agregado proporciona un contexto de sentencia alcanzable en el que las sentencias inyectadas pueden compilarse y ejecutarse.
La explotación requiere una cuenta autenticada que posea SystemPrivilege.ControlArchiving. Una cuenta sin ese privilegio es rechazada por la comprobación de autorización de TableApi.executeSql.
La explotación exitosa ejecuta Java con los privilegios del proceso de servicio de Yamcs. Dependiendo del aislamiento del despliegue, esto puede afectar la confidencialidad, integridad y disponibilidad de los datos de la misión y del entorno del host. El problema no es un RCE no autenticado y por sí mismo no eleva el proceso de Yamcs más allá de sus permisos de sistema operativo o contenedor.
El poc.py incluido está intencionalmente no armado:
javac y java) para la prueba del marcador benignocd /ruta/a/yamcs
python3 /ruta/a/poc.py \
--json /tmp/evidence.json \
--log /tmp/crash_evidence.log \
--expect-crash
Indicadores esperados:
source_chain_confirmed=true
generated_source_injection_present=true
marker_executed=true
evidence/evidence.json: resultados estructurados de la cadena fuente y del modelo Javaevidence/crash_evidence.log: registro de validación concisoLa evidencia incluida se produjo contra el commit del código fuente de Yamcs 98a05e95461207c143e4297ec4bb1b5a76e9cb19. Confirma la cadena fuente vulnerable, la inyección en el código fuente generado y la ejecución del marcador benigno.
La corrección oficial se titula «Avoid RCE through double-quoted identifiers» (Evitar RCE a través de identificadores entre comillas dobles):
b65a3d78178ba99a58b753feda6ecc3b5a694f13, publicado en 5.13.28c1070b12c0a6c003903325cb2a1013347e2dbde, publicado en 5.12.8El cambio principal restringe los identificadores entre comillas dobles de un conjunto de caracteres casi sin restricciones:
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" >
a una lista permitida de letras, dígitos, $, _, # y .:
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (<LETTER> | <DIGIT> | <SPECIAL_CHARS>)+ "\"" >
Esto rechaza los caracteres separadores de sentencias y constructores de expresiones requeridos por la inyección reportada antes de que el nombre llegue a la generación de código Java. El parche también actualiza los archivos de parser generados, la documentación y una prueba relacionada.
La restricción puede afectar nombres de objetos existentes entre comillas que contengan espacios o puntuación no permitida. Revise los esquemas y la automatización de StreamSQL antes de actualizar o retroportar.
CVE-2026-55511 es un punto de entrada diferente de CVE-2026-44632 / GHSA-524g-x36v-9wm6. CVE-2026-44632 afecta a JavaExprAlgorithmExecutionFactory, se alcanza a través de la funcionalidad de sobrescritura de algoritmos de la base de datos de misión y está controlado por ChangeMissionDatabase.
Este problema está en org.yamcs.yarch.streamsql, se alcanza a través de executeSql y está controlado por ControlArchiving. La corrección anterior de la ruta de algoritmo 5.13.0 / 5.12.7 no modificó el compilador StreamSQL ni su manejo de identificadores entre comillas.
VULNERABILITY_REPORT.md: informe ampliado de vulnerabilidadPATCH_ANALYSIS.md: análisis detallado del parche oficial y notas de compatibilidadUtilice este material únicamente en sistemas de su propiedad o que esté explícitamente autorizado a probar.