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
Lets the AI drive a real local browser via CDP to navigate, read, click, type, and capture screenshots into chat.
- Full browser control: navigate, read, click, type
- Screenshots embedded directly into chat
- Guest-mode isolated, zero dependencies
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 dsh-browser-ctrlInstall method: npm · 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 |
|---|---|---|---|---|---|
| 0.1.0 | ✗ | ✗ | ✗ | ✗ | ✗ |
0.1.0npm12 failed2026-10-19
dsh-browser-ctrl
✗dsh 0.2.1-rc.2current2026-10-19L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.2
- • Plugin artifact: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@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: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@dsh0.2.1-alpha.4 · profile: l5-web-smoke
Issued: 2026-10-17 · expires: 2027-01-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.1-alpha.22026-10-11L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.1-alpha.2
- • Plugin artifact: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@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-09L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.0-rc.2
- • Plugin artifact: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@dsh0.2.0-rc.2 · profile: l4-sandbox
Issued: 2026-10-09 · expires: 2026-10-16
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-30L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.2.0-rc.1
- • Plugin artifact: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@dsh0.2.0-rc.1 · profile: l4-sandbox
Issued: 2026-09-30 · expires: 2026-10-07
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-26L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.7-rc.2
- • Plugin artifact: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@dsh0.1.7-rc.2 · profile: l5-web-smoke
Issued: 2026-09-26 · expires: 2026-12-25
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-24L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.7-rc.1
- • Plugin artifact: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@dsh0.1.7-rc.1 · profile: l4-sandbox
Issued: 2026-09-24 · expires: 2026-10-01
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.22026-09-20L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.6-alpha.2
- • Plugin artifact: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@dsh0.1.6-alpha.2 · profile: l3-fullscan
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: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@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-13L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.5-rc.2
- • Plugin artifact: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@dsh0.1.5-rc.2 · profile: l4-sandbox
Issued: 2026-09-13 · expires: 2026-09-20
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-09L5 · failed
- • Node.js: v24.14.0
- • DSH: 0.1.3-alpha.2
- • Plugin artifact: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@dsh0.1.3-alpha.2 · profile: l4-sandbox
Issued: 2026-09-09 · expires: 2026-09-16
View checks & evidence
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: npm · dsh-browser-ctrl@0.1.0
ID: dsh-browser-ctrl@0.1.0@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.
Only the latest 3 published versions are shown; source-snapshot (commit hash) groups, unstated groups and older versions are omitted — the full archive stays in the data layer (snapshot/unstated groups appear only when a plugin has no published version).
Author badges
Embed the official badges in your README to showcase security & install-test status:
`[](https://www.dsh.so/artifact/dsh-browser-ctrl/)`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 (authoritative when present) → overall medium.
v0.1.0dsh manifest0.1.0npm2026-10-250.1.0same versionclean · npmVet is an AST static scan (npm artifact or git source).
show static findings (5)
- warningchildProcess · code-exec
lib/index.js:174const proc = spawn(exe, args, { stdio: "ignore", windowsHide: true }); - warningshellExec · shell
lib/index.js:224execFile("powershell.exe", ["-NoProfile", "-Command", - warningnetIp · network
lib/index.js:202const ping = await fetch(`http://127.0.0.1:${port}/json/version`, { signal: AbortSignal.timeout(1500) }) - warningnetIp · network
lib/index.js:264const res = await fetch(`http://127.0.0.1:${debugPort}${pathname}`, { method }); - warningnetIp · network
lib/index.js:630const url = (full) => `http://127.0.0.1:${chatPort}/browser-use/shot?ts=${ts}${full ? "&full=1" : ""}`;
show 3 audit findings
- mediumUnauthenticated /browser-use/command route lets any local caller run page JS and drive the managed browser
lib/index.js:1047The route registered at line 1027 performs no auth/token or Origin check and also accepts GET, so any local process — and, blindly, any web page the user visits in a normal browser via a simple cross-origin GET such as /browser-use/command?action=navigate&url=... — can drive the managed browser, close tabs and wipe its data. The action=eval branch (lines 638-642) interpolates the caller's expression into Runtime.evaluate, i.e. arbitrary JS execution inside the managed page (reading its DOM/localStorage, issuing requests from that origin). Cross-origin responses are blocked by CORS, but the sid
- mediumConfig route accepts any executable path that is later spawned without validation
lib/index.js:986detectBrowser() takes cfg.browserPath verbatim (line 101) and launchBrowser() passes it to spawn(exe, args) (line 174). The POST /browser-use/config handler (line 964) is unauthenticated, so any caller able to reach the dsh webserver port can point browserPath at an arbitrary executable and have dsh's own process launch it on the next browser start. This is the same 'any local caller' threat the author explicitly defends against for screenshot savePath (line 598), but no equivalent guard exists here.
- lownew_tab accepts arbitrary URL schemes (file://, view-source:) enabling local file reads via the managed browser
lib/index.js:661navigate forces an https:// prefix for anything not matching ^https?:// (line 536), but new_tab uses the raw value from params.url (line 655) and navigates to it directly. A caller can open file:///C:/Users/... or file:///etc/passwd and then use action=read (READ_JS returns document.body.innerText) to read the file's contents, turning the unauthenticated command endpoint into a local-file read primitive.
Browser plugin is functional and partly defensive, but its unauthenticated /browser-use/* routes allow page JS eval, spawn of a config-chosen executable, and file:// navigation.
Rule (2026-10-24): when a dynamic conclusion exists it is authoritative (it may raise or lower the level); without one, the static/vet fused tier applies. The audit never writes the exemption list (exemptions are manual only); a wrong conclusion is withdrawn by human review and the tier falls back to static/vet.
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-04 · activity: Stable
• Repo created: 2026-09-02
• Stars: ★ 1 · 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).
