Repository navigation
Releases
v0.3.3
v0.3.3 — 修正 peerDependencies 版本范围(修掉一个会挡住安装的缺陷)
package.json 里声明的官方包版本范围此前是 ^0.1.2-rc.1,而 npm 上这两个包的真实版本是:
| 包 | npm 上的版本 |
|---|---|
@deepseek-ai/cordis |
4.0.1-rc.1 · 4.0.1-rc.4 · 4.0.1 · 4.0.2 |
@deepseek-ai/schemastery |
3.18.1-rc.1 · 3.18.1-rc.4 · 3.18.1 · 3.18.2 |
也就是说 ^0.1.2-rc.1 匹配不到任何一个真实版本:安装时会产生 peer 冲突(ERESOLVE),用户得自己加 --legacy-peer-deps 才能装上。
现在改为:
"peerDependencies": {
"@deepseek-ai/cordis": ">=4.0.1-rc.1",
"@deepseek-ai/schemastery": ">=3.18.1-rc.1"
}下界带显式预发布标签,所以 4.0.1-rc.x、4.0.1、4.0.2、3.18.1-rc.x、3.18.1、3.18.2 全部满足。这一点很关键:node-semver 只在范围内存在与该版本同 major.minor.patch 元组、且自身带预发布标签的比较符时才放行预发布版本,所以写成 ^4.0.0 或 >=0.0.0-0 这类"看起来更宽"的范围反而会静默排除所有预发布构建。
同时把包描述里的 three-tier risk policies 更正为 four-tier(自 v0.3.0 起风险策略已是 低 / 中 / 高 / 极高 四档)。
功能无变化:测试 69 条全过,插件行为与 v0.3.2 一致。
安装
dsh plugin --profile <profile> add zhang8019/dsh-permission-matrix或使用下方预构建 tarball。
v0.3.2
v0.3.2 — 拼接/动态执行绕过修复 + 密码批准全面落地
从 v0.2.0 升级请重点看第 2 节(破坏性变更:极高风险的处理方式变了)。
1. 修复:命令拼接 / 动态执行绕过(安全)
此前 README 记为「已知限制(未修)」,实测确认不仅存在,同族漏拦更多:
$p1='Remove-'; $p2='Item -Recurse -Force C:\'; & $p1$p2 # 修前:放行
$c='diskpart'; & $c # 修前:放行
$x='shutdown /s'; iex $x # 修前:放行
$cmd='net user hacker P@ss /add'; Invoke-Expression $cmd # 修前:放行根因:executionSurface() 会剥掉引号与变量赋值行,拼接写法下「命令面」什么都不剩,
而这些危险动词所在规则恰好都带 surface:true,于是全部失明。
修复方式:
- 检测到动态执行形态(
& $var/. $var/iex $var/ 相邻变量$a$b)时,
把引号内的字符串当真实命令再跑一遍 HARD 规则; - 识别被拆开的 cmdlet 动词片段(
'Remove-'这类「动词 + 连字符结尾」)→hard:concat-fragment; - 该检查只在出现动态执行形态时触发,因此
Write-Host 'rm -rf /'这类纯文案不受牵连
—— 顺带修掉了此前「文案里提到危险词就被判 hard」的误拦(纯输出 cmdlet 现按执行面匹配); - 单独出现的
& $someExe --version不硬拒绝,落到高风险规则high:dyn-call(默认 deny,可配ask/password)。
残余风险(未堵死):多层间接(数组/哈希表/$(...) 拼接、[scriptblock]::Create、Base64 后 iex)仍可能绕过静态分析,依赖沙箱层与 LLM 裁判兜底。
2. 破坏性变更:极高风险从「双重人工确认」改为「密码批准」
v0.2 的「双重人工确认」要求模型在窗口内原样重发同一条命令才能完成第 2 次放行;
实测审计 1064 条记录里 hard-confirm-1 出现 3 次、hard-confirm-2 出现 0 次
——极高风险操作事实上无法被人工放行。
现在改为密码批准:操作被挂起(不失败),由插件的密码弹窗/设置页要求输入批准密码,
输对了当场执行(无需模型重试),输错或超时按拒绝处理。未设置密码 ⇒ 一律拒绝。
- 配置键:
hardConfirmWindowMs→approvalPasswordTtlMs(旧键保留兼容读取,已设口令不丢); - 审计
outcome:hard-ask-1/hard-confirm-2→password-required/password-approved/password-timeout/password-declined/password-cancelled。
3. 「密码批准」是四档通用的审批方式
低 / 中 / 高 / 极高任一档都能把策略配成 password,与「放行 / 拒绝 / 转人工」并列:
ask(转人工)= 浏览器审批弹窗,点一下「同意」即放行;password(密码批准)= 挂起等密码,必须知道口令,不会被"多点几次同意"绕过;- 极高风险档两者等价(都走密码批准)。
4. GUI 密码弹窗(新增)
原生审批弹窗无法承载输入框,因此注册官方 shell.overlay 槽位自绘浮层:
出现待批准请求时自动弹出,输入密码点「批准并立即放行」→ 被挂起的调用当场执行。
设置页「批准密码」区块与 /dsh-permission-matrix/approve 批准页保留为等价入口。
5. 其它
- 命名去 hard 化:
hard-approval.js→password-approval.js,配置键与路由同步改名; - 测试 69 条全过(新增拼接绕过、纯输出文案不误伤、动态调用落高风险档、中风险档密码批准端到端等用例)。
安装
dsh plugin --profile <profile> add zhang8019/dsh-permission-matrix或使用下方预构建 tarball。
v0.2.0
基于 fa-classify / ww-classify 两档预设的真实工具调用实测(400+ 条审计记录),本版修复首轮实测暴露的全部误拦与漏拦问题,并新增高风险与极高风险两档策略。
修复:漏拦截(应拒却放行)
- cmd 风格递归删除
rd/rmdir/del /s /q此前完全不匹配 PowerShell 风格正则(实测能真删目录) → 新增hard:rm-root-win-cmd git reset --hard无规则 → 新增hard:git-reset-hard- 系统级包安装
apt-get/pip/winget install无规则 → 新增hard:pkg-install-system - 非盘根递归删除被放行 → 新增高风险(HIGH)档,按
riskPolicies.high分派(推荐转人工),工作区内路径豁免 - 命令类工具写
.dsh绕过保护 → 新增硬拒绝分支hard:protected-target - 普通
git push被放行 → 新增high:git-push(--force变体仍为 HARD) rm -rf ~/子目录不命中 →high:rm-recursive-unix覆盖
修复:误拦截(应放行却被拒)
- 新增
executionSurface()执行面识别:注释、字符串字面量、变量赋值、文件名中的关键词不再误拦 - HARD 正则收窄为写/变更形态:只读查询与帮助文本放行(
schtasks /query、net user、icacls <路径>、bcdedit /enum、diskpart /?等) - 凭据规则收窄:不再误伤
my_rsa.txt read工具读取系统目录与配置放行 —— 读不是写- 读取
settings.yaml不再被当"篡改"拒绝(写入仍硬拒绝)
新增能力
- 四档风险策略:低 / 中 / 高 / 极高,
riskPolicies全量可配;极高风险档只接受deny/ask - 极高风险双重人工确认:
riskPolicies.hard = 'ask'时,同一操作须人工同意两次 —— 第 1 次同意仅登记指纹并拒绝本次执行,120 秒窗口内第 2 次相同调用才放行 - 工作区内递归删除豁免:清理测试目录不再弹窗
- 设置页「三档策略」升级为「四档策略」
验证
- 单元测试 51 条全过(
node --test) - 仓库
src/11 个文件与已安装 profile 的src/SHA256 逐一一致(实机生效)
已知限制
- 命令文本拼接绕过(
$p1='Remove-'; $p2='Item -Recurse -Force C:\'; & $p1$p2):动态拼接无法靠静态正则识别,依赖沙箱层与 LLM 裁判兜底
安装
dsh plugin --profile <profile> add zhang8019/dsh-permission-matrix完整实测报告:docs/test-audit-2026-09-09.zh.md
Full Changelog: v0.1.0...v0.2.0
v0.1.0
First release of dsh-permission-matrix.
- 9 permission presets (3 sandbox modes x 4 approval strategies)
- three-tier risk policies (low/medium/high) + fixed hard deny
- global default + LLM-robot default
- settings page, JSONL audit, git checkpoint
- 27 unit tests
Install: dsh plugin --profile add dsh-permission-matrix