Install verification: runtime verified (L5) · tested on dsh 0.2.1-rc.2 · last checked Install verification details →
What it doesAI
Reverse proxy that exposes your DeepSeek Harness Web GUI on the LAN at port 3301 with added security, so phones and other devices can reach it.
- Proxies DSH to http://<machine-ip>:3301 for LAN-wide access
- Adds a security layer over direct port exposure
- Also ships as a DSH plugin for current DSH; standalone proxy still supported
Capability tags are AI-inferred or rule-extracted from the README (see badge) — vocabulary-limited, not install-verified. AI = inferred; README = literal keyword from the readme.
Installation
dsh plugin --profile web add github:Aztech-Lab/dsh-3301Install method: GitHub · runtime verified (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 | dsh 0.2.1-alpha.4 | dsh 0.2.1-alpha.2 |
|---|---|---|---|
| 2a5395 | ✓ | ✓ | ✓ |
2a5395github✓ 3 runtime-verified2026-10-19
https://github.com/Aztech-Lab/dsh-3301
✓dsh 0.2.1-rc.2current2026-10-19L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.2
- • Plugin artifact: github · https://github.com/Aztech-Lab/dsh-3301 (version unstated)
ID: dsh-3301@2a5395@dsh0.2.1-rc.2 · profile: l4-sandbox
Issued: 2026-10-19 · expires: 2026-10-26
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.1-alpha.42026-10-17L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.4
- • Plugin artifact: github · https://github.com/Aztech-Lab/dsh-3301 (version unstated)
ID: dsh-3301@2a5395@dsh0.2.1-alpha.4 · profile: l4-sandbox
Issued: 2026-10-17 · expires: 2026-10-24
View checks & evidence
active in loader tree (150 entries)
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✓dsh 0.2.1-alpha.22026-10-14L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.2
- • Plugin artifact: github · https://github.com/Aztech-Lab/dsh-3301 (version unstated)
ID: dsh-3301@2a5395@dsh0.2.1-alpha.2 · profile: l4-sandbox
Issued: 2026-10-14 · expires: 2026-10-21
View checks & evidence
active in loader tree (150 entries)
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-3301/)``[](https://www.dsh.so/artifact/dsh-3301/)`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.2.0dsh manifest0.2.0git2026-10-210.2.0same versionclean · gitVet is an AST static scan (npm artifact or git source).
show static findings (10)
- warningchildProcess · code-exec
lib/gate-auth.js:65const grant = spawnSync("icacls", [dir, "/grant:r", ...principals.map((id) => `${id}:(OI)(CI)F`)], { stdio: "ignore" }); - warningchildProcess · code-exec
lib/gate-auth.js:67const inherit = spawnSync("icacls", [dir, "/inheritance:r"], { stdio: "ignore" }); - warningchildProcess · code-exec
lib/gate-auth.js:69spawnSync("icacls", [dir, "/inheritance:e"], { stdio: "ignore" }); - warningfsWrite · files
lib/gate-auth.js:56fs.chmodSync(dir, 0o700); - warningfsWrite · files
lib/gate-auth.js:95fs.writeFileSync(file, `${JSON.stringify({ ...store, version: FILE_VERSION }, null, "\t")}\n`, { mode: 0o600 }); - warningfsWrite · files
lib/gate-auth.js:98fs.chmodSync(file, 0o600); - warningfsWrite · files
lib/index.js:92fs.writeFileSync(o.secretFile, secret, { mode: 0o600 }); - warningnetIp · network
tools/check-gate.mjs:16const BASE = `http://127.0.0.1:${PORT}`; - warningnetIp · network
tools/check.mjs:12const BASE = `http://127.0.0.1:${PORT}` - warningnetIp · network
tools/dry-run-plugin.mjs:15const BASE = `http://127.0.0.1:${PORT}`;
show 4 audit findings
- mediumSession-signing secret is read from a predictable shared temp path without ownership or type checks (cookie forgery)
lib/index.js:89The HMAC key that signs dsh_session cookies is taken verbatim from a fixed path in the shared temp directory (~/tmp/dsh-3301-secret on POSIX). writeFileSync's mode only applies at creation, and the read path never verifies owner or type, so an unprivileged local user (or any process that can pre-create that filename before the service starts) determines the signing key. That attacker can then forge a valid dsh_session cookie over the LAN and bypass the gate entirely without knowing the password.
- mediumGate listens on 0.0.0.0 over plain HTTP unless cert files happen to exist, exposing credentials and a 30-day cookie in cleartext
lib/index.js:185The default configuration binds all interfaces and serves HTTP; TLS is silently enabled only when both cert/key files already exist. On a LAN, Basic credentials and the 30-day dsh_session cookie (no Secure flag when TLS is off) cross the wire in clear text, so any on-path LAN attacker can capture and replay them, then use the proxy — and the proxy mints host-equivalent DSH sessions upstream.
- lowInjected bootstrap forces __DSH_TRANSPORT__.ownsHost=true, telling DSH a remote LAN page is the host
lib/client-bootstrap.js:32Every text/html response the proxy returns is patched so the client-side transport reports ownsHost:true. DSH's own fence is meant to grant host-backed persistent settings and host-native actions (e.g. opening a produced file) only to loopback pages; this injection grants that level of trust to any authenticated LAN browser, so a single gate password compromise (or a stolen session cookie) also carries host-plane capability rather than read-only GUI access.
- lowBasic-auth username/password compared with non-constant-time string equality
lib/index.js:128Credential verification uses plain string comparison, giving a (noisy, network-dependent) timing side channel on the gate password. Practical impact is limited — the per-IP lockout after 5 failures blunts repeated probing — but the cookie path already uses crypto.timingSafeEqual, so this is an inconsistency rather than a necessity.
Core proxy/auth logic is sound; moderate risks: signing secret from a predictable tmp path, HTTP-only LAN default, ownsHost trust injection; runtime entry lib/plugin.js not in the audited set.
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-09-13 · activity: Stable
• Repo created: 2026-09-13
• Stars: ★ 0 · Forks: 0
• Health: Stable — committed within 90 days
Source
GitHub: github.com/Aztech-Lab/dsh-3301
Author README
View on GitHub ↗The author's original README from the repository — fetched live, unedited (the English page loads the default README).
