CVE-2026-55511 的非武器化概念验证和技术文档,该漏洞是 Yamcs StreamSQL 聚合表达式编译器中一个经过身份验证的 Java 代码注入漏洞。
| 字段 | 值 |
|---|---|
| 产品 | Yamcs (org.yamcs:yamcs-core) |
| 安全公告 | GHSA-3g44-3m7x-cgg2 |
| 弱点 | CWE-94: 代码生成控制不当 |
| 严重性 | 严重,CVSS 3.1: 9.1 |
| 向量 | CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| 所需权限 | SystemPrivilege.ControlArchiving |
| 修复版本 | Yamcs 5.13.2 和 5.12.8 |
| 主线补丁 | b65a3d78178ba99a58b753feda6ecc3b5a694f13 |
Yamcs 接受 StreamSQL 对象的双引号名称,在受影响版本中,允许这些名称中包含几乎任何字符。聚合表达式(如 sum(...))使用列名动态构建 Java 源码,并使用 Janino SimpleCompiler 编译该源码。
存在漏洞的代码在将列名放入生成的 Java 标识符之前,仅应用了极少的名称消毒处理。因此,拥有 ControlArchiving 权限的认证用户可以创建特制的带引号的列名,通过 POST /api/archive/{instance}:executeSql 到达聚合编译器,并在 Yamcs 服务器 JVM 内执行受攻击者影响的 Java 代码。
这跨越了 Yamcs 预期的授权边界:ControlArchiving 允许归档、表和流管理,但并非有意授予在服务器上执行任意 Java 的权限。
| 发行线 | 受影响 | 已修复 |
|---|---|---|
| 5.13.x | 5.13.1 及更早版本 | 5.13.2 |
| 5.12.x | 5.12.7 及更早版本 | 5.12.8 |
请升级到 Yamcs 5.13.2、5.12.8 或更高版本的受支持发行版。
有漏洞的数据流如下:
POST /api/archive/{instance}:executeSql
-> TableApi.executeSql
-> Yarch StreamSQL parser
-> double-quoted object name
-> SelectExpression aggregate binding
-> SumExpression.aggregateFillCode_newData
-> Expression.fillCode_InputDefVars
-> CompilableAggregateExpression.getCompiledAggregate
-> Janino SimpleCompiler.cook
-> attacker-influenced Java executes in the Yamcs JVM
三个条件共同导致了该问题:
S_DOUBLE_QUOTED_IDENTIFIER 语法接受除 CR、LF 和 " 之外的任何字符。Expression.fillCode_InputDefVars 从列名推导出 Java 变量名。其 sanitizeName 辅助方法仅替换 / 和 -。这导致在生成的 newData(Tuple) 方法中,可以使用分号、空格、括号、赋值运算符和点等 Java 语法字符。与裸表达式路径不同,聚合方法提供了可到达的语句上下文,注入的语句可以在其中编译和执行。
利用需要拥有 SystemPrivilege.ControlArchiving 的认证账户。没有该权限的账户会被 TableApi.executeSql 授权检查拒绝。
成功利用将以 Yamcs 服务进程的权限运行 Java。根据部署隔离情况,这可能会影响任务数据和主机环境的机密性、完整性和可用性。该问题不是未认证的远程代码执行,并且本身不会将 Yamcs 进程提升到其操作系统或容器权限之外。
附带的 poc.py 故意非武器化:
javac 和 java)用于良性标记测试cd /path/to/yamcs
python3 /path/to/poc.py \
--json /tmp/evidence.json \
--log /tmp/crash_evidence.log \
--expect-crash
预期指标:
source_chain_confirmed=true
generated_source_injection_present=true
marker_executed=true
evidence/evidence.json:结构化的源链和 Java 模型结果evidence/crash_evidence.log:简洁的验证日志附带的证据是针对 Yamcs 源码提交 98a05e95461207c143e4297ec4bb1b5a76e9cb19 生成的。它确认了有漏洞的源链、生成的源码注入和良性标记的执行。
上游修复的名称为 Avoid RCE through double-quoted identifiers:
b65a3d78178ba99a58b753feda6ecc3b5a694f13,发布于 5.13.28c1070b12c0a6c003903325cb2a1013347e2dbde,发布于 5.12.8核心更改将双引号标识符从几乎不受限制的字符集限制为:
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" >
变为允许列表:字母、数字、$、_、# 和 .:
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (<LETTER> | <DIGIT> | <SPECIAL_CHARS>)+ "\"" >
这会在名称到达 Java 代码生成之前,拒绝报告注入所需的语句分隔和表达式构建字符。该补丁还更新了生成的解析器文件、文档和相关测试。
该限制可能会影响包含空格或不在允许列表中的标点符号的现有带引号的对象名称。在升级或向后移植之前,请检查 StreamSQL 模式和自动化。
CVE-2026-55511 是不同于 CVE-2026-44632 / GHSA-524g-x36v-9wm6 的独立入口点。CVE-2026-44632 涉及 JavaExprAlgorithmExecutionFactory,通过任务数据库算法覆盖功能到达,并由 ChangeMissionDatabase 控制。
此问题位于 org.yamcs.yarch.streamsql 中,通过 executeSql 到达,并由 ControlArchiving 控制。先前的 5.13.0 / 5.12.7 算法路径修复没有修改 StreamSQL 编译器或其带引号标识符处理。
VULNERABILITY_REPORT.md:扩展漏洞报告PATCH_ANALYSIS.md:详细的上游补丁分析和兼容性说明仅在你拥有或明确授权测试的系统上使用此材料。