Install verification: Ecosystem plugin: installs via dsh plugin add but declares no dsh.bundle and mounts no plugin capability — the L1-L5 install ladder does not rate it; the security scan still runs.Install verification details →
What it does
鲸鱼娘陪玩
Installation
dsh plugin --profile web add github:bigk5780/dshInstall method: GitHub · runtime test inconclusive (L5 unknown)
Verification & Compatibility○ Ecosystem plugin
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 |
|---|---|
| d7cbba | ○ |
d7cbbagithub○ 1 ecosystem plugin2026-10-19
https://github.com/bigk5780/dsh
○dsh 0.2.1-rc.2current2026-10-19Ecosystem plugin
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.2
- • Plugin artifact: github · https://github.com/bigk5780/dsh (version unstated)
ID: dsh-6@d7cbba@dsh0.2.1-rc.2 · profile: l4-sandbox
Issued: 2026-10-19 · expires: 2026-10-26
View checks & evidence
not present in web-profile loader inventory
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-6/)`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 high — stricter wins → overall high.
v0.1.0dsh manifest0.1.0git2026-10-210.1.0same versionclean · gitVet is an AST static scan (npm artifact or git source).
show static findings (4)
- criticalbase64Blob · obfuscation
src/host/vision-api.mjs:209'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACESURBVFhH7dFBCsAgDETRHsz - warningshellExec · shell
src/host/collect.mjs:91execFile(file, args, options, (error, stdout, stderr) => { - warningchildProcess · code-exec
src/host/desktop-window.mjs:70child = spawn(binary, [path.join(OVERLAY_DIR, 'main.mjs')], { - warningnetIp · network
src/host/plugin.mjs:120const url = new URL(req.url ?? '/', 'http://127.0.0.1');
show 4 audit findings
- highUnauthenticated /config and /once routes let any web page repoint the vision API and exfiltrate screen captures
src/host/plugin.mjs:204The prefix route is registered on the local webServer with no token, Origin check or content-type check (readJson parses any body). Because cross-origin 'simple' POSTs (mode:'no-cors', text/plain) are not preflighted, a page the user merely visits can blindly POST a config patch setting visionApi.enabled=true, baseURL=<attacker host>, model and captureFullScreen=true, then POST /once; runCycle({force:true}) skips the enabled and game checks and describeImage() sends the screenshot to the attacker's endpoint before the text step can fail. Net effect: covert exfiltration of screen contents to an
- mediumScreenshots are silently uploaded to a hard-coded public third-party endpoint when no vision model is configured
src/host/advise.mjs:150When the user has not configured a custom vision API and the provider registry yields no image-capable candidate (the code comments state this is the normal case on the author's machine), describeImage() falls back to an anonymous OVHcloud endpoint and POSTs the base64 screenshot there without any consent step. The image is a full-screen or foreground-window capture, i.e. whatever the user has on screen; it leaves the machine to an operator unrelated to the user, and there is no UI switch to disable just this fallback (it is only mentioned inside GET /vision diagnostics).
- mediumGET /config returns the raw user config file, exposing the plaintext vision API key
src/host/plugin.mjs:198publicConfig() deliberately redacts visionApi.apiKey ('apiKey 永远只回"有没有",绝不回明文'), but the same response also embeds readUserConfig(), which is the verbatim contents of $DSH_HOME/dsh-game-pet.json — the file writeUserConfig() stores with the real key (writeUserConfig(accepted) persists accepted.visionApi.apiKey unchanged). Any client that can reach the route (a local process, another plugin, or a DNS-rebinding page) receives the API key in cleartext, contradicting the plugin's own secret-handling contract and enabling billable API abuse with the user's key.
- lowVision API key persisted in plaintext in $DSH_HOME/dsh-game-pet.json
src/host/config-store.mjs:33The key is written to a world-readable-by-default home file with no OS keychain or file-mode restriction; any process running as the user (or a backup/sync agent covering ~/.dsh) can read it. The plugin documents this in config.mjs, but it compounds the GET /config leak above.
Unauthenticated local routes let a web page repoint the vision API and trigger screen capture; screenshots also auto-upload to a hard-coded endpoint, and GET /config leaks the API key.
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-17 · activity: Active
• Repo created: 2026-10-16
• Stars: ★ 0 · Forks: 0
• Health: Active — committed within last 30 days
Source
GitHub: github.com/bigk5780/dsh
Author README
View on GitHub ↗The author's original README from the repository — fetched live, unedited (the English page loads the default README).
