Skip to content

CVE-2026-72573: Verified Reproduction

CVE-2026-72573: Authenticated command injection in pm2panel's /restart handler allows remote shell command execution on the host.

CVE-2026-72573 is verified against 4xmen/pm2panel · GitHub / Node.js web application. Affected versions: All versions (version 0 affected per CVE record, defaultStatus unknown). Fixed in None identified - no fix available. Vulnerability class: Command Injection. This high reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00334.

REPRO-2026-00334 4xmen/pm2panel · GitHub / Node.js web application Command Injection Aug 23, 2026 CVE entry .txt
Severity
HIGH
Confidence
HIGH
Reproduced in
14m 14s
Tool calls
174
Spend
$1.48
01 · Overview

What Is CVE-2026-72573?

CVE-2026-72573 is a high-severity Command Injection vulnerability affecting 4xmen/pm2panel All versions (version 0 affected per CVE record, defaultStatus unknown). Pruva has independently reproduced it and publishes a verified, runnable proof-of-concept (reproduction REPRO-2026-00334).

02 · Severity & CVSS

CVE-2026-72573 Severity

CVE-2026-72573 is rated high severity.

HIGH threat level
03 · Affected Versions

Affected 4xmen/pm2panel Versions

4xmen/pm2panel · GitHub / Node.js web application versions All versions (version 0 affected per CVE record, defaultStatus unknown) are affected.

How to Reproduce CVE-2026-72573

$ pruva-verify REPRO-2026-00334
or curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00334/artifacts/bundle/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh
Run in a VM or disposable container. This exploits a real vulnerability.
06 · Proof of Reproduction

Proof of Reproduction for CVE-2026-72573

Remote code execution — reproduced
  • reached the target end-to-end
  • full exploit chain demonstrated
  • on the real production code path
  • high confidence
  • the upstream fix blocks the same trigger
Trigger

req.query.id in authenticated HTTP GET /restart endpoint

Attack chain
  1. POST /loginCheck (auth)
  2. GET /restart?id=0;touch /tmp/pm2panel_pwned (command injection via child_process.exec)
How the agent worked 433 events · 174 tool calls · 14 min
14 minDuration
174Tool calls
124Reasoning steps
433Events
18Dead-ends
Agent activity over 14 min
Policy
1
Support
14
Repro
202
Judge
92
Variant
119
Verify
1
0:0014:00

Root Cause and Exploit Chain for CVE-2026-72573

Versions: All versions (commit dd2a7d2e8cb4dacefb618ab54b0a8f7dc6742fa0, latest on master)

The 4xmen/pm2panel web application contains an OS command injection vulnerability in the authenticated /restart HTTP endpoint. The handler at line 188 of pm2panel.js concatenates the attacker-controlled req.query.id query parameter directly into a child_process.exec() shell command (exec("pm2 restart " + req.query.id)). Because exec invokes /bin/sh, shell metacharacters such as ;, &&, |, backticks, or $() in the id parameter are interpreted by the shell, allowing an authenticated attacker to execute arbitrary commands on the host with the privileges of the pm2panel process.

  • Package/component affected: 4xmen/pm2panel (Node.js web application, pm2panel.js)
  • Affected versions: All versions (commit dd2a7d2e8cb4dacefb618ab54b0a8f7dc6742fa0, latest on master)
  • Risk level: High — authenticated remote code execution
  • Consequences: An attacker with valid panel credentials (default: admin/admin) can execute arbitrary shell commands on the host server, leading to full system compromise, data exfiltration, lateral movement, or service disruption.

Impact Parity

  • Disclosed/claimed maximum impact: Code execution (CWE-78, OS command injection)
  • Reproduced impact from this run: Full arbitrary command execution — a marker file was created on the host filesystem via an injected touch command through the authenticated /restart endpoint
  • Parity: full
  • Not demonstrated: N/A — the full claimed impact was demonstrated

Root Cause

The /restart route handler in pm2panel.js (line 188) constructs a shell command by directly string-concatenating the user-supplied req.query.id query parameter:

app.get('/restart', function (req, res) {
    if (!req.session.islogin) {
        // redirect to login...
    } else {
        if (req.query.id) {
            exec("pm2 restart " + req.query.id, (error, stdout, stderr) => {
                // ...
            });
        }
    }
});

child_process.exec() spawns a shell (/bin/sh -c) to run the command. The req.query.id value is never validated, sanitized, or shell-escaped. When an attacker sends a request like GET /restart?id=0; touch /tmp/pm2panel_pwned, the shell interprets the ; as a command separator and executes touch /tmp/pm2panel_pwned in addition to pm2 restart 0.

The same vulnerable pattern exists in four other handlers:

  • /start (line 218): exec("pm2 start " + req.query.id)
  • /stop (line 248): exec("pm2 stop " + req.query.id)
  • /delete (line 278): exec("pm2 delete " + req.query.id)
  • /addProccess (line 149): exec('pm2 start "' + req.body.path + '"')

No fix commit has been identified; the vulnerability is present in the latest commit on master.

Reproduction Steps

  1. Reference script: bundle/repro/reproduction_steps.sh
  2. What the script does:
    • Clones/reuses the 4xmen/pm2panel repository from the project cache
    • Installs system dependencies (libpam0g-dev) and npm dependencies (including native node-linux-pam module)
    • Installs and starts PM2 with a demo process (id 0)
    • Starts the pm2panel Express web application on port 3001
    • Authenticates via POST /loginCheck with default credentials (admin/admin)
    • Sends an authenticated GET /restart?id=0; touch /tmp/pm2panel_pwned_<pid> request
    • Verifies the marker file was created (proving arbitrary command execution)
    • Runs negative controls: unauthenticated request is rejected (302 redirect), safe request without injection does not create a marker
  3. Expected evidence of reproduction:
    • Marker file exists at /tmp/pm2panel_pwned_* after the exploit request
    • HTTP 302 response from the exploit endpoint (normal redirect behavior)
    • Unauthenticated requests return 302 redirect to /login
    • Safe restart requests (no injection) do not create marker files

Evidence

  • Log files:

    • bundle/logs/reproduction_steps.log — full script execution log
    • bundle/logs/pm2panel_service.log — pm2panel application server log
    • bundle/logs/artifacts/http/response_login.txt — login response with session cookie
    • bundle/logs/artifacts/http/request_exploit.txt — exploit request details
    • bundle/logs/artifacts/http/response_exploit.txt — exploit HTTP response (302)
    • bundle/logs/artifacts/http/marker_evidence.txt — marker file existence and stat output
    • bundle/logs/artifacts/http/response_unauth.txt — unauthenticated request response (302 redirect)
    • bundle/logs/artifacts/http/safe_restart_status.txt — safe restart response code
    • bundle/repro/runtime_manifest.json — structured runtime evidence manifest
  • Key excerpts:

    • Exploit request: GET /restart?id=0;%20touch%20/tmp/pm2panel_pwned_3850 HTTP/1.1
    • Exploit response: HTTP/1.1 302 Found with Location: /
    • Marker evidence: MARKER_FILE_EXISTS=true with stat output showing file creation timestamp
    • Negative control (unauthenticated): 302 redirect to /login
    • Negative control (safe): no marker file created
  • Environment:

    • Node.js v24.18.0, npm 11.16.0
    • PM2 v7.0.3
    • pm2panel commit dd2a7d2e8cb4dacefb618ab54b0a8f7dc6742fa0
    • Linux x86_64, Express 4.x, express-session

Recommendations / Next Steps

  1. Fix: Replace child_process.exec with child_process.execFile (which does not invoke a shell) and pass req.query.id as a separate argument array, or validate req.query.id against a strict numeric regex before use.
  2. Defense in depth: Implement input validation on all endpoints that accept process IDs (/start, /stop, /delete, /addProccess).
  3. Authentication: Change default credentials from admin/admin and enforce strong password policies.
  4. Upgrade guidance: No patched version exists. Users should apply the fix manually or discontinue use of the panel.
  5. Testing: Add integration tests that send shell metacharacters in query parameters and assert they are not interpreted by the shell.

Additional Notes

  • Idempotency: The script uses process-specific marker file names (with $$ PID suffix) and cleans up PM2 processes and the pm2panel server on each run. It was verified to pass on two consecutive executions.
  • Authentication requirement: The vulnerability requires authentication. The script performs a proper login flow with POST /loginCheck and session cookie extraction before sending the exploit request.
  • Multiple vulnerable endpoints: The same command injection pattern affects /start, /stop, /delete, and /addProccess in addition to /restart. The reproduction focuses on /restart as specified in the claim.

CVE-2026-72573 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.

Event 1/40
0:000:39
0:00
session startedaccounts/fireworks/routers/glm-5p2-fast · CVE-2026-72573 · REPRO-20
0:02
0:03
0:04
web search
0:09
0:09
extract_facts
no facts extracted
0:09
error

Unknown error

0:17
0:17
extract_facts
no facts extracted
0:18
0:18
0:19
supportclaim_contract
0:24
0:24
0:24
0:24
0:26
0:26
0:26
0:26
0:26
0:27
0:27
0:29
0:29
0:34
0:34
0:34
error

Unknown error

0:34
0:39
08 · How to Fix

How to Fix CVE-2026-72573

Upgrade 4xmen/pm2panel · GitHub / Node.js web application to None identified - no fix available or later.

Coming soon

Step-by-step mitigation and hardening guidance for CVE-2026-72573 — configuration checks, workarounds where no patch exists, and how to verify you're protected — is on the way.

10 · FAQ

FAQ: CVE-2026-72573

Is CVE-2026-72573 exploitable?

Yes. Pruva independently reproduced CVE-2026-72573 in 4xmen/pm2panel and verified the exploit fires end-to-end in a sandboxed environment. A runnable proof-of-concept script and the full agent transcript are on this page (reproduction REPRO-2026-00334).

How severe is CVE-2026-72573?

CVE-2026-72573 is rated high severity.

What type of vulnerability is CVE-2026-72573?

CVE-2026-72573 is classified as CWE-78 (OS Command Injection) (Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')), a Command Injection vulnerability.

Which versions of 4xmen/pm2panel are affected by CVE-2026-72573?

4xmen/pm2panel All versions (version 0 affected per CVE record, defaultStatus unknown) is affected by CVE-2026-72573.

Is there a fix for CVE-2026-72573?

Yes. CVE-2026-72573 is fixed in 4xmen/pm2panel None identified - no fix available. Upgrading to the fixed version remediates the issue.

How can I reproduce CVE-2026-72573?

Pruva provides a verified reproduction script on this page. Download it and run it inside an isolated environment such as a container or virtual machine — never against production. The reproduction was confirmed end-to-end by Pruva's automated agents.

Is the CVE-2026-72573 reproduction verified?

Yes. Pruva reproduced CVE-2026-72573 with high confidence in a sandboxed environment, capturing the full agent transcript and artifacts as evidence.
11 · References

References for CVE-2026-72573

Authoritative sources for CVE-2026-72573 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.