Skip to content

Releases

v0.3.3

Choose a tag to compare

@zhang8019 zhang8019 released this 11 Sep 01:12

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

Choose a tag to compare

@zhang8019 zhang8019 released this 11 Sep 00:05

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

Choose a tag to compare

@zhang8019 zhang8019 released this 10 Sep 02:25

基于 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

Choose a tag to compare

@zhang8019 zhang8019 released this 09 Sep 12:04

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