Plugin Install Security Review(v1.5.0)
English: README.en.md · 简体中文: 本文档
DSH 插件安装安全审查守卫。对 cordis_define / cordis_run 安装或运行的动态插件源码做静态安全审查,并按安全优先策略拦截;同时提供 plugin_security_review / plugin_security_audit 两个审查工具。
v1.5.0 起为静态 bundle 插件,随 profile 层栈自动加载,不再需要每次重启 DSH 后重新 define/run。
仓库内容
| 路径 | 说明 |
|---|---|
package.json + cordis.patch.yml + lib/ |
静态 bundle(推荐):dsh plugin add 安装后开机自启动 |
manifest.json + package-source.js |
动态插件回退形态(v1.4.0):无 bundle 能力的 profile 按 README 恢复流程加载 |
tests/gate.test.mjs |
动态形态行为测试(node tests/gate.test.mjs) |
tests/static.test.mjs |
静态形态行为测试(node tests/static.test.mjs) |
安装(静态 bundle, 推荐)
dsh plugin --profile web add dsh-plugin-security-review
本地未发布时用 file: 指向本仓库(注意路径不能含空格):
dsh plugin --profile web add file:/path/to/dsh-plugin-security-review
重启 dsh web 后守卫即自动生效:plugin_security_audit(无参数)应显示「守卫: 运行中 (v1.5.0)」。
安装(动态插件, 回退)
仅用于没有 bundle 能力的 profile。步骤:
- 让 agent 读取
package-source.js与manifest.json。 cordis_define:plugin: { kind:"new", idPrefix:"secur" },name/purpose 取manifest.json,code.host取package-source.js中return { ... }之后的内容。cordis_run激活;plugin_security_audit验证。
动态形态不跨 DSH 进程存续,重启后需重新加载;静态 bundle 形态无此限制。
v1.5.0 变更(相对 v1.4.0 动态形态)
- 静态 bundle 化:命名导出
name/inject/apply,经ctx.tools.register(defineTool(...))注册工具,经ctx.on('tools/pre-execute')拦截,开机自启动。 - 移除动态自升级豁免:静态形态经
dsh plugin update升级,cordis_define/cordis_run对所有动态插件一律审查,不再有secur前缀/谱系令牌豁免;源码不可检索时一律 fail-closed(ask)。 - 审查引擎、评分模型、能力声明、跨会话批准持久化、库存审计与 v1.4.0 保持一致。
判定策略(安全优先)
| 判定 | 条件 | 行为 |
|---|---|---|
| BLOCK | critical>0 或 high≥2 或 总分≥100 | 拒绝安装/运行,附完整报告 |
| ASK | high≥1 或 总分≥40 | 走审批服务要求人工批准(审批禁用时等效拒绝) |
| WARN | 总分≥10 | 放行,卡片附审查报告 |
| ALLOW | 其余 | 放行 |
风险权重:critical=100, high=40, medium=15, low=4,总分上限 300;能力声明项计分减半(最低 1 分)。
审查覆盖面
- Host 规则:不安全进程执行(exec/execSync/shell:true — critical)、VM 逃逸、Node 内部 API、构造器链逃逸、宿主进程终止(critical);子进程执行能力(spawn/fork — high)、原型污染、动态代码、凭据访问、审批篡改、动态模块加载(high);静态模块加载、进程信号、文件系统、网络、全局设置、沙箱、工具干预、会话读取(medium);普通 env 读取、定时器(low)。
- 凭据形态环境变量:
process.env.X名字形如*_KEY/_TOKEN/_SECRET/_PASSWORD/_CREDENTIAL/_AUTH/_COOKIE/_PRIVATE单独记 high。 - Client 规则:
document.cookie、innerHTMLXSS、浏览器eval、动态模块加载(high);import()/require、存储、网络、跳转、postMessage、Service Worker(medium);host.call、定时器(low)。 - 15 项服务能力面:
ctx.get('shell'/'subprocess'/'credentials'/'approval'/'dynamicCordisRunner'/...)精确检测。 - 组合规则(收敛后):凭据形态数据+网络 = critical;Cookie+网络 = critical;文件读取+网络 = high;动态代码+网络 = high;本地存储+网络 = low(信息性)。
- 混淆检测:高熵长字符串、
\x/\u转义、atob。
能力声明约定(可选)
在 cordis_define 的 purpose 末尾追加:
CAPABILITIES: spawn,network,env,fs
关键字:spawn exec module network env fs credentials approval shell subprocess runner settings sandbox sessions llm process eval vm proto storage cookie dom redirect postmessage serviceworker rpc timer obfs。声明覆盖的规则项计分减半(报告标 [已声明])。
跨会话批准持久化
- 人工批准的 ASK 成功执行后,其代码指纹(host+client 的 sha256)写入
<DSH_HOME>/storages/plugin-security-gate/state.json。 - 后续 define/run 命中相同指纹自动放行;代码变更即失效。历史尾部一并持久化。
profile bundle 库存审计
plugin_security_audit includeBundles=true:扫描 <DSH_HOME>/profiles/* 下声明 dsh 的依赖(@deepseek-ai/* 官方包跳过),读取入口产物做同一套静态审查,输出逐包判定。信息性审计:bundle 安装(pnpm/npm)不经过 cordis_define/cordis_run,守卫无法在该路径硬拦截,仅提供装前/装后可见性。
工具
plugin_security_review:对给定 host/client 源码做安装前审查,返回判定、评分、逐条风险与行号;purpose支持CAPABILITIES:声明。plugin_security_audit:指定 pluginId+packageId 出完整报告;无参数出全量总览+拦截/放行历史+守卫状态;includeBundles=true附加 profile 库存审计。
维护与边界
- 升级守卫(静态):
dsh plugin --profile web update dsh-plugin-security-review;本地file:依赖更新后重跑一次dsh plugin add。 - 自我保护边界:静态 bundle 守卫无法通过
cordis_stop/cordis_undefine停用(它不在动态注册表里),但可由有文件权限的操作者经dsh plugin remove卸载——这是静态形态与动态形态的固有差异。 - 已知限制:组合判定是静态 presence 判定,未经数据流确认,可能误报/漏报;深度混淆存在盲区;本守卫是进程内拦截(标准安装路径),不是对抗可停用守卫的恶意 actor 的安全边界,真正的纵深防御仍需宿主级隔离。
No comments yet. Be the first to write one.