CVEReports
Reports
CVEReports

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

Product

  • Home
  • Reports
  • Sitemap
  • RSS Feed

Company

  • About
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Powered by Google Gemini & CVE Feed

|
•

CVE-2025-68273
CVSS 5.3|EPSS 0.04%

Leaking the Bilge: Signal K Server Unauthenticated Info Disclosure

Amit Schendel
Amit Schendel
Senior Security Researcher•January 2, 2026•5 min read
PoC Available

Executive Summary (TL;DR)

Versions of Signal K Server prior to 2.19.0 allow unauthenticated access to sensitive diagnostic endpoints. Attackers can map serial ports, view the full server data schema, and fingerprint installed analyzers due to a missing authorization check in the application's middleware routing logic.

Signal K Server, the open-source nervous system for modern connected boats, suffered from a classic 'fail-open' security architecture. By forgetting to manually whitelist three API endpoints in a centralized security file, developers inadvertently exposed system internals and hardware configurations to unauthenticated remote attackers.

The Hook: The Internet of Floating Things

Boats used to be simple things—wood, fiberglass, and maybe a diesel engine that you could fix with a hammer. Today, a modern vessel is a floating data center. At the heart of this revolution is Signal K Server, a Node.js-based hub that takes the chaotic, proprietary babel of marine electronics (NMEA 0183, NMEA 2000) and translates it into beautiful, standardized JSON.

It’s a brilliant piece of software that lets you visualize your engine temp on an iPad or track your wind speed via Grafana. But here's the kicker: because boat owners love remote monitoring, these servers are frequently exposed to the open internet, often sitting behind nothing more than a consumer-grade router.

When you expose the brain of your ship to the web, you'd better hope the authorization logic is watertight. Unfortunately, as CVE-2025-68273 demonstrates, the Signal K team left a few portholes open. It’s not a remote code execution (RCE) that sinks the ship immediately, but it’s a leak that lets anyone with a web browser peek into the engine room.

The Flaw: A Manual Checklist in an Automated World

The root cause of this vulnerability is a textbook example of architectural fragility. Ideally, a web application should be 'secure by default'—meaning every route requires authentication unless explicitly exempted. Signal K Server, however, opted for a manual whitelist approach for its middleware application.

In the file src/tokensecurity.js, the developers maintain arrays of strings representing URL paths. The server iterates over these arrays and applies security middleware (like http_authorize or adminAuthenticationMiddleware) to the matching routes. If a developer adds a new route in src/serverroutes.ts but forgets to copy-paste that path into tokensecurity.js, the new route is born into the world naked and unprotected.

This is a fail-open design. In this specific case, three endpoints related to server diagnostics and hardware management were implemented but never added to the security middleware lists:

  1. /skServer/availablePaths
  2. /skServer/serialports
  3. /skServer/hasAnalyzer

Because the middleware never 'saw' these paths, requests to them were passed directly to the route handlers without checking for a session token or API key.

The Code: The Smoking Gun

Let's look at the patch to understand the magnitude of the oversight. The fix wasn't a complex logic rewrite; it was literally just adding the forgotten strings to the list.

Here is the diff from commit ead2a03d8994969cafcca0320abee16f0e66e7a9. Notice how the server iterates over a hardcoded array to apply protection:

// src/tokensecurity.js
 
const generatedAdminKeys = [
  '/backup',
  '/restore',
  '/providers',
  '/vessel',
+ '/serialports'  // <--- The fix: Now requires Admin Auth
]
 
generatedAdminKeys.forEach(string => {
  app.use(`${SERVERROUTESPREFIX}${string}`, adminAuthenticationMiddleware(false))
})
 
const readOnlyKeys = [
  '/webapps',
+ '/availablePaths', // <--- The fix: Now requires Read Auth
+ '/hasAnalyzer',    // <--- The fix: Now requires Read Auth
  '/skServer/inputTest'
]
 
readOnlyKeys.forEach(string => {
  app.use(`${SERVERROUTESPREFIX}${string}`, http_authorize(false))
})

[!NOTE] The move of /serialports to the adminAuthenticationMiddleware block is telling. It implies that listing the hardware interfaces of the host machine was considered sensitive enough to require full administrative privileges, yet prior to this patch, it was available to the entire world.

The Exploit: Mapping the Vessel

Exploiting this is trivially easy. You don't need a buffer overflow or a complex race condition; you just need curl. An attacker scanning for Signal K instances (default port 3000) can simply ask the server for its secrets.

1. Hardware Enumeration By querying the serial ports, an attacker can map the physical connections of the host device. This leaks filesystem paths, which is a goldmine if you are looking for Local File Inclusion (LFI) targets later, or trying to identify the host OS (e.g., distinguishing between a Raspberry Pi Linux path and a Windows path).

$ curl http://target-boat.local:3000/skServer/serialports
{
  "serialports": [
    "/dev/ttyUSB0",
    "/dev/serial/by-id/usb-Actisense_NGT-1_..."
  ]
}

2. Schema Dumping The /availablePaths endpoint is even more chatty. It dumps the entire Signal K schema tree known to the server. This tells the attacker exactly what sensors are installed (Do they have AIS? Depth sounders? Engine metrics?) and reveals internal UUIDs and pending request states.

$ curl http://target-boat.local:3000/skServer/availablePaths
{
  "paths": [
    "vessel.self.navigation.position",
    "vessel.self.propulsion.port.revolutions",
    "vessel.self.electrical.batteries.1.voltage"
  ]
}

This is reconnaissance gold. If I know you have a specific expensive brand of NMEA gateway connected to /dev/ttyUSB0, and I know your exact sensor tree, I can craft highly specific phishing emails to the owner or look for vulnerabilities in those specific sensor drivers.

The Fix & Re-exploitation Risks

The remediation in version 2.19.0 plugs the immediate holes by adding the missing paths to src/tokensecurity.js. If you are running Signal K, update immediately.

However, from a security research perspective, the fix feels like a band-aid on a broken leg. The underlying architecture—manual whitelisting—remains. This means the vulnerability is likely to recur the next time a developer adds a route and forgets to update the security file.

Bypassing the Fix? Researchers should look closely at how Express handles path normalization versus how the string matching in tokensecurity.js works.

If tokensecurity.js does a simple string match, but the Express router is smarter about decoding paths, you might be able to bypass the check. For example, does requesting //skServer/serialports (double slash) bypass the middleware string match while still hitting the router? Or perhaps .../skServer/%2e%2e/skServer/serialports? It's a classic area for WAF-style bypasses in Node.js applications.

Official Patches

Signal KCommit fixing the missing route authorization
Signal KRelease notes for v2.19.0

Fix Analysis (1)

Technical Appendix

CVSS Score
5.3/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
EPSS Probability
0.04%
Top 100% most exploited
2,500
Estimated exposed hosts via Shodan

Affected Systems

Signal K Server < 2.19.0

Affected Versions Detail

ProductAffected VersionsFixed Version
Signal K Server
Signal K
< 2.19.02.19.0
AttributeDetail
CWE IDCWE-200
Attack VectorNetwork
CVSS Score5.3
ImpactInformation Disclosure
Patch Commitead2a03d8994969cafcca0320abee16f0e66e7a9
Exploit StatusPoC Available

MITRE ATT&CK Mapping

MITRE ATT&CK Mapping

T1592Gather Victim Host Information
Reconnaissance
T1082System Information Discovery
Discovery
CWE-200
Information Disclosure

Exposure of Sensitive Information to an Unauthorized Actor

Exploit Resources

Known Exploits & Detection

Research AnalysisManual verification using curl confirms unauthenticated access to endpoints.

Vulnerability Timeline

Vulnerability Timeline

Patch committed to master branch
2024-04-12
Version 2.19.0 released
2024-04-12
CVE Published
2025-02-14

References & Sources

  • [1]GitHub Security Advisory
  • [2]NVD Detail

Subscribe to updates

Get the latest CVE analysis reports delivered to your inbox.

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.