{"id":"CVE-2026-23515","aliases":["EUVD-2026-5282","GHSA-p8gp-2w28-mhwg"],"status":"published","title":"RCE - Command Injection in Signal K set-system-time plugin","description":"Signal K Server is a server application that runs on a central hub in a boat. Prior to 1.5.0, 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. This vulnerability is fixed in 1.5.0.","severity":{"version":"3.1","score":10,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H","level":"critical","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-11","score":0.0452,"percentile":0.9165,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-78"],"published":"2026-02-02T18:10:32Z","modified":"2026-10-28T02:30:56Z","fixes":[{"ecosystem":"npm","package":"@signalk/set-system-time","fixed_in":["1.5.0"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"npm","package":"@signalk/set-system-time","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"1.5.0"}]}]},{"source":"osv","ecosystem":"npm","package":"@signalk/set-system-time","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"1.5.0"}]}]}],"products":[{"vendor":"signalk","product":"signal_k_server"},{"vendor":"signalk","product":"signalk-server"}],"references":[{"url":"https://github.com/SignalK/signalk-server/security/advisories/GHSA-p8gp-2w28-mhwg","tags":["x_refsource_CONFIRM","Exploit","Vendor Advisory","advisory","web"]},{"url":"https://github.com/SignalK/set-system-time/commit/75b11eae2de528bf89ede3fb1f7ed057ddbb4d24","tags":["x_refsource_MISC","Patch","fix","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-23515","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-p8gp-2w28-mhwg"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/23xxx/CVE-2026-23515.json","tags":["advisory"]},{"url":"https://github.com/SignalK/signalk-server","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-23515","title":"RCE - Command Injection in Signal K set-system-time plugin","description":"Signal K Server is a server application that runs on a central hub in a boat. Prior to 1.5.0, 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. This vulnerability is fixed in 1.5.0.","status":"published","published":"2026-02-02T20:43:32.219Z","modified":"2026-02-03T15:32:04.099Z","cvss":[{"version":"3.1","score":10,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H","level":"critical","assessor":"cna"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T13:42:15.603999Z"}],"euvd":[{"id":"EUVD-2026-5282","description":"Signal K Server is a server application that runs on a central hub in a boat. Prior to 1.5.0, 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. This vulnerability is fixed in 1.5.0.","status":"published","published":"2026-02-02T20:43:32Z","modified":"2026-02-03T15:32:04Z","cvss":[{"version":"3.1","score":10,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H","level":"critical"}],"updated_at":"2026-11-02T19:48:45.084164Z"}],"ghsa":[{"id":"GHSA-p8gp-2w28-mhwg","title":"Signal K set-system-time plugin vulnerable to RCE - Command Injection","description":"### 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 == 'win32') {\n          console.error(\"Set-system-time supports only linux-like os's\")\n        } else {\n          if( ! plugin.useNetworkTime(options) ){\n            const useSudo = typeof options.sudo === 'undefined' || options.sudo\n            const setDate = `date --iso-8601 -u -s \"${datetime}\"`  // ← 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('child_process').spawn('sh', ['-c', command])  // ← 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('sh', ['-c', 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.","status":"published","published":"2026-02-02T18:10:32Z","modified":"2026-02-03T16:12:17Z","cvss":[{"version":"3.1","score":9.9,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H","level":"critical"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T14:39:21.558748Z"}],"nvd":[{"id":"CVE-2026-23515","description":"Signal K Server is a server application that runs on a central hub in a boat. Prior to 1.5.0, 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. This vulnerability is fixed in 1.5.0.","status":"published","published":"2026-02-02T23:16:07.19Z","modified":"2026-06-17T10:21:42.51Z","cvss":[{"version":"3.1","score":9.9,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H","level":"critical","assessor":"secondary"},{"version":"3.1","score":8.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H","level":"high","assessor":"primary"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T14:12:05.149641Z"}],"osv":[{"id":"CVE-2026-23515","title":"RCE - Command Injection in Signal K set-system-time plugin","description":"Signal K Server is a server application that runs on a central hub in a boat. Prior to 1.5.0, 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. This vulnerability is fixed in 1.5.0.","status":"published","published":"2026-02-02T20:43:32.219Z","modified":"2026-10-28T02:30:56.358858808Z","cvss":[{"version":"3.1","score":9.9,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H","level":"critical"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T15:44:59.079784Z"},{"id":"GHSA-p8gp-2w28-mhwg","title":"Signal K set-system-time plugin vulnerable to RCE - Command Injection","description":"### 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 == 'win32') {\n          console.error(\"Set-system-time supports only linux-like os's\")\n        } else {\n          if( ! plugin.useNetworkTime(options) ){\n            const useSudo = typeof options.sudo === 'undefined' || options.sudo\n            const setDate = `date --iso-8601 -u -s \"${datetime}\"`  // ← 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('child_process').spawn('sh', ['-c', command])  // ← 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('sh', ['-c', 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.","status":"published","published":"2026-02-02T18:10:32Z","modified":"2026-02-03T17:53:56.291736Z","cvss":[{"version":"3.1","score":9.9,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H","level":"critical"}],"cwes":["CWE-78"],"updated_at":"2026-11-02T15:46:52.891208Z"}]}}
