@Mlte0907/dsh-remote-x avatar

@Mlte0907/dsh-remote-x

Plugin
Verification
L4 · Install tested
Failed
Risk
LowRisk
Health
Active
Trust
Silver

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.1
verified v0.3.1

Install 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

Declared DSH compatibilityfrom package.json · peerDependencies
author declared no dsh version requirement

○ The author declares no dsh version requirement — install is not blocked by version.

Install compatibility matrix (rows = plugin versions〔latest 5〕, columns = dsh versions〔latest 5〕)
At-a-glance → evidence in the cards below
plugin \ dshdsh 0.2.1-rc.2
current
v0.3.1✗
Install compatibility (by plugin version, dsh versions within)
Legend:✓ L5 runtime verified○ ecosystem plugin◼ ecosystem app✗ failed
v0.3.1github1 failed2026-10-19

https://github.com/Mlte0907/dsh-remote-x

✗dsh 0.2.1-rc.2current2026-10-19L5 · failed
Environment & artifact
  • • Node.js: v24.14.0
  • • DSH: 0.2.1-rc.2
  • • Plugin artifact: github · https://github.com/Mlte0907/dsh-remote-x#v0.3.1
Levels (L1–L3 plugin-level static archive · L4/L5 newest real verdicts for this combination)
L1 static
Passed
L2 static
Passed
L3 static
Passed
L4 sandbox
Passed
L5 runtime
Failed
Sandbox install failed
L5 · failed

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 · Found✓ Passed
Defaulted from L3✓ Passed
defaulted to passed — L3 install spec passed (full-registry L3 sweep policy)
L2 · Structured✓ Passed
Defaulted from L3✓ Passed
defaulted to passed — L3 install spec passed (full-registry L3 sweep policy)
L3 · Install spec✓ Passed
Install command parsed✓ Passed
Source: registry verification · Method: install spec parse · Captured 2026-10-18
DSH version declared✓ Passed
Source: registry verification · Method: DSH version declaration · Captured 2026-10-18
L4 · Install tested✓ Passed
Install executed in confined sandbox✓ Passed
Source: Windows ACL sandbox · Method: sandbox install run · Captured 2026-10-19
spec github:Mlte0907/dsh-remote-x#v0.3.1 · channel GitHub source · outcome ran · exit 0
check took: 2.3s
Install succeeded✓ Passed
Source: Windows ACL sandbox · Method: sandbox install run · Captured 2026-10-19
spec github:Mlte0907/dsh-remote-x#v0.3.1 · channel GitHub source · outcome ran · exit 0
check took: 2.3s
Installed artifact confirmed✓ Passed
Source: Windows ACL sandbox · Method: sandbox install run · Captured 2026-10-19
spec github:Mlte0907/dsh-remote-x#v0.3.1 · channel GitHub source · outcome ran · exit 0
check took: 2.3s
L5 · Run tested✕ Failed
Sandbox install passed✓ Passed
Source: Windows ACL sandbox · Method: sandbox install run · Captured 2026-10-19
spec github:Mlte0907/dsh-remote-x#v0.3.1 · install mode reused L4 scratch
check took: 0ms
Web boot ready✕ Failed
plugin tree failed to load
HTTP endpoint served✕ Failed

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:

dsh.so risk
`[![dsh.so risk](https://www.dsh.so/badge/dsh-remote-x.svg)](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.

dsh-remote-xAutomated review · daily

Static low, dynamic medium — stricter wins → overall medium.

static low→dynamic medium→overall medium
0 critical·0 high
mediumoverall · medium
1static scan · vet primaryvet AST static analysis (npm artifact or git source)
plugin versionv0.3.1dsh manifest
scanned versionv0.3.1git2026-10-21
current versionv0.3.1same version
vet verdictclean · git

Vet is an AST static scan (npm artifact or git source).

show static findings (11)
  • warningchildProcess · code-execbin/dsh-remote-x.mjs:89

    const child = spawn('cloudflared', ['tunnel', '--url', `http://127.0.0.1:${port}`, '--no-autoupdate'], {

  • warningnetIp · networkbin/dsh-remote-x.mjs:89

    const child = spawn('cloudflared', ['tunnel', '--url', `http://127.0.0.1:${port}`, '--no-autoupdate'], {

  • warningnetIp · networkdeploy/verify.sh:18

    BASE="http://127.0.0.1:$PORT/remote"

  • warningcurlDownload · networkdeploy/verify.sh:47

    code="$(curl -s -o /dev/null -w '%{http_code}' "$BASE/api/tasks")"

  • warningcurlDownload · networkdeploy/verify.sh:73

    curl -sN -m 25 "${AUTH[@]}" "$BASE/api/events?sessionId=$SID" > /tmp/zr-sse.txt 2>/dev/null

  • warningnetIp · networklib/tunnel-supervisor.mjs:167

    const res = await fetch(`http://127.0.0.1:${this._metricsPort}/metrics`)

  • warningnetIp · networklib/tunnel-supervisor.mjs:189

    const res = await fetch('https://1.1.1.1/cdn-cgi/trace', { signal: AbortSignal.timeout(3_000) })

  • warningchildProcess · code-execlib/tunnel.mjs:118

    const child = spawn(resolveBinary(), args, { stdio: ['ignore', 'pipe', 'pipe'] })

  • warningshellExec · shelllib/tunnel.mjs:57

    execFile('pkill', ['-f', `cloudflared tunnel --url http://127.0.0.1:${port}`], { timeout: 5_000 }, (err) => {

  • warningnetIp · networklib/tunnel.mjs:57

    execFile('pkill', ['-f', `cloudflared tunnel --url http://127.0.0.1:${port}`], { timeout: 5_000 }, (err) => {

  • warningnetIp · networklib/tunnel.mjs:107

    args.push('tunnel', '--url', `http://127.0.0.1:${port}`, '--no-autoupdate')

2model reads redacted source context · never executes plugin code
highest grademedium
merged intooverall medium
audited at2026-10-19
findings0 critical·0 high3 medium / 2 low hidden
show 5 audit findings
  • mediumAuthentication/proxy core (lib/proxy.mjs) and both runtime entries are missing from the submitted sourcebin/dsh-remote-x.mjs:16

    The 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 givenbin/dsh-remote-x.mjs:123

    The 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 HTTPbin/dsh-remote-x.mjs:82

    The 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 historybin/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 patternlib/tunnel.mjs:57

    The 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

Was this page helpful?