
リモートコード実行 (RCE) - YamcsミッションコントロールシステムにおけるYarch SQLの二重引用符で囲まれた識別子を介したJavaステートメントインジェクション
CVE-2026-55511 に対する非武器化された概念実証および技術文書です。これは、Yamcs StreamSQL 集約式コンパイラにおける認証済み Java コードインジェクションの脆弱性です。
| フィールド | 値 |
|---|---|
| 製品 | Yamcs (org.yamcs:yamcs-core) |
| アドバイザリ | GHSA-3g44-3m7x-cgg2 |
| 脆弱性の種類 | CWE-94: Improper Control of Generation of Code |
| 深刻度 | Critical, 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 and 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 and earlier | 5.13.2 |
| 5.12.x | 5.12.7 and earlier | 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
この問題は3つの条件が組み合わさって発生します:
S_DOUBLE_QUOTED_IDENTIFIER 文法は、CR、LF、" を除く任意の文字を受け入れます。Expression.fillCode_InputDefVars は、列名から Java 変数名を導出します。その sanitizeName ヘルパーは / と - のみを置換します。これにより、生成された newData(Tuple) メソッド内で、セミコロン、空白、括弧、代入演算子、ドットなどの Java 構文文字が利用可能になります。生の式パスとは異なり、集約メソッドは、注入されたステートメントがコンパイルおよび実行可能な到達可能なステートメントコンテキストを提供します。
悪用には、SystemPrivilege.ControlArchiving を持つ認証済みアカウントが必要です。その権限を持たないアカウントは、TableApi.executeSql の認証チェックによって拒否されます。
悪用に成功すると、Yamcs サービスプロセスの権限で Java が実行されます。導入環境の分離によっては、これがミッションデータおよびホスト環境の機密性、完全性、可用性に影響を与える可能性があります。この問題は認証なしの RCE ではなく、それ自体で 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.2 でリリース8c1070b12c0a6c003903325cb2a1013347e2dbde、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: 詳細な上流パッチ分析と互換性に関する注意事項この資料は、あなたが所有しているシステム、または明示的にテストを許可されているシステムでのみ使用してください。