Technical assessment
The artifact contains a Python exploit script (poc/poc.py) that performs unauthenticated remote code execution against 9Router versions 0.4.30 to 0.4.36 by registering a malicious MCP plugin and triggering its command via SSE. It also includes a control harness (poc/control_test.py) that checks exploitability without executing a payload, and a writeup (README.md) describing the vulnerability chain.
Backdoor review
No backdoor observed in reviewed code
The supplied text evidence describes a legitimate PoC for CVE-2026-46339. The Python scripts (poc.py, control_test.py) perform only the documented exploit steps against a target specified by the user, using a harmless echo command in the control harness and a standard id command in the main PoC. No concealed executable behavior, persistence, credential theft, or unrelated payload is present in the reviewed text.
Model confidence100%
AuthenticationNot required
LanguagesPythonMarkdown
Target software9router
Attack typesOS Command InjectionMissing Authentication
Evidence & reasoningClassification basis · observed behavior · safety review
Technical evidenceClassification basis and observed behavior
Classification basis
The file poc/poc.py is a complete exploit that exercises the vulnerability by registering a malicious plugin and executing an arbitrary OS command on the target, as described in its docstring and implemented in the exploit() function. The control_test.py file is a scanner that checks for exploitability without executing a payload, but the primary artifact includes an exploit script, making the overall classification 'exploit'.
poc/poc.py:1-153poc/control_test.py:1-80Requirements
- Target must be running a vulnerable version of 9router (>= 0.4.30, < 0.4.37) with the unprotected /api/cli-tools/* and /api/mcp/* routes exposed.
README.md:22-24 - Network access to the target's HTTP port.
poc/poc.py:37
Observed behavior
- Sends an unauthenticated POST request to /api/cli-tools/cowork-settings with a JSON payload containing a customPlugins array that includes an attacker-controlled command and arguments.
poc/poc.py:55-74 - Opens an SSE connection to /api/mcp/{plugin_name}/sse, which causes the server to spawn the registered command and stream its stdout back to the attacker.
poc/poc.py:77-103 - Checks the SSE stream for a unique marker and the output of the 'id' command to confirm successful remote code execution.
poc/poc.py:128-134
Safety-review evidenceBehaviors behind the backdoor verdict
Observables
- Command Execution
- /bin/sh -c 'echo <marker>; id'The main PoC (poc.py) executes a command on the target to demonstrate RCE, which is the stated purpose of the exploit.
poc/poc.py:52 - Command Execution
- /bin/echo eip-controlThe control harness (control_test.py) uses a harmless echo command to test exploitability without executing a payload, as documented.
poc/control_test.py:48 - Network Connection
- http://{host}:{port}/api/cli-tools/cowork-settingsThe PoC sends a POST request to the vulnerable endpoint to register a malicious plugin, which is the first step of the documented attack chain.
poc/poc.py:68
Review boundariesWhat the analysis did not establish
- Two binary archive files (assets/9router-0.4.36.tgz and assets/9router-0.4.37.tgz) are present but were not analyzed; their contents could contain additional exploit or scanner code not visible in the text files.
- The evidence packet reports complete_artifact_coverage as false, indicating that not all files in the artifact were inspected, though all selected text files are complete.
- Two binary archive files (9router-0.4.36.tgz, 9router-0.4.37.tgz) are present in the artifact but were not analyzed; their contents could theoretically contain unrelated malicious code, though the text evidence gives no reason to suspect this.
Model interpretationThis review is limited to the supplied PoC code and context. It does not assert that the code works or is safe to execute.