Summary
Yamcs: Insecure Direct Object Reference (IDOR) in PacketsApi allows unprivileged users to dump all telemetry packets
The PacketsApi.exportPackets endpoint in Yamcs fails to properly enforce object-level privileges (ReadPacket) when an API request omits specific packet names. As a result, an attacker with a low-privileged account (or any authenticated user with zero privileges) can dump the entire archive of raw telemetry packets for a Yamcs instance. This leads to a massive Information Disclosure of sensitive mission telemetry, completely bypassing the intended Role-Based Access Control (RBAC) model.
Vulnerability Details
In yamcs-core/src/main/java/org/yamcs/http/api/PacketsApi.java, the exportPackets method processes requests to export raw packets from the tm (telemetry archive) table.
@Override
public void exportPackets(Context ctx, ExportPacketsRequest request, Observer<HttpBody> observer) {
String instance = InstancesApi.verifyInstance(request.getInstance());
Set<String> nameSet = new HashSet<>(request.getNameList());
ctx.checkObjectPrivileges(ObjectPrivilegeType.ReadPacket, nameSet);
SqlBuilder sqlb = new SqlBuilder(XtceTmRecorder.TABLE_NAME);
// ... time filters ...
if (request.getNameCount() > 0) {
sqlb.whereColIn("pname", nameSet);
}
String sql = sqlb.toString();
// ...
The method attempts to verify privileges using ctx.checkObjectPrivileges(ObjectPrivilegeType.ReadPacket, nameSet). However, if the request.getNameList() is empty (i.e., the attacker does not specify any packet names to filter by), nameSet is empty. The checkObjectPrivileges method loops over this empty set and successfully passes without throwing a ForbiddenException.
Since request.getNameCount() is 0, no WHERE pname IN (...) filter is added to the SQL query. The resulting sql query becomes a SELECT * FROM tm (with optional time filters).
Finally, the query is executed and the results are streamed back to the user:
StreamFactory.stream(instance, sql, sqlb.getQueryArguments(), new StreamSubscriber() {
@Override
public void onTuple(Stream stream, Tuple tuple) {
if (observer.isCancelled()) {
stream.close();
return;
}
byte[] raw = (byte[]) tuple.getColumn(StandardTupleDefinitions.TM_PACKET_COLUMN);
HttpBody body = HttpBody.newBuilder()
.setData(ByteString.copyFrom(raw))
.build();
observer.next(body);
}
// ...
Crucially, unlike the streamPackets or exportPacket methods (which explicitly check ctx.user.hasObjectPrivilege for each packet retrieved before returning them), the onTuple handler in exportPackets blindly streams all retrieved packets to the user without any per-row authorization checks.
Thus, a user who possesses no ReadPacket privileges at all can easily bypass authorization and extract all telemetry data from the archive.
Steps to Reproduce
- Start the Yamcs server (e.g., using the
simulationexample) with authentication enforced. - Log in as a low-privileged user (or use their credentials) who does not have the
ReadPacketprivilege. - Send an HTTP GET request to the export packets endpoint without specifying any
nameparameters:curl -v -u low_priv_user:password "http://localhost:8090/api/archive/simulator:exportPackets" -o dumped_packets.raw - Observe that the server responds with HTTP
200 OKand streams all raw packets to the response, saving them todumped_packets.raw. - The downloaded file contains raw CCSDS Space Packets (binary telemetry data).
- Contrast this with an attempt to fetch a specific packet (or calling
listPacketsfor an unauthorized packet), which correctly enforces authorization and rejects the request.
System Information
- Affected Versions: 5.13.0 (Latest Release), 5.12.x, and current
masterbranch. - Tested Revision (master):
309218c651680f79df11a8d0f8628f7033f98a83 - Vulnerability Type: Insecure Direct Object Reference (IDOR) / Logical Authorization Bypass
PoC Images:
- Check version:
- Check privilege of user:
- Exploit:
Impact
Telemetry packets contain the core mission data, vehicle health status, and sensitive measurements (CCSDS Protocol data). This vulnerability completely breaks the access control model for telemetry data, allowing any authenticated user to exfiltrate all historical telemetry packets from the database. In an aerospace or mission-critical environment, this represents a severe data leak (Massive Information Disclosure) of proprietary or classified spacecraft data.
The application does not perform an authorization check before performing a sensitive operation. Typical impact: unauthorized access to restricted functionality or data.
CVE-2026-55548 has a CVSS score of 4.3 (Medium). The vector is network-reachable, low privileges required, and no user interaction. A CVSS score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether this affects your application depends on whether the vulnerable code is present and reachable in your environment. A fixed version is available (5.13.2, 5.12.8); upgrading removes the vulnerable code path.
Affected versions
Security releases
Kodem intelligence
Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.
Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.
Already deployed Kodem?
See it in your environmentNew to Kodem? Get a demo →Remediation advice
Ensure that exportPackets enforces the same per-row privilege checks as streamPackets.
Update the onTuple handler to check the user's privileges before emitting each packet:
@Override
public void onTuple(Stream stream, Tuple tuple) {
if (observer.isCancelled()) {
stream.close();
return;
}
// FIX: Retrieve packet name and check authorization
String pname = (String) tuple.getColumn(XtceTmRecorder.PNAME_COLUMN);
if (ctx.user.hasObjectPrivilege(ObjectPrivilegeType.ReadPacket, pname)) {
byte[] raw = (byte[]) tuple.getColumn(StandardTupleDefinitions.TM_PACKET_COLUMN);
HttpBody body = HttpBody.newBuilder()
.setData(ByteString.copyFrom(raw))
.build();
observer.next(body);
}
}
Frequently Asked Questions
- What is CVE-2026-55548? CVE-2026-55548 is a medium-severity missing authorization vulnerability in org.yamcs:yamcs-core (maven), affecting versions >= 5.13.0, <= 5.13.1. It is fixed in 5.13.2, 5.12.8. The application does not perform an authorization check before performing a sensitive operation.
- How severe is CVE-2026-55548? CVE-2026-55548 has a CVSS score of 4.3 (Medium). This score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether it represents real risk in your environment depends on whether the vulnerable code is present and reachable.
- Which versions of org.yamcs:yamcs-core are affected by CVE-2026-55548? org.yamcs:yamcs-core (maven) versions >= 5.13.0, <= 5.13.1 is affected.
- Is there a fix for CVE-2026-55548? Yes. CVE-2026-55548 is fixed in 5.13.2, 5.12.8. Upgrade to this version or later.
- Is CVE-2026-55548 exploitable, and should I be worried? Whether CVE-2026-55548 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
- What actually determines whether CVE-2026-55548 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
- How do I fix CVE-2026-55548?
- Upgrade
org.yamcs:yamcs-coreto 5.13.2 or later - Upgrade
org.yamcs:yamcs-coreto 5.12.8 or later
- Upgrade