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
DSH 插件:读取本机冒险岛客户端 WZ —— 浏览/搜索/图鉴/精灵图 GIF/纸娃娃(可坐椅子)/聊天气泡/地图背景/桌宠
Installation
dsh plugin --profile web add github:tzy502/dsh-maplestory-wzInstall 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 |
|---|---|---|
| 38c546 | ✗ | ✓ |
38c546github✓ 1 runtime-verified1 failed2026-10-19
https://github.com/tzy502/dsh-maplestory-wz
✗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/tzy502/dsh-maplestory-wz (version unstated)
ID: dsh-maplestory-wz@38c546@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-18L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.4
- • Plugin artifact: github · https://github.com/tzy502/dsh-maplestory-wz (version unstated)
ID: dsh-maplestory-wz@38c546@dsh0.2.1-alpha.4 · profile: l4-sandbox
Issued: 2026-10-18 · expires: 2026-10-25
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-maplestory-wz/)``[](https://www.dsh.so/artifact/dsh-maplestory-wz/)`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.
v1.0.0dsh manifest1.0.0git2026-10-211.0.0same versionclean · gitVet is an AST static scan (npm artifact or git source).
show static findings (10)
- warningchildProcess · code-exec
index.js:144child = spawn(dotnet, argv, { env, stdio: ['pipe', 'pipe', 'pipe'] }); - warningfsWrite · files
index.js:455await fs.writeFile(join(OUT_DIR, name), buf); - warningfsWrite · files
index.js:555await fs.writeFile(join(OUT_DIR, name), buf); - warningfsWrite · files
index.js:601await fs.writeFile(join(OUT_DIR, name), buf); - warningchildProcess · code-exec
lib/cmsdl.js:397proc = spawn(argv[0], argv.slice(1), { env: childEnv, stdio: ['ignore', 'pipe', 'pipe'] }); - warningnetIp · network
tools/restart-host.sh:34echo "host 已就绪:pid=$pid http://127.0.0.1:$PORT" - warningnetIp · network
tools/verify-commands.sh:11BASE="${1:-http://127.0.0.1:3099}" - warningcurlDownload · network
tools/verify-commands.sh:59code=$(curl -s -m 180 -o "$TMP/out.json" -w '%{http_code}' \ - warningnetIp · network
tools/verify-render.mjs:14const BASE = (process.argv[2] || 'http://127.0.0.1:3099').replace(/\/$/, ''); - warningnetIp · network
tools/verify.mjs:10const BASE = (process.argv[2] || 'http://127.0.0.1:3099').replace(/\/$/, '');
show 5 audit findings
- highCaller-supplied download URL (broad host whitelist) is chmod +x'd and executed as cmsdl
lib/cmsdl.jsapi.updateFetchTool passes payload.args straight into fetchTool. The only URL gate is a host whitelist that includes raw.githubusercontent.com and github.com/objects.githubusercontent.com, plus a ≥1 MB size check; any content on those hosts (e.g. raw.githubusercontent.com/<any-user>/<repo>/main/bin) is downloaded to ~/.dsh/wz-assets/cmsdl/cmsdl, chmod 0755, renamed over the installed tool and then executed by probe (--version/--help). Whoever can POST to /dsh-maplestory-wz/api gets code execution as the DSH user, and the binary persists for later updateResources runs.
- mediumHost /api parses any POST body without content-type, origin or CSRF checks and dispatches every method
index.jsThe handler never inspects content-type or Origin, so a cross-site simple request (text/plain body containing valid JSON) can trigger every side-effecting command: updateFetchTool/updateResources (spawn/download), backgroundSet (writes ~/.dsh/wz-assets/background.json), petSet/petSetChara, mapCanvas/mapMinimap (spawn worker + write PNG files). That is exactly the delivery vector that turns the high-severity download-and-execute capability into a drive-by attack, and it also lets any local page alter the plugin's persisted config.
- lowUnsanitised map id is interpolated into output file names written under wz-assets
index.jsmapMinimap/mapCanvas/mapBackground build the output filename from caller-controlled args.id/args.path with no separator check, then join() and write. The only protection is that the preceding callWz(...) must succeed for that id, so today a traversal-shaped id is expected to fail first; but any future worker leniency (or a lenient id lookup) turns this into writing a file outside ~/.dsh/wz-assets. The /file route already rejects '/' and '..', showing the intended invariant is not enforced on the write side.
- lowRequest body is buffered without size limit in the /api handler
index.jsAny client can stream an arbitrarily large body into memory before JSON.parse, letting a single request exhaust host memory and stall the DSH process that serves this plugin.
- lowHost-side 'do not write into WZ data dir' guard breaks on Windows path separators
lib/cmsdl.jsOn Windows path.resolve returns backslash-separated paths, so `${resolvedData}/` never prefixes `C:\\Data\\mxd\\Data` and hitsData stays false: the defence-in-depth check in run() silently stops blocking writes into the configured dataDir unless allow_data_dir is set. Only the unharvested worker-side plan.blocked check remains.
Host HTTP API lets any caller pick a download URL on a broad whitelist whose binary is chmod +x'd and executed; the same API has no CSRF/content-type gate.
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-18 · activity: Active
• Repo created: 2026-10-16
• Stars: ★ 0 · Forks: 0
• Health: Active — committed within last 30 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).
