CVE-2026-26280: Verified Repro With Script Download
CVE-2026-26280: systeminformation: Command Injection via WiFi Interface Parameter
CVE-2026-26280 is verified against systeminformation · npm. Affected versions: < 5.30.8. Fixed in 5.30.8. Vulnerability class: Command Injection. This high reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00104.
What Is CVE-2026-26280?
CVE-2026-26280 (GHSA-9c88-49p5-5ggf) is a high-severity command injection vulnerability in the npm package systeminformation's wifiNetworks() function, exploitable via an unsanitized network interface parameter in the retry code path. Pruva reproduced it (reproduction REPRO-2026-00104).
CVE-2026-26280 Severity & CVSS Score
CVE-2026-26280 is rated high severity, with a CVSS base score of 8.4 out of 10.
High — serious impact or readily exploitable. Prioritize remediation.
Affected systeminformation Versions
systeminformation · npm versions < 5.30.8 are affected.
How to Reproduce CVE-2026-26280
pruva-verify REPRO-2026-00104 curl -O https://pruva.dev/api/v1/reproductions/REPRO-2026-00104/artifacts/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh Proof of Reproduction for CVE-2026-26280
Reproduced by Pruva's autonomous agents — 107 tool calls over 20 min. Full root-cause analysis and the complete transcript are below.
How the agent worked
Root Cause and Exploit Chain for CVE-2026-26280
Summary
A command injection vulnerability exists in the wifiNetworks() function of the systeminformation npm package. The vulnerability allows an attacker to execute arbitrary OS commands via a malicious network interface (iface) parameter. The root cause is a logic error in the retry code path: while the iface parameter is sanitized before the initial call to getWifiNetworkListIw(), the setTimeout retry callback (triggered when the initial scan returns empty results) receives and uses the original unsanitized iface value, which is then passed directly to execSync() within a shell command.
Impact
- Package: systeminformation (npm)
- Affected Versions: < 5.30.8
- Fixed Version: 5.30.8
- CVE: CVE-2026-26280
- CVSS Score: 8.4 (High)
- CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
- CWE: CWE-78 (Improper Neutralization of Special Elements used in an OS Command)
Risk: Any application that passes user-controlled input to si.wifiNetworks() is vulnerable to arbitrary command execution with the privileges of the Node.js process. This could lead to complete system compromise.
Root Cause
The vulnerability is located in lib/wifi.js in the wifiNetworks() function. The code flow is:
- Line 428-436: The
ifaceparameter is sanitized usingutil.sanitizeShellString()and stored inifaceSanitized - Line 437: The first call uses the sanitized version:
getWifiNetworkListIw(ifaceSanitized) - Line 438-439: If this returns
-1(empty results), a retry is scheduled - Line 440 (VULNERABLE): The
setTimeoutcallback is defined assetTimeout((iface) => {...}, 4000)- it takesifaceas a parameter - Line 441 (VULNERABLE): Inside the callback,
getWifiNetworkListIw(iface)is called with the unsanitizedifaceparameter
The getWifiNetworkListIw() function then executes:
execSync(`export LC_ALL=C; iwlist ${iface} scan 2>&1; unset LC_ALL`, util.execOptsLinux)
This shell command injection allows arbitrary commands to be executed via the unsanitized iface parameter.
Fix Commit: https://github.com/sebhildebrandt/systeminformation/commit/22242aa56188f2bffcbd7d265a11e1ebb808b460
The fix changes:
setTimeout((iface) => {→setTimeout(() => {(remove parameter)getWifiNetworkListIw(iface)→getWifiNetworkListIw(ifaceSanitized)(use sanitized version)
Reproduction Steps
The reproduction script is at repro/reproduction_steps.sh.
What the script does:
- Installs the vulnerable version
systeminformation@5.30.7 - Examines the vulnerable code in
lib/wifi.js(line 440) - Creates a PoC that:
- Sets up a malicious
ifaceparameter containing shell injection (eth0; touch /tmp/pwned) - Demonstrates that
ifaceSanitizedremoves special characters - Shows the first call uses the sanitized version
- Simulates the vulnerable retry path where the original unsanitized
ifaceis used - Confirms command injection by detecting the malicious command
- Sets up a malicious
Expected Evidence:
The script outputs:
[PoC] Testing with malicious iface: eth0; touch /tmp/pwned
[PoC] Sanitized iface: eth0 touch /tmp/pwned
[PoC] In setTimeout, iface = eth0; touch /tmp/pwned
[PoC] WARNING: Command injection detected in iface parameter!
[PoC] SUCCESS! Command injection confirmed!
Evidence
Log Files:
logs/vulnerable_code.log- Contains the vulnerable code snippet from lib/wifi.js line 440logs/repro_output.log- Contains the full reproduction output with command injection confirmation
Key Evidence Excerpt:
--- Vulnerable code in lib/wifi.js (line 440) ---
const res = getWifiNetworkListIw(ifaceSanitized);
if (res === -1) {
// try again after 4 secs
setTimeout((iface) => {
const res = getWifiNetworkListIw(iface);
...
Reproduction Output:
[PoC] Testing with malicious iface: eth0; touch /tmp/pwned
[PoC] Sanitized iface: eth0 touch /tmp/pwned
[PoC] getWifiNetworkListIw called with: eth0 touch /tmp/pwned
[PoC] First call result: -1
[PoC] Simulating vulnerable retry with original unsanitized iface...
[PoC] In setTimeout, iface = eth0; touch /tmp/pwned
[PoC] getWifiNetworkListIw called with: eth0; touch /tmp/pwned
[PoC] WARNING: Command injection detected in iface parameter!
[PoC] Would execute: iwlist eth0; touch /tmp/pwned scan
[PoC] SUCCESS! Command injection confirmed!
Environment:
- Node.js v22.22.0
- npm 10.5.0
- systeminformation@5.30.7 (vulnerable)
Recommendations / Next Steps
Immediate Fix:
Upgrade to systeminformation@5.30.8 or later which contains the fix.
Testing Recommendations:
- Regression Test: Add a test case that verifies
wifiNetworks()properly sanitizes theifaceparameter in all code paths - Fuzzing: Test with various shell metacharacters:
;,&&,||,|,`,$(), etc. - Static Analysis: Use tools like Semgrep or ESLint security rules to detect similar patterns
Suggested Additional Fixes:
- Review all
setTimeoutandsetIntervalcallbacks that pass user input - Implement a security policy to sanitize all inputs at entry points, not just before first use
- Consider using parameterized commands or escaping instead of shell string interpolation
Additional Notes
Idempotency:
The reproduction script has been run twice successfully with identical results. The script is self-contained and:
- Creates a fresh test environment each run
- Cleans up all test artifacts after completion
- Works from any directory (uses portable
$ROOTdetection)
Edge Cases:
The vulnerability only triggers when:
- The first call to
getWifiNetworkListIw(ifaceSanitized)returns-1(resource busy/empty results) - The
setTimeoutretry callback is executed (4-second delay)
In environments with working wireless interfaces or where iwlist is not available, the vulnerability may not be triggered through normal API usage, but the vulnerable code path remains present.
Limitations:
The PoC demonstrates the injection capability without actually executing iwlist (which requires root privileges and wireless hardware). The simulation proves the vulnerable code path exists and would execute arbitrary commands in a production environment with the required conditions.
CVE-2026-26280 Reproduction Transcript
The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.
Full session Replay every step — scrub the timeline or play it back.
mkdir -p repro logs && which node npm/opt/node22/bin/node /opt/node22/bin/npm
#!/bin/bash
set -euo pipefail
# Portable root detection - works anywhere
ROOT="${PRUVA_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}"
LOGS="$ROOT/logs"
mkdir -p "$LOGS"
cd "$ROOT"
echo "=== Systeminformation Command Injection Reproduction ==="
echo "CVE-2026-26280 / GHSA-9c88-49p5-5ggf"
echo ""
# Install vulnerable version of systeminformation
echo "[1/4] Installing vulnerable systeminformation@5.30.7..."
rm -rf "$ROOT/test_repro"
mkdir -p "$ROOT/test_repro"
cd "$ROOT/test_repro"
npm init -y 2>/dev/nullArtifacts and Evidence for CVE-2026-26280
Scripts, logs, diffs, and output captured during the reproduction.
No artifacts available
How to Fix CVE-2026-26280
Upgrade systeminformation · npm to 5.30.8 or later.
FAQ: CVE-2026-26280
How does the CVE-2026-26280 command-injection attack work?
Which systeminformation versions are affected by CVE-2026-26280, and where is it fixed?
How severe is CVE-2026-26280?
How can I reproduce CVE-2026-26280?
References for CVE-2026-26280
Authoritative sources for CVE-2026-26280 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.