XSpeeder SXZOS Pre-Auth eval() Remote Code Execution (CVE-2025-54322)
by Chirag Artani (Sachinart); original discovery credited to pwn.ai · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-54322
- Category
- network
- Affected product
- XSpeeder SXZOS firmware (SD-WAN devices, routers, edge networking equipment)
- Affected versions
- Per source repository — SXZOS firmware builds with the vulnerable Django-based web interface exposed; vendor unresponsive, no patched version identified
- Disclosed
- 2026-07-06
- Patch status
- unpatched
Tags
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-06 |
| Last Updated | 2026-07-06 |
| Author / Researcher | Chirag Artani (Sachinart); original discovery credited to pwn.ai |
| CVE / Advisory | CVE-2025-54322 |
| Category | network |
| Severity | Critical |
| CVSS Score | 10.0 (per NVD; source lists 9.8+) |
| Status | Weaponized |
| Tags | xspeeder, sxzos, sd-wan, router, firmware, python, django, eval-injection, pre-auth, rce, cwe-95 |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | XSpeeder SXZOS firmware (SD-WAN devices, routers, edge networking equipment) |
| Versions Affected | Per source repository — SXZOS firmware builds with the vulnerable Django-based web interface exposed; vendor unresponsive, no patched version identified |
| Language / Platform | Python 3 scanner targeting a Django-based embedded web interface on the device |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
XSpeeder SXZOS firmware exposes a Django-based web endpoint that passes a base64-decoded, attacker-controlled chkid query parameter into Python’s eval(). Because there is no authentication check on this endpoint and no sanitization of the decoded payload, an unauthenticated remote attacker can execute arbitrary Python (and by extension OS commands via os.system/subprocess) with root privileges on the device. scanner.py is a genuine multithreaded scanner that reproduces the full exploit chain end-to-end: it computes a time-based nonce, “warms up” a session against /webInfos/, crafts a base64-encoded eval() payload appended with a #sUserCodexsPwd comment (used to defeat a naive string filter), and sends it as the chkid parameter alongside decoy title/oIp parameters to preserve the expected 3-parameter request shape. A successful hit is detected by regexing the HTTP response for id-command output (uid=0(root) gid=0(root)), confirming root-level command execution. The vendor advisory states roughly 70,000+ internet-facing hosts were affected at time of disclosure.
Vulnerability Details
Root Cause
The vulnerable endpoint base64-decodes the chkid query parameter and passes the decoded string directly into Python’s eval() (or an equivalent code-execution sink) with no authentication and no input validation. The PoC’s payload construction illustrates the exact injection shape used against the endpoint:
| |
The trailing #sUserCodexsPwd comment appears to be required to satisfy/bypass a server-side string check on the decoded value before it reaches eval().
Attack Vector
- Attacker computes a time-based nonce (
int(time.time() / 60) % 7) and sends it in anX-SXZ-Rheader together with a spoofedUser-Agent: SXZ/2.3, bypassing an Nginx front-end check that gates on user-agent and header timing. - Attacker issues a “warm-up”
GET /webInfos/request with the same headers to establish the session state the vulnerable endpoint expects. - Attacker base64-encodes a Python payload (e.g. running
id) suffixed with#sUserCodexsPwdand sendsGET /?title=ABC&oIp=XXX&chkid=<payload>— maintaining exactly 3 query parameters, which appears to be required by request validation logic. - The Django backend decodes
chkidand evaluates it, executing the embedded OS command with root privileges; the command output (e.g.uid=0(root) gid=0(root)) is reflected back in the HTTP response body, which the scanner detects via regex.
Impact
A remote, unauthenticated attacker achieves arbitrary command execution as root on the affected SD-WAN/router device, resulting in complete compromise of the device and any traffic or networks it mediates. At internet scale (~70,000+ exposed hosts per the source), this enables mass exploitation for botnet recruitment, traffic interception, or lateral movement into connected networks.
Environment / Lab Setup
Target: XSpeeder SXZOS device with the vulnerable Django web interface reachable over HTTP/HTTPS
(commonly on ports 4433/8443 per example target lists)
Attacker: Python 3.7+, `pip install requests urllib3`
Proof of Concept
PoC Script
See
scanner.pyin this folder.
| |
Confirmed-vulnerable hosts and their id command output are written in real time to vuln-confirm.txt.
Detection & Indicators of Compromise
Requests to "/?title=*&oIp=*&chkid=*" carrying base64 payloads
User-Agent: SXZ/2.3
X-SXZ-R header present with single-digit (0-6) value
Base64-decoded chkid values containing "#sUserCodexsPwd"
GET /webInfos/ immediately preceding a request to "/"
Signs of compromise:
- Web/access logs showing
GET /webInfos/followed within seconds by aGET /?title=...&oIp=...&chkid=...from the same source. - HTTP responses containing unexpected
uid=/gid=output, Python tracebacks, orsubprocess/CalledProcessErrorstrings. - Unusual outbound connections or new processes spawned by the device’s web service process shortly after such requests.
Remediation
| Action | Detail |
|---|---|
| Primary fix | No official patch identified at time of mirroring — vendor (XSpeeder) reported unresponsive after 7+ months of outreach; see references. |
| Interim mitigation | Immediately remove affected devices from public internet exposure, segment them behind a firewall/VPN, and block requests where the chkid query parameter is present (e.g. if ($args ~* "chkid=") { return 403; } at a front-end Nginx/WAF layer). |
References
Notes
Mirrored from https://github.com/Sachinart/CVE-2025-54322 on 2026-07-06. scanner.py is a genuine multithreaded pre-auth RCE scanner with nonce/header calculation targeting XSpeeder SXZOS endpoints; original vulnerability discovery is credited by the author to the pwn.ai autonomous research platform.
| |