CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-2249
9.8

The Open Door Policy: Unauthenticated RCE in METIS DFS

Alon Barad
Alon Barad
Software Engineer

Feb 11, 2026·7 min read·8 visits

PoC Available

Executive Summary (TL;DR)

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.

The Hook: The Ghost in the Machine

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 Flaw: A Console for Everyone

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).

The Code: Anatomy of a Screw-Up

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.

The Vulnerable Pattern

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.

The Fix

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.

The Exploit: Walking Through the Open Door

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.

The Attack Chain

  1. Recon: The attacker scans port 80/443 on the target IP.
  2. Verification: A simple POST request confirms the vulnerability.
  3. Weaponization: A reverse shell is injected.

A Warning on "Fake" Exploits

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.

The Impact: Sinking the Ship

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:

  • Exfiltrate Data: Steal configuration files, logs, and proprietary algorithms.
  • Lateral Movement: Scan the internal network (using the DFS as a proxy) to find PLCs or HMI interfaces.
  • Botnet Recruitment: Install Mirai or similar malware to use the device for DDoS attacks.
  • Ransomware: Encrypt the local filesystem, rendering the data fusion capabilities useless until a ransom is paid.

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."

The Fix: Closing the Hatch

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.

Remediation Steps

  1. Identify: Scan your network for METIS DFS devices. Check the version string in the web UI footer or headers.
  2. Patch: Apply the oscore 2.1.235-r19 update provided by the vendor.
  3. Verify: Attempt to access http://<device-ip>/console. You should receive a 404 Not Found or a 403 Forbidden response.

Defense in Depth

If patching is not immediately possible (common in maritime environments with low bandwidth), you must implement network controls:

  • WAF Rules: Block any requests to */console* at the network edge.
  • Segmentation: Ensure these devices are not directly exposed to the internet. They should live behind a VPN or on an isolated OT VLAN.
  • Monitoring: Alert on any outbound connections from the DFS device to the internet, especially on non-standard ports, which would indicate a reverse shell attempt.

Official Patches

METIS Cyberspace Technology SAVendor Homepage and Support

Technical Appendix

CVSS Score
9.8/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Affected Systems

METIS DFS (Data Fusion System)

Affected Versions Detail

Product
Affected Versions
Fixed Version
METIS DFS
METIS Cyberspace Technology SA
<= oscore 2.1.234-r18oscore 2.1.235-r19
AttributeDetail
CWE IDCWE-306 (Missing Authentication)
Attack VectorNetwork (AV:N)
CVSS Score9.8 (Critical)
Privileges RequiredNone (PR:N)
ImpactFull System Compromise (RCE)
Current StatusPatched / PoC Available

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1059.004Command and Scripting Interpreter: Unix Shell
Execution
T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-306
Missing Authentication for Critical Function

The software does not perform any authentication for functionality that requires a proveable user identity or consumes a significant amount of resources.

Known Exploits & Detection

GitHub (Fake/Malware Warning)Repository claiming to have an exploit but linking to suspicious external files. Avoid downloading.
ManualTrivial exploitation via POST request to /console with command payload.

Vulnerability Timeline

Vulnerability Discovered by Or Balog
2026-02-11
CVE Assigned and Published
2026-02-11
Vendor Released Patch (oscore 2.1.235-r19)
2026-02-11

References & Sources

  • [1]NIST NVD Entry
  • [2]Cydome Security (Researcher)

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.