Public mode

No access to your tenant or devices. Every item links to its source. What this means

Some sources, documents or advisories need attention: 275/275 feeds/APIs · 469/469 docs · 8/9 advisories · checked 21:27 UTC Customize Public modeDiscuss ChangeIntel on Discord

systeminformation vulnerable to Windows command injection in services() through Unicode quotation marks

Exact source revision recorded 28 Oct 2026 23:55:37 UTC. It does not establish the source's current position. Latest evidence.

osv · GHSA-3f7j-7jwc-fxfj

Published

### Summary On Windows, `[email protected]` builds a PowerShell command using the value passed to `services()`. The default sanitizer removes ASCII quotes but keeps Unicode curly quotes, spaces, and parentheses. A crafted service name can use those characters to break out of the generated filter string and run a PowerShell expression. The expression runs with the permissions of the Node.js process. This report confirms version `5.33.15`. Other package versions have not been checked. ### Details In `lib/processes.js`, `services()` sanitizes the caller's string with `sanitizeShellString()` and later inserts each resulting name into a `Get-CimInstance Win32_Service -Filter` command. The Windows branch passes that command to `util.powerShell()`. The sanitizer in `lib/util.js` removes the ASCII double quote, but it does not remove U+201C or U+201D, the left and right curly double quotation marks. It also permits spaces and parentheses when called in its default, non-strict mode. PowerShell accepts the curly marks as string delimiters, so an input can end the filter string and place a command expression in the generated command. For example, the input below uses curly quotation marks to end the generated filter string and execute `New-Item`. I reproduced this call on Windows against the checked-out `[email protected]` source; it created a marker file with the Node.js process account. ### Proof of concept Run this on Windows in a disposable directory with Node.js and PowerShell available: ```powershell mkdir si-command-injection-repro cd si-command-injection-repro npm init -y npm install [email protected] ``` Save the following as `poc.cjs`, then run `node poc.cjs`: ```js 'use strict'; const fs = require('node:fs'); const path = require('node:path'); const si = require('systeminformation'); (async () => { const markerName = `si-injection-${process.pid}.txt`; const markerPath = path.join(process.cwd(), markerName); fs.rmSync(markerPath, { force: true }); try { await si.services(`not-a-service” (New-Item -Name ${markerName} -ItemType File -Force) “`); console.log(`markerCreated=${fs.existsSync(markerPath)}`); } finally { fs.rmSync(markerPath, { force: true }); } })().catch((error) => { console.error(error); process.exitCode = 1; }); ``` Expected output: ```text markerCreated=true ``` The Windows run returned an array and created the marker (`markerCreated: true`). A benign input left the marker absent. The script removes the marker afterward. I did not identify an application network route that forwards remote input to `services()`, so remote exploitability depends on the consuming application. ### Impact An application that passes attacker-controlled input to `services()` on Windows can execute PowerShell commands with the Node.js process account's permissions. Depending on that account, commands may read or change accessible files, alter application data, or disrupt the service. I searched this repository for HTTP servers, route handlers, and listener calls and found none. `services()` is exposed through the package API and `getDynamicData()`, so a consuming application could make the input network-reachable if it forwards request data. A separate loopback HTTP harness did trigger the command through a query parameter, but that server was test code and is not part of this repository. The project's `docs/security.html` already warns that arbitrary untrusted input to `services()` needs caution because package sanitization does not cover every case.

Source published
28 Oct 2026 22:42:49 UTC
Source modified
28 Oct 2026 23:00:04 UTC
Observed here
28 Oct 2026 23:55:37 UTC
Source terms
GitHub Advisory Database · CC-BY-4.0

Original source record · Cite this exact observation · Complete original publisher JSON

This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: osv · GitHub Advisory Database · CC-BY-4.0. Source text is retained; field grouping and change labels are provided by ChangeIntel.

CVSS_V3 · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Publisher rating · HIGH

ChangeIntel

An IT change radar: releases, security, known issues, retirements, documentation changes, and service status from public sources. Every item links to supporting evidence; dates and statuses can change after they are read.

Sources read 1 Nov 21:27 UTC · 275 of 275 readable · 272 fully read · documentation 469/469 current