
Exécution de code à distance (RCE) dans le système de contrôle de mission Yamcs via une injection de déclaration Java dans les identifiants entre guillemets SQL Yarch Exécution de code à distance (RCE) dans le système de contrôle de mission Yamcs via une injection de déclaration Java dans les identifiants entre guillemets SQL Yarch
Preuve de concept non armée et documentation technique pour CVE-2026-55511, une vulnérabilité authentifiée d'injection de code Java dans le compilateur d'expressions d'agrégation StreamSQL de Yamcs.
| Champ | Valeur |
|---|---|
| Produit | Yamcs (org.yamcs:yamcs-core) |
| Avis de sécurité | GHSA-3g44-3m7x-cgg2 |
| Faiblesse | CWE-94 : Contrôle inadéquat de la génération de code |
| Gravité | Critique, CVSS 3.1 : 9.1 |
| Vecteur | CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H |
| Privilège requis | SystemPrivilege.ControlArchiving |
| Versions corrigées | Yamcs 5.13.2 et 5.12.8 |
| Correctif principal | b65a3d78178ba99a58b753feda6ecc3b5a694f13 |
Yamcs accepte les noms entre guillemets pour les objets StreamSQL et, dans les versions affectées, autorise presque tous les caractères à l'intérieur de ces noms. Les expressions d'agrégation telles que sum(...) construisent dynamiquement du code source Java à l'aide des noms de colonnes et compilent ce code source avec Janino SimpleCompiler.
Le code vulnérable n'applique qu'une minimalisation du nom avant de placer un nom de colonne dans un identifiant Java généré. Un utilisateur authentifié disposant de ControlArchiving peut donc créer un nom de colonne entre guillemets spécialement conçu, atteindre le compilateur d'agrégation via POST /api/archive/{instance}:executeSql, et exécuter du Java influencé par un attaquant dans la JVM du serveur Yamcs.
Cela franchit la limite d'autorisation prévue par Yamcs : ControlArchiving permet la gestion des archives, des tables et des flux, mais n'accorde pas intentionnellement l'exécution Java arbitraire sur le serveur.
| Ligne de version | Affectée | Corrigée |
|---|---|---|
| 5.13.x | 5.13.1 et antérieures | 5.13.2 |
| 5.12.x | 5.12.7 et antérieures | 5.12.8 |
Mettez à jour vers Yamcs 5.13.2, 5.12.8 ou une version ultérieure prise en charge.
Le flux de données vulnérable est le suivant :
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
Trois conditions se combinent pour créer le problème :
S_DOUBLE_QUOTED_IDENTIFIER accepte tout caractère sauf CR, LF et ".Expression.fillCode_InputDefVars dérive un nom de variable Java du nom de colonne. Son assistant sanitizeName ne remplace que / et -.Cela laisse les caractères de syntaxe Java tels que les points-virgules, les espaces, les parenthèses, les opérateurs d'affectation et les points disponibles dans la méthode newData(Tuple) générée. Contrairement à un chemin d'expression nu, la méthode d'agrégation fournit un contexte d'instructions accessible dans lequel les instructions injectées peuvent être compilées et exécutées.
L'exploitation nécessite un compte authentifié disposant de SystemPrivilege.ControlArchiving. Un compte sans ce privilège est rejeté par la vérification d'autorisation TableApi.executeSql.
Une exploitation réussie exécute Java avec les privilèges du processus de service Yamcs. Selon l'isolation du déploiement, cela peut affecter la confidentialité, l'intégrité et la disponibilité des données de mission et de l'environnement hôte. Le problème n'est pas un RCE non authentifié et n'élève pas en soi les privilèges du processus Yamcs au-delà de ses permissions système ou conteneur.
Le script poc.py inclus est intentionnellement non armé :
javac et java) pour le test du marqueur bénincd /path/to/yamcs
python3 /path/to/poc.py \
--json /tmp/evidence.json \
--log /tmp/crash_evidence.log \
--expect-crash
Indicateurs attendus :
source_chain_confirmed=true
generated_source_injection_present=true
marker_executed=true
evidence/evidence.json : résultats structurés de la chaîne source et du modèle Javaevidence/crash_evidence.log : journal de validation concisLes preuves incluses ont été produites sur le commit source Yamcs 98a05e95461207c143e4297ec4bb1b5a76e9cb19. Elles confirment la chaîne source vulnérable, l'injection de code source généré et l'exécution du marqueur bénin.
Le correctif amont est intitulé Avoid RCE through double-quoted identifiers :
b65a3d78178ba99a58b753feda6ecc3b5a694f13, publié dans 5.13.28c1070b12c0a6c003903325cb2a1013347e2dbde, publié dans 5.12.8La modification principale restreint les identifiants entre guillemets, passant d'un ensemble de caractères presque illimité :
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" >
à une liste autorisée composée de lettres, chiffres, $, _, # et . :
< S_DOUBLE_QUOTED_IDENTIFIER: "\"" (<LETTER> | <DIGIT> | <SPECIAL_CHARS>)+ "\"" >
Cela rejette les caractères de séparation d'instructions et de construction d'expressions requis par l'injection signalée avant que le nom n'atteigne la génération de code Java. Le correctif met également à jour les fichiers d'analyseur générés, la documentation et un test connexe.
La restriction peut affecter les noms d'objets entre guillemets existants contenant des espaces ou une ponctuation non autorisée. Examinez les schémas StreamSQL et l'automatisation avant de mettre à jour ou de rétroporter.
CVE-2026-55511 est un point d'entrée distinct de CVE-2026-44632 / GHSA-524g-x36v-9wm6. CVE-2026-44632 concerne JavaExprAlgorithmExecutionFactory, est accessible via la fonctionnalité de remplacement d'algorithme de base de données de mission, et est contrôlé par ChangeMissionDatabase.
Ce problème se trouve dans org.yamcs.yarch.streamsql, est accessible via executeSql et est contrôlé par ControlArchiving. Le correctif antérieur de la voie d'algorithme (5.13.0 / 5.12.7) n'a pas modifié le compilateur StreamSQL ni sa gestion des identifiants entre guillemets.
VULNERABILITY_REPORT.md : rapport de vulnérabilité étenduPATCH_ANALYSIS.md : analyse détaillée du correctif amont et notes de compatibilitéN'utilisez ce matériel que sur des systèmes vous appartenant ou pour lesquels vous êtes explicitement autorisé à effectuer des tests.