Skip to content

Unauthenticated websocket can subscribe to the log path and receive buffered server logs

Moderate
tkurki published GHSA-7m8x-x364-m26j Aug 14, 2026

Package

npm signalk-server (npm)

Affected versions

>= 0, <= 2.30.0

Patched versions

>=2.31.0-beta.1

Description

Summary

Unauthenticated websocket can subscribe to the log path and receive buffered server logs

(Narrowed after maintainer feedback: opening the socket unauthenticated is intended, since login
happens over ws. This is only about what an unauthenticated socket can then subscribe to.)

processSubscribe special-cases the log path and applies no access control to it:

if (
  Array.isArray(msg.subscribe) &&
  msg.subscribe.length > 0 &&
  msg.subscribe[0].path === 'log'
) {
  if (!spark.logUnsubscribe) {
    spark.logUnsubscribe = startServerLog(app, spark)
  }
} else {
  // normal subscriptions go through subscriptionmanager, which applies
  // securityStrategy.filterReadDelta
}

startServerLog then replays the whole buffer to that socket:

app.logging.getLog().forEach((log) => {
  spark.write({ type: 'LOG', data: log })
})

The asymmetry is inside this one file. Writes are gated by securityStrategy.shouldAllowWrite
(ws.ts:961), normal delta subscriptions are filtered by securityStrategy.filterReadDelta
(ws.ts:1159, the else branch of this same function), and the log branch consults neither.

So an unauthenticated socket, which is legitimately open for login, can subscribe to log and receive
buffered server logs.

Fix: require a principal, and an admin one, before startServerLog, in the same way the other branch
defers to securityStrategy.

Confirmed on 26ab199. I used AI assistance while investigating; I read the subscribe path and the log
replay but did not run a server and capture the frames.

Severity

Moderate

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v3 base metrics

Attack vector
Network
Attack complexity
Low
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
Low
Integrity
None
Availability
None

CVSS v3 base metrics

Attack vector: More severe the more the remote (logically and physically) an attacker can be in order to exploit the vulnerability.
Attack complexity: More severe for the least complex attacks.
Privileges required: More severe if no privileges are required.
User interaction: More severe when no user interaction is required.
Scope: More severe when a scope change occurs, e.g. one vulnerable component impacts resources in components beyond its security scope.
Confidentiality: More severe when loss of data confidentiality is highest, measuring the level of data access available to an unauthorized user.
Integrity: More severe when loss of data integrity is the highest, measuring the consequence of data modification possible by an unauthorized user.
Availability: More severe when the loss of impacted component availability is highest.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N

CVE ID

No known CVE

Weaknesses

Missing Authentication for Critical Function

The product does not perform any authentication for functionality that requires a provable user identity or consumes a significant amount of resources. Learn more on MITRE.

Improper Handling of Exceptional Conditions

The product does not handle or incorrectly handles an exceptional condition. Learn more on MITRE.

Credits