Install verification: sandbox install ok, web smoke failed (L5) · tested on dsh 0.2.1-rc.2 · last checked Install verification details →
What it does
Installation
dsh plugin --profile web add github:Mlte0907/dsh-remote-x#v0.3.1Install method: GitHub · sandbox install ok, web smoke failed (L5)
Verification & Compatibility
Grouped by plugin version: each card lists the dsh versions actually tested against that artifact version and their install verdicts (L5 wins). Untested combinations are omitted — absence means untested, never assumed compatible. L1–L3 are a plugin-level static archive (independent of the dsh version — the same verdict on every dsh row): they sit in each row's level grid next to L4/L5, marked "static", while their evidence is stored once per plugin inside that row's "checks & evidence" instead of being duplicated per version.
External credentials (plugin-level): none detected
○ The author declares no dsh version requirement — install is not blocked by version.
| plugin \ dsh | dsh 0.2.1-rc.2 current |
|---|---|
| v0.3.1 | ✗ |
v0.3.1github1 failed2026-10-19
https://github.com/Mlte0907/dsh-remote-x
✗dsh 0.2.1-rc.2current2026-10-19L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.2
- • Plugin artifact: github · https://github.com/Mlte0907/dsh-remote-x#v0.3.1
ID: dsh-remote-x@v0.3.1@dsh0.2.1-rc.2 · profile: l4-sandbox
Issued: 2026-10-19 · expires: 2026-10-26
View checks & evidence
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
Author badges
Embed the official badges in your README to showcase security & install-test status:
`[](https://www.dsh.so/artifact/dsh-remote-x/)`Security Report
Two automated layers, neither a manual review: a static scan (per-plugin rule checks) and a model-driven dynamic security audit that covers only the subset static-flagged at warn or above and never executes plugin code.
Static low, dynamic medium — stricter wins → overall medium.
v0.3.1dsh manifestv0.3.1git2026-10-21v0.3.1same versionclean · gitVet is an AST static scan (npm artifact or git source).
show static findings (11)
- warningchildProcess · code-exec
bin/dsh-remote-x.mjs:89const child = spawn('cloudflared', ['tunnel', '--url', `http://127.0.0.1:${port}`, '--no-autoupdate'], { - warningnetIp · network
bin/dsh-remote-x.mjs:89const child = spawn('cloudflared', ['tunnel', '--url', `http://127.0.0.1:${port}`, '--no-autoupdate'], { - warningnetIp · network
deploy/verify.sh:18BASE="http://127.0.0.1:$PORT/remote" - warningcurlDownload · network
deploy/verify.sh:47code="$(curl -s -o /dev/null -w '%{http_code}' "$BASE/api/tasks")" - warningcurlDownload · network
deploy/verify.sh:73curl -sN -m 25 "${AUTH[@]}" "$BASE/api/events?sessionId=$SID" > /tmp/zr-sse.txt 2>/dev/null - warningnetIp · network
lib/tunnel-supervisor.mjs:167const res = await fetch(`http://127.0.0.1:${this._metricsPort}/metrics`) - warningnetIp · network
lib/tunnel-supervisor.mjs:189const res = await fetch('https://1.1.1.1/cdn-cgi/trace', { signal: AbortSignal.timeout(3_000) }) - warningchildProcess · code-exec
lib/tunnel.mjs:118const child = spawn(resolveBinary(), args, { stdio: ['ignore', 'pipe', 'pipe'] }) - warningshellExec · shell
lib/tunnel.mjs:57execFile('pkill', ['-f', `cloudflared tunnel --url http://127.0.0.1:${port}`], { timeout: 5_000 }, (err) => { - warningnetIp · network
lib/tunnel.mjs:57execFile('pkill', ['-f', `cloudflared tunnel --url http://127.0.0.1:${port}`], { timeout: 5_000 }, (err) => { - warningnetIp · network
lib/tunnel.mjs:107args.push('tunnel', '--url', `http://127.0.0.1:${port}`, '--no-autoupdate')
show 5 audit findings
- mediumAuthentication/proxy core (lib/proxy.mjs) and both runtime entries are missing from the submitted source
bin/dsh-remote-x.mjs:16The only access-control layer between the network and a code-execution-capable dsh web UI is implemented in lib/proxy.mjs, which is not present; likewise package.json points entry '.' at ./src/index.ts and src/client/index.ts states 'DSH 模块加载器加载 dist/client.js', neither of which was provided. Token/nonce validation, path-routing and header forwarding therefore cannot be verified, so a bypass vulnerability would be invisible in this audit.
- mediumProxy always binds 0.0.0.0 and prints credential-free URLs when no --access-key/--token is given
bin/dsh-remote-x.mjs:123The default invocation documented as 'LAN mode' exposes port 3081 on every interface, and with no access key or --token, publicUrl() yields the bare `${base}/` (line 83) which is printed and encoded as a QR code. Anyone on the same network reaching that port is handed the dsh remote-control surface; whether they are stopped depends on the unsubmitted lib/proxy.mjs and on dsh web's own login, not on anything visible here.
- mediumLong-lived access key is carried in the URL path and served over plaintext HTTP
bin/dsh-remote-x.mjs:82The persistent key (recommended mode, '手机地址永不过期') travels in the request path, so it is recorded in cloudflared/proxy access logs, browser history, cached links and any Referer sent by the page to third-party resources; LAN URLs use http:// (line 135), so the key is also readable by anyone sniffing the Wi-Fi. Leakage equals full control of a code-execution session.
- lowAccess key / token accepted on the command line, visible in process list and shell history
bin/dsh-remote-x.mjs:53`dsh-remote-x --access-key <key>` exposes the bearer credential of the code-execution UI to `ps` for other local users and persists it in shell history; the same applies to --token (line 54).
- lowOrphan cleanup kills any process whose command line matches a pkill pattern
lib/tunnel.mjs:57The pidfile branch validates /proc/<pid>/cmdline, but the pkill fallback does not: any user process (wrapper shell, editor, log viewer) whose command line happens to contain the string 'cloudflared tunnel --url http://127.0.0.1:<port>' will be SIGTERMed whenever a tunnel starts. Ports are numeric, so no shell injection, and impact is limited to killing local processes.
CLI-style plugin proxying a code-execution-capable dsh web UI to 0.0.0.0 and a public tunnel; auth core (lib/proxy.mjs) and runtime entries are not in the submitted source, and long-lived keys ride in URL paths over plaintext HTTP.
Rule: the dynamic audit can only raise risk, never lower it (raise-only, never an exemption); a wrong raise is withdrawn by human review and the tier falls back to the static verdict. Overall verdict = the stricter of the two layers.
Disclaimer: the static scan and the dynamic security audit are both automated analysis, not a security guarantee. Always review what you install.
Activity
Last commit 2026-10-21 · activity: Active
• Repo created: 2026-09-04
• Stars: ★ 0 · Forks: 0
• Health: Active — committed within last 30 days
Source
GitHub: github.com/Mlte0907/dsh-remote-x
Author README
View on GitHub ↗The author's original README from the repository — fetched live, unedited (the English page loads the default README).
