Install verification: runtime verified (L5) · tested on dsh 0.2.1-rc.2 · last checked Install verification details →
What it does
把腾讯 ima 知识库接进 DeepSeek Harness:在侧边栏浏览知识库与文件,并让 AI agent 自动检索、读取库内资料。
Installation
dsh plugin --profile web add github:ikevss/dsh-ima#v1.7.2Install method: GitHub · runtime verified (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 |
|---|---|
| v1.7.2 | ✓ |
v1.7.2github✓ 1 runtime-verified2026-10-20
https://github.com/ikevss/dsh-ima
✓dsh 0.2.1-rc.2current2026-10-20L5 · runtime verified
- • Node.js: v24.14.0
- • DSH: 0.2.1-rc.2
- • Plugin artifact: github · https://github.com/ikevss/dsh-ima#v1.7.2
ID: dsh-ima@v1.7.2@dsh0.2.1-rc.2 · profile: l4-sandbox
Issued: 2026-10-20 · expires: 2026-10-27
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-ima/)``[](https://www.dsh.so/artifact/dsh-ima/)`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.
v1.7.2dsh manifestv1.7.2git2026-10-21v1.7.2same versionclean · gitVet is an AST static scan (npm artifact or git source).
show static findings (7)
- criticaleval · code-exec
lib/ima-browser.js:90async eval(expression) { - warningchildProcess · code-exec
lib/ima-browser.js:141proc = spawn(browser, [ - warningnetIp · network
lib/ima-browser.js:165try { ver = await getJson(`http://127.0.0.1:${DEBUG_PORT}/json/version`) } catch {} - warningnetIp · network
lib/ima-browser.js:174const tabs = await getJson(`http://127.0.0.1:${DEBUG_PORT}/json/list`) - warningfsWrite · files
lib/ima-client.js:125fs.writeFileSync(f, new Date().toISOString(), { mode: 0o600 }) - warningfsWrite · files
lib/ima-client.js:283fs.writeFileSync(tmp, JSON.stringify(payload, null, 2), { mode: 0o600 }) - warningfsWrite · files
lib/ima-client.js:285try { fs.chmodSync(file, 0o600) } catch {}
show 5 audit findings
- mediumChrome is spawned with a fixed --remote-debugging-port=9333, letting any local process attach to the ima session
lib/ima-browser.js:142For up to the 3-minute authorization window the browser exposes a CDP endpoint on 127.0.0.1:9333. Any local process can query /json/list and attach to the ima tab, read the ima login cookies stored in the plugin profile, drive the page, or replace the debug endpoint entirely - the code only reads /json/version and /json/list over that port and never verifies they belong to the process it just spawned, so a squatting local service could return a crafted webSocketDebuggerUrl and feed attacker-chosen clientId/apiKey that are then saved to credentials.json. The dedicated profile with the live ima
- mediumState-changing /api/ima routes have no auth, no method check and no Origin check
lib/index.js:492The single handler at path '/api/ima' dispatches purely on url.pathname (`const result = await fn(req, url)`) and never inspects req.method, Origin or Sec-Fetch-Site, and none of the routes carry a token. Because these are simple GET requests, any web page the user visits can fire them cross-origin without a preflight: /api/ima/unbind wipes the stored credentials and sets the revoked marker (denial of service requiring manual rebind), /api/ima/acquire spawns a Chrome with remote debugging, and /api/ima/bind overwrites the stored credentials. The read routes (knowledgeBases, media, mediaContent
- lowTab is selected with an unanchored /ima\.qq\.com/ regex, so a non-ima page can supply the credentials
lib/ima-browser.js:175The regex is not anchored to scheme/host, so a tab whose URL merely contains the string (e.g. https://evil.example/?ima.qq.com) is treated as the ima page. The plugin then runs fetch(QUERY_PATH, {credentials:'include'}) in that page's origin and forwards whatever {clientId, apiKey} comes back into credentials.json. A hostile page open in the plugin's dedicated profile while /api/ima/acquire runs could therefore plant credentials that all later agent tool calls would use.
- lowSilently reuses another application's ima API key from ~/.config/ima
lib/ima-client.js:132Whenever the plugin's own credentials.json is absent or unreadable, loadCredentials() falls back to reading the ima skill's client_id/api_key files outside the plugin's storage area and uses that key for every tool and route call (sent only to ima.qq.com). /api/ima/adoptLocal additionally copies the key into the plugin's own store. This cross-application secret access happens without an explicit per-use consent, though the UI does surface it and notBound() mentions the location.
- lowKnowledge-base names are concatenated verbatim into the agent instruction message
lib/index.js:383The list of knowledge-base names (including shared knowledge bases created by other people) is inserted unescaped into a user-role message that also contains tool-usage instructions and is re-injected into the conversation every 10 minutes. A knowledge base named with instruction-like text therefore reaches the model as trusted context on every step-1 of a conversation, an indirect prompt-injection surface into an agent that holds file-reading and search tools.
Host plugin proxies ima via unauthenticated local /api/ima routes and drives a Chrome CDP session on fixed port 9333; the static 'critical' is refuted, two medium risks remain.
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: 2
• Health: Active — committed within last 30 days
Source
GitHub: github.com/ikevss/dsh-ima
Author README
View on GitHub ↗The author's original README from the repository — fetched live, unedited (the English page loads the default README).
