
Удаленное выполнение кода (RCE) в системе управления миссиями Yamcs через внедрение Java-операторов в идентификаторы в двойных кавычках Yarch SQL Удаленное выполнение кода (RCE) в системе управления миссиями Yamcs через внедрение Java-операторов в идентификаторы в двойных кавычках Yarch SQL
Невооружённое доказательство концепции и техническая документация для CVE-2026-55511, уязвимости аутентифицированного внедрения Java-кода в компиляторе агрегатных выражений Yamcs StreamSQL.
| Поле | Значение |
|---|---|
| Продукт | 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 и выполнить Java-код, контролируемый атакующим, внутри JVM сервера Yamcs.
Это нарушает предполагаемую границу авторизации 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.
Успешная эксплуатация выполняет Java с привилегиями процесса службы Yamcs. В зависимости от изоляции развёртывания это может повлиять на конфиденциальность, целостность и доступность данных миссии и среды хоста. Проблема не является неаутентифицированным 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.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: подробный анализ исправления от разработчиков и примечания по совместимостиИспользуйте этот материал только в системах, которыми вы владеете или на тестирование которых у вас есть явное разрешение.