GHSA-P8GP-2W28-MHWG

Vulnerability from github – Published: 2026-02-02 18:10 – Updated: 2026-02-03 16:12
VLAI?
Summary
Signal K set-system-time plugin vulnerable to RCE - Command Injection
Details

Summary

A Command Injection vulnerability allows authenticated users with write permissions to execute arbitrary shell commands on the Signal K server when the set-system-time plugin is enabled. Unauthenticated users can also exploit this vulnerability if security is disabled on the Signal K server. This occurs due to unsafe construction of shell commands when processing navigation.datetime values received via WebSocket delta messages.

Details

Product: Signal K set-system-time plugin
Repository: https://github.com/SignalK/set-system-time

File: index.js, lines 60-71

      stream.onValue(function (datetime) {
        var child
        if (process.platform == 'win32') {
          console.error("Set-system-time supports only linux-like os's")
        } else {
          if( ! plugin.useNetworkTime(options) ){
            const useSudo = typeof options.sudo === 'undefined' || options.sudo
            const setDate = `date --iso-8601 -u -s "${datetime}"`  // ← VULNERABLE
            const command = useSudo
              ? `if sudo -n date &> /dev/null ; then sudo ${setDate} ; else exit 3 ; fi`
              : setDate
            child = require('child_process').spawn('sh', ['-c', command])  // ← EXECUTES SHELL

The vulnerability has three components:

  1. Unsanitized Input: The datetime value from navigation.datetime Signal K path is directly interpolated into a shell command without validation
  2. Shell Execution: The command is executed via spawn('sh', ['-c', command]), which interprets shell metacharacters
  3. Sudo Privileges: The plugin can execute with root privileges if sudo is misconfigured, instructions to limit passwordless sudo to the /bin/date binary helps mitigate this but RCE can still be achieved with the privileges of the user that installed it.

PoC

Exploitation Requirements

  • Signal K server with security enabled, if disabled credentials not required
  • Valid user credentials with readwrite or admin permissions
  • set-system-time plugin installed and enabled
  • Signal K server installed on a Linux OS
  • Passwordless sudo configured, official instructions will do this for the date command which is enough to satisfy the if condition
"""
Run provided POC:
    python3 poc.py --host signalkserver_IP -u username -p password

Payload: Creates /tmp/signalk-RCE.txt to prove code execution
"""

Impact

An attacker that has write privileges either through security on the Signal K server being disabled or valid credentials with read/write permissions can execute arbitrary commands on the server with the privileges of the SignalK process or root if sudo is misconfigured. This enables complete system compromise.

Recommendations

  • Replace shell-based execution with child_process.execFile() so user-controlled input is passed as arguments rather than interpreted by a shell.

  • Validate that navigation.datetime conforms to an expected ISO-8601 format to improve robustness.

Show details on source website

{
  "affected": [
    {
      "package": {
        "ecosystem": "npm",
        "name": "@signalk/set-system-time"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "1.5.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-23515"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-78"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-02-02T18:10:32Z",
    "nvd_published_at": "2026-02-02T23:16:07Z",
    "severity": "CRITICAL"
  },
  "details": "### Summary\nA Command Injection vulnerability allows authenticated users with write permissions to execute arbitrary shell commands on the Signal K server when the set-system-time plugin is enabled. Unauthenticated users can also exploit this vulnerability if security is disabled on the Signal K server. This occurs due to unsafe construction of shell commands when processing `navigation.datetime` values received via WebSocket delta messages.\n\n### Details\n**Product:** Signal K set-system-time plugin  \n**Repository:** https://github.com/SignalK/set-system-time  \n\nFile: `index.js`, lines 60-71\n\n```javascript\n      stream.onValue(function (datetime) {\n        var child\n        if (process.platform == \u0027win32\u0027) {\n          console.error(\"Set-system-time supports only linux-like os\u0027s\")\n        } else {\n          if( ! plugin.useNetworkTime(options) ){\n            const useSudo = typeof options.sudo === \u0027undefined\u0027 || options.sudo\n            const setDate = `date --iso-8601 -u -s \"${datetime}\"`  // \u2190 VULNERABLE\n            const command = useSudo\n              ? `if sudo -n date \u0026\u003e /dev/null ; then sudo ${setDate} ; else exit 3 ; fi`\n              : setDate\n            child = require(\u0027child_process\u0027).spawn(\u0027sh\u0027, [\u0027-c\u0027, command])  // \u2190 EXECUTES SHELL\n```\n\nThe vulnerability has three components:\n\n1. **Unsanitized Input**: The `datetime` value from `navigation.datetime` Signal K path is directly interpolated into a shell command without validation\n2. **Shell Execution**: The command is executed via `spawn(\u0027sh\u0027, [\u0027-c\u0027, command])`, which interprets shell metacharacters\n3. **Sudo Privileges**: The plugin can execute with root privileges if `sudo` is misconfigured, instructions to limit passwordless sudo to the /bin/date binary helps mitigate this but RCE can still be achieved with the privileges of the user that installed it.\n\n### PoC\n#### Exploitation Requirements\n\n- Signal K server with security enabled, if disabled credentials not required\n- Valid user credentials with `readwrite` or `admin` permissions\n- set-system-time plugin installed and enabled\n- Signal K server installed on a Linux OS\n- Passwordless sudo configured, official instructions will do this for the `date` command which is enough to satisfy the if condition\n\n\n```Python\n\"\"\"\nRun provided POC:\n    python3 poc.py --host signalkserver_IP -u username -p password\n\nPayload: Creates /tmp/signalk-RCE.txt to prove code execution\n\"\"\"\n```\n\n### Impact\nAn attacker that has write privileges either through security on the Signal K server being disabled or valid credentials with read/write permissions can execute arbitrary commands on the server with the privileges of the SignalK process or root if sudo is misconfigured. This enables complete system compromise.\n\n### Recommendations\n\n- Replace shell-based execution with child_process.execFile() so user-controlled input is passed as arguments rather than interpreted by a shell.\n\n- Validate that navigation.datetime conforms to an expected ISO-8601 format to improve robustness.",
  "id": "GHSA-p8gp-2w28-mhwg",
  "modified": "2026-02-03T16:12:17Z",
  "published": "2026-02-02T18:10:32Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/SignalK/signalk-server/security/advisories/GHSA-p8gp-2w28-mhwg"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-23515"
    },
    {
      "type": "WEB",
      "url": "https://github.com/SignalK/set-system-time/commit/75b11eae2de528bf89ede3fb1f7ed057ddbb4d24"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/SignalK/signalk-server"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H",
      "type": "CVSS_V3"
    }
  ],
  "summary": "Signal K set-system-time plugin vulnerable to RCE - Command Injection"
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.


Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…