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
DSH provider that mirrors and controls Android devices over adb/scrcpy, letting AI screenshot, read UI trees, tap, and type.
- Multi-device real-time screen mirroring via USB or paired wireless adb
- Mouse tap/swipe, back/home/volume/power keys and UHID virtual keyboard
- AI can screenshot, read control tree, tap by coordinates and inject text
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:ns-zzj/dsh-android-scrcpy#1.0.2Install 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 |
|---|---|---|---|
| 1.0.2 | ✗ | ✗ | ✗ |
1.0.2github3 failed2026-10-19
https://github.com/ns-zzj/dsh-android-scrcpy
✗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/ns-zzj/dsh-android-scrcpy#1.0.2
ID: dsh-android-scrcpy@1.0.2@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-17L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.4
- • Plugin artifact: github · https://github.com/ns-zzj/dsh-android-scrcpy#1.0.2
ID: dsh-android-scrcpy@1.0.2@dsh0.2.1-alpha.4 · profile: l4-sandbox
Issued: 2026-10-17 · expires: 2026-10-24
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-14L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.2
- • Plugin artifact: github · https://github.com/ns-zzj/dsh-android-scrcpy#1.0.2
ID: dsh-android-scrcpy@1.0.2@dsh0.2.1-alpha.2 · profile: l4-sandbox
Issued: 2026-10-14 · expires: 2026-10-21
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-android-scrcpy/)`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.2dsh manifest1.0.2git2026-10-211.0.2same versionclean · npmVet is an AST static scan (npm artifact or git source).
show static findings (6)
- warningnetIp · network
Dev/demo/demo-host.mjs:348log(`HTTP 起来了:http://127.0.0.1:${HTTP_PORT} (/devices /stream?sn= /touch /status)`) - warningchildProcess · code-exec
lib/index.js:120if (spawnSync('adb', ['version'], { stdio: 'ignore' }).status === 0) return { path: 'adb', source: 'PATH' } - warningchildProcess · code-exec
lib/index.js:706dev.serverProc = spawn(ADB, ['-s', sn, 'shell', cmd], { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true }) - warningshellExec · shell
lib/index.js:130execFile(bin, sn ? ['-s', sn].concat(args) : args, { maxBuffer: 16 * 1024 * 1024, windowsHide: true }, (err, stdout, stderr) => { - warningshellExec · shell
lib/index.js:142execFile(bin, ['version'], { windowsHide: true }, (err, stdout, stderr) => resolve({ err, stdout: String(stdout || ''), stderr: String(stder - warningshellExec · shell
lib/index.js:539execFile(ADB, ['-s', sn].concat(args), { encoding: 'buffer', maxBuffer: 64 * 1024 * 1024, windowsHide: true }, (err, stdout, stderr) => {
show 3 audit findings
- high'input' action falls back to unescaped adb shell command, allowing device-side command substitution
lib/index.js:973actionInput is registered as the provider's 'input' action and is driven by core/AI callers with caller-supplied text. When no scrcpy control socket exists (stream not started or lost), the text goes through `adb shell`. JSON.stringify only adds double quotes and escapes quotes/backslashes; inside double quotes the device's sh still expands `$(...)` and backticks, so text such as `$(pm install ...)` or `` `...` `` is executed by the device shell with adb-shell privileges. The text can originate from untrusted content (e.g. prompt injection via on-screen page content the agent is asked to type)
- lowDevice-reported PIDs concatenated into a 'kill -9' shell command without validation
lib/index.js:817serverPids comes from `pidof app_process` output on the device and is spliced into a device shell command verbatim. In practice pidof prints only numeric PIDs, so this is not currently exploitable; a corrupted/rooted ROM or a replaced pidof that emits non-numeric tokens (e.g. `1; cmd`) would be executed by the shell when streaming stops or the plugin is disposed.
- lowDev demo host exposes wildcard-CORS stream and touch endpoints (dev-only, not shipped)
Dev/demo/demo-host.mjsWhile the user manually runs this demo, any web page the user visits can read the H.264 screen stream and POST synthetic touches to the device via 127.0.0.1:8080, because the HTTP routes set ACAO * and handle the OPTIONS preflight with no Origin check (the shipped lib/index.js WS server does check Origin/Host). The file is excluded from package.json 'files' and is never imported by lib/index.js, so it has no runtime impact for installed plugin users.
Local Android/scrcpy provider with a good WS origin guard, but its 'input' action falls back to interpolating caller text into an unescaped adb shell command, allowing device-side command substitution.
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-30 · activity: Active
• Repo created: 2026-09-29
• Stars: ★ 1 · 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).
