Feb 11, 2026·7 min read·8 visits
Critical Unauthenticated RCE (CVSS 9.8) in METIS DFS devices <= 2.1.234-r18. The application exposes a `/console` endpoint that accepts system commands without authentication. Patch immediately to version 2.1.235-r19 or block access to the web interface.
In the high-stakes world of maritime and industrial data analytics, the METIS Data Fusion System (DFS) serves as a critical nervous system. However, a startling oversight in version control turned these devices into wide-open doors for attackers. CVE-2026-2249 represents the worst-case scenario for edge devices: a hardcoded, unauthenticated web console exposing a direct shell to the operating system. With a CVSS score of 9.8, this isn't just a vulnerability; it's a welcome mat for remote command execution, allowing anyone with network access to execute commands as the 'daemon' user without a password, a key, or even a polite knock.
In the world of OT (Operational Technology) and maritime systems, "Data Fusion" sounds sophisticated. It implies the elegant merging of sensor data, navigation metrics, and engine diagnostics into a single source of truth. METIS Cyberspace Technology built their DFS (Data Fusion System) to do exactly that. But as any seasoned hacker knows, the more complex the system, the simpler the mistake that brings it down.
Imagine buying a high-tech, reinforced steel safe. It has biometric scanners, a timed lock, and seismic sensors. But around the back, the manufacturer left a post-it note saying "Debug Mode" pointing to a generic latch that opens the door. That is CVE-2026-2249 in a nutshell.
We aren't dealing with a complex heap overflow or a race condition that requires nanosecond precision here. We are dealing with a web application that simply forgot to ask, "Who are you?" before handing over the keys to the kingdom. Specifically, the oscore firmware versions up to 2.1.234-r18 expose a /console endpoint. This isn't a restricted API; it is a direct conduit to the underlying Linux shell, running with daemon privileges. For an attacker, this is the holy grail: Remote Command Execution (RCE) with zero friction.
The root cause here is a classic instance of CWE-306: Missing Authentication for Critical Function. Somewhere in the development lifecycle, a developer likely needed a quick way to debug the appliance during field tests or QA. They implemented a web-based terminal—a convenient feature when you don't want to hook up a serial cable or configure SSH keys.
The logic failure was catastrophic but simple: the routing configuration for the /console URI lacks any middleware to verify a session token, an API key, or a username. The web server treats a request to execute a shell command with the same casual indifference as a request for the site's favicon.
Usually, when we see RCEs, they involve chaining an authentication bypass with an arbitrary file upload or an insecure deserialization flaw. Here, the vendor removed the middleman. The application logic effectively says: "If you can reach this URL, you are the administrator." It blindly passes input parameters from the HTTP request directly to a system shell execution function (likely popen, system, or exec).
While the exact proprietary source code isn't public, the behavior describes a pattern we see all too often in embedded web servers (often Python/Flask, Node.js, or Go). Let's reconstruct the crime scene based on the vulnerability behavior.
In the vulnerable version (<= 2.1.234-r18), the routing logic likely resembled this pseudo-code:
# VULNERABLE CODE (Hypothetical Reconstruction)
@app.route('/console', methods=['POST'])
def web_console():
# No @login_required decorator!
command = request.form.get('cmd')
# DIRECT execution of user input
# This is the "Game Over" line
output = subprocess.check_output(command, shell=True)
return jsonify({'output': output})Notice the absence of any @login_required or session validation. If the request hits the endpoint, the code runs. The shell=True (or equivalent) parameter allows for command chaining, pipes, and redirection, giving the attacker full flexibility.
In version 2.1.235-r19, the vendor likely applied one of two fixes: either removing the route entirely (the best option for production) or enforcing strict authentication middleware.
# PATCHED CODE
from core.auth import login_required, admin_only
@app.route('/console', methods=['POST'])
@login_required # Step 1: Prove you are a user
@admin_only # Step 2: Prove you are an admin
def web_console():
# Even with auth, shell=True is dangerous,
# but at least the door is locked now.
...The simplicity of the flaw makes it terrifying. There was no clever obfuscation to decode, no memory layout to map—just a URL that shouldn't have been there.
Exploiting this vulnerability requires no special tooling. A web browser is enough to verify it, and curl is enough to weaponize it. The barrier to entry is effectively zero.
During my research, I found a repository named NightlyAudit/CVE-2026-2249 claiming to contain an exploit. Do not use it. It directs users to a suspicious third-party download link. This is a common tactic: attackers prey on security researchers and script kiddies looking for a quick win by bundling malware into fake PoCs. The real exploit is trivial enough that you don't need a shady Python script to pull it off. If you can type curl, you can exploit this.
Why is this a critical issue? METIS DFS units are often deployed in maritime or industrial environments. They aggregate data from sensors, engines, and navigation systems. Compromising this device allows an attacker to intercept sensitive telemetry, falsify sensor data, or use the device as a pivot point into the wider Operational Technology (OT) network.
While the commands run as daemon and not root, privilege escalation on embedded Linux systems is often trivial due to outdated kernels or insecure file permissions. Furthermore, daemon usually has network access.
An attacker could:
In a maritime context, losing access to data fusion systems could blind the crew to critical engine diagnostics in the middle of the ocean. This moves the impact from "digital annoyance" to "physical safety risk."
METIS Cyberspace Technology SA acted quickly, releasing oscore 2.1.235-r19 on the same day the CVE was published. The primary mitigation is straightforward: Update immediately.
oscore 2.1.235-r19 update provided by the vendor.http://<device-ip>/console. You should receive a 404 Not Found or a 403 Forbidden response.If patching is not immediately possible (common in maritime environments with low bandwidth), you must implement network controls:
*/console* at the network edge.CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
METIS DFS METIS Cyberspace Technology SA | <= oscore 2.1.234-r18 | oscore 2.1.235-r19 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-306 (Missing Authentication) |
| Attack Vector | Network (AV:N) |
| CVSS Score | 9.8 (Critical) |
| Privileges Required | None (PR:N) |
| Impact | Full System Compromise (RCE) |
| Current Status | Patched / PoC Available |
The software does not perform any authentication for functionality that requires a proveable user identity or consumes a significant amount of resources.