
Execução Remota de Código (RCE) no Yamcs Mission Control System via Java Statement Injection em Identificadores com Aspas Duplas do Yarch SQLExecução Remota de Código (RCE) no Yamcs Mission Control System via Java Statement Injection em Identificadores com Aspas Duplas do Yarch SQL
Prova de conceito não-armamentizada e documentação técnica para CVE-2026-55511, uma vulnerabilidade de injeção de código Java autenticada no compilador de expressão agregada Yamcs StreamSQL.
| Campo | Valor |
|---|---|
| Produto | Yamcs (org.yamcs:yamcs-core) |
| Aviso | GHSA-3g44-3m7x-cgg2 |
| Fraqueza | CWE-94: Controle Inadequado da Geração de Código |
| Severidade | Crítica, CVSS 3.1: 9.1 |
| Vetor | CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Privilégio necessário | SystemPrivilege.ControlArchiving |
| Versões corrigidas | Yamcs 5.13.2 e 5.12.8 |
| Patch principal | b65a3d78178ba99a58b753feda6ecc3b5a694f13 |
Yamcs aceita nomes entre aspas duplas para objetos StreamSQL e, nas versões afetadas, permite quase qualquer caractere dentro desses nomes. Expressões agregadas como sum(...) constroem dinamicamente código-fonte Java usando nomes de colunas e compilam esse código-fonte com Janino SimpleCompiler.
O código vulnerável aplica apenas uma sanitização mínima de nomes antes de colocar um nome de coluna em um identificador Java gerado. Um usuário autenticado com ControlArchiving pode, portanto, criar um nome de coluna entre aspas malicioso, alcançar o compilador de agregação através de POST /api/archive/{instance}:executeSql e executar Java influenciado pelo atacante dentro da JVM do servidor Yamcs.
Isso ultrapassa o limite de autorização pretendido do Yamcs: ControlArchiving permite gerenciamento de arquivo, tabela e fluxo, mas não concede intencionalmente execução arbitrária de Java no servidor.
| Linha de versão | Afetada | Corrigida |
|---|---|---|
| 5.13.x | 5.13.1 e anteriores | 5.13.2 |
| 5.12.x | 5.12.7 e anteriores | 5.12.8 |
Atualize para Yamcs 5.13.2, 5.12.8 ou uma versão suportada posterior.
O fluxo de dados vulnerável é:
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
Três condições se combinam para criar o problema:
S_DOUBLE_QUOTED_IDENTIFIER aceita qualquer caractere exceto CR, LF e ".Expression.fillCode_InputDefVars deriva um nome de variável Java a partir do nome da coluna. Seu auxiliar sanitizeName substitui apenas / e -.Isso deixa caracteres de sintaxe Java, como ponto e vírgula, espaço em branco, parênteses, operadores de atribuição e pontos, disponíveis no método newData(Tuple) gerado. Diferente de um caminho de expressão simples, o método agregado fornece um contexto de instrução acessível no qual instruções injetadas podem ser compiladas e executadas.
A exploração requer uma conta autenticada que possua SystemPrivilege.ControlArchiving. Uma conta sem esse privilégio é rejeitada pela verificação de autorização TableApi.executeSql.
A exploração bem-sucedida executa Java com os privilégios do processo de serviço Yamcs. Dependendo do isolamento da implantação, isso pode afetar a confidencialidade, integridade e disponibilidade dos dados da missão e do ambiente host. O problema não é um RCE não autenticado e, por si só, não eleva o processo Yamcs além das permissões do sistema operacional ou do contêiner.
O poc.py incluído é intencionalmente não armamentizado:
javac e java) para o teste do marcador benignocd /path/to/yamcs
python3 /path/to/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 estruturados da cadeia de código-fonte e modelo Javaevidence/crash_evidence.log: log de validação concisoA evidência incluída foi produzida contra o commit do código-fonte do Yamcs 98a05e95461207c143e4297ec4bb1b5a76e9cb19. Ela confirma a cadeia de código-fonte vulnerável, a injeção de código-fonte gerado e a execução do marcador benigno.
A correção upstream é intitulada Avoid RCE through double-quoted identifiers:
b65a3d78178ba99a58b753feda6ecc3b5a694f13, lançado em 5.13.28c1070b12c0a6c003903325cb2a1013347e2dbde, lançado em 5.12.8A mudança central restringe identificadores entre aspas duplas de um conjunto de caracteres quase irrestrito:
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" >
para uma lista de permissões de letras, dígitos, $, _, # e .:
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (<LETTER> | <DIGIT> | <SPECIAL_CHARS>)+ "\"" >
Isso rejeita os caracteres de separação de instruções e construção de expressões exigidos pela injeção reportada antes que o nome atinja a geração de código Java. O patch também atualiza arquivos de parser gerados, documentação e um teste relacionado.
A restrição pode afetar nomes de objetos entre aspas existentes que contenham espaços ou pontuação não permitida. Revise os esquemas StreamSQL e a automação antes de atualizar ou fazer backport.
CVE-2026-55511 é um ponto de entrada separado do CVE-2026-44632 / GHSA-524g-x36v-9wm6. CVE-2026-44632 diz respeito ao JavaExprAlgorithmExecutionFactory, é alcançado através da funcionalidade de substituição de algoritmo do banco de dados da missão e é controlado por ChangeMissionDatabase.
Este problema está em org.yamcs.yarch.streamsql, é alcançado através de executeSql e é controlado por ControlArchiving. A correção anterior no caminho do algoritmo (5.13.0 / 5.12.7) não modificou o compilador StreamSQL nem seu tratamento de identificadores entre aspas.
VULNERABILITY_REPORT.md: relatório de vulnerabilidade expandidoPATCH_ANALYSIS.md: análise detalhada do patch upstream e notas de compatibilidadeUtilize este material apenas em sistemas de sua propriedade ou que você esteja explicitamente autorizado a testar.