dsh-permission-control
Verifieddsh-permission-control · v0.3.3 · MIT · Web UI
任务级临时完全权限 + 可配置黑名单 + 外部访问记录(Task-scoped full access, configurable deny-list, access log)
Install
dsh plugin add dsh-permission-control Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-permission
给 DeepSeek Harness 的权限体系加一层按需临时放权与敏感路径兜底。
DSH 默认给会话三档沙箱权限(只读 / 工作区可写 / 完全访问)。日常用"工作区可写"最安全,但一旦 AI 需要碰工作区外的文件,就得一次次点"允许一次"——打断思路,也容易形成"不看内容直接点"的习惯。
本插件把这件事变成一次显式决策:给当前会话开一个有限期限的完全权限,到期自动收回;同时保留一份任何人都改不掉的敏感路径黑名单。
功能
| 功能 | 说明 |
|---|---|
| 限时完全权限 | 点 15 / 30 / 60 分钟或自定义期限,到期或任务结束自动失效。会话头部徽章显示倒计时,剩 2 分钟时提醒,可一键延长 |
| 可配置黑名单 | 命中即拒绝,任何授权都放不开。支持"只拦写"(能读不能改)与"读写全拦"两种范围 |
| 敏感路径保护 | 内置 SSH 私钥、云凭据、浏览器配置、DSH 配置目录等规则,命中需单独确认 |
| 外部访问记录 | 按目录聚合"AI 碰过工作区外的哪些地方",跨重启保留历史 |
| 审计与导出 | 每次判定写一条 JSONL,面板可导出成 JSON |
安装
在 DSH 的插件页里填入包名:
dsh-permission-control
也可以直接从仓库安装(npm 上还没更新到最新版时用这个):
git+https://gitee.com/Lineer/dsh-permission-control
装完刷新页面(或重启 DSH),会话头部就会出现权限徽章。
想锁定版本:
[email protected]升级方式:插件页卸载 → 重新安装。
使用
点徽章打开面板:
| 分区 | 作用 |
|---|---|
| 完全权限 | 选择期限后立即开启;也可随时撤销 |
| 黑名单 | 自动扫描常见系统目录、手动添加、逐条移除 |
| 访问记录 | 工作区外被访问过的目录,含历史 |
| 内置保护 | 内置敏感路径规则(只读) |
| 审计 | 最近判定记录 + 导出 JSON |
也可以用命令:
| 命令 | 作用 |
|---|---|
/perm status |
查看当前权限状态与剩余时间 |
/perm grant-full 30 |
开启 30 分钟完全权限 |
/perm extend 15 |
在当前到期时间上再加 15 分钟 |
/perm revoke |
立即撤销全部授权 |
/perm rules |
查看黑名单 |
/perm rules add prefix D:/secrets |
添加黑名单(默认只拦写) |
/perm rules remove rule-003 |
移除黑名单 |
/perm export |
导出审计 JSON |
⚠️ 风险提示
这是一个效率工具,不是安全产品。
它让临时放权更方便,代价是:在你授权的有效期内,AI 可以做任何事(命中黑名单的路径除外)。插件不会审阅 AI 的意图,也无法判断某次操作是否恰当。
请你自己确认:这台机器上什么重要、哪些目录不能动、这段任务值不值得开权限。开多大权限、开多久,由你判断并承担后果。
详细的威胁模型、它防什么不防什么,见 SECURITY.md。
边界与安全
它做什么
- 只影响当前会话,不影响其他会话;
- 有明确期限,到期自动失效;DSH 进程退出即全部清空;
- 黑名单优先级高于授权:开了完全权限也拦得住;
- 所有授权动作都必须在界面上由人触发,插件不提供模型可调用的授权入口。
它不做什么
- 不能只给某个目录放权(见下方"已知限制");
- 不能替代系统级隔离:插件运行在 Host 进程内,权限与 DSH 本身相同;
- 对
bash/pwsh这类命令工具,只能扫描命令文本里的路径,属启发式,不构成完整隔离。
数据与隐私
- 不联网:插件不做任何网络请求,无遥测、无统计上报。
- 授权只存内存:进程退出即消失,不落盘。
- 本地文件(都在你的机器上):
- 黑名单:
$DSH_HOME/permission-rules.json - 审计:
$DSH_HOME/permission-audit.jsonl
- 黑名单:
- 审计记录包含本机绝对路径(这是它的用途)。分享日志或截图前请自行脱敏。
配置(可选)
在 profile 的 cordis.patch.yml 里覆盖 dsh-permission 行的 config:
- id: dsh-permission
name: dsh-permission
config:
auditPath: 'D:/logs/dsh-permission.jsonl' # 留空则用 $DSH_HOME/permission-audit.jsonl
autoApproveEscalation: true # 仅在存在授权时才生效
denyRules:
- id: company-secrets
match: prefix
value: 'D:/secrets'
scope: deny-write # deny-write 只拦写;deny 读写全拦
已知限制
1. 没有路径级授权
DSH 的沙箱策略只带一个 mode(三档之一),没有路径级可写集合。因此本插件无法实现"只给某个目录放权"——那需要 DSH 内核支持,已有功能请求提交给官方。
2. 命令工具只能做文本扫描(可以绕过)
对 bash、pwsh 这类命令工具,插件拿到的是命令行字符串,只能从中匹配路径文本。下面这些写法都能绕过检测:
| 写法 | 例子 |
|---|---|
| 变量拼接 | $d='C:'+[char]92+'Windows'; Set-Content "$d\x.txt" |
| 转义或编码 | C:\Wind^ows、命令先 base64 解码再执行 |
| 通配符展开 | C:/Wind*/System32/... |
| 脚本内部生成 | 路径在运行时才算出来,命令行里根本看不到 |
| 走别的工具 | 用 subagent、workflow 把操作转交给别的会话执行 |
结论:这条防线只能挡住"明显的误操作",挡不住刻意规避。
如果某个任务需要靠命令行去操作敏感目录,请把它当成没有保护来对待——要么别开权限,要么确认这个任务本身安全。
3. 只覆盖文件路径类工具
插件在 tools/pre-execute 上按工具参数里的路径做判断。当前覆盖:
| 类别 | 工具 | 判定方式 |
|---|---|---|
| 写 | write、edit |
参数里的 path / file_path |
| 读 | read、glob、grep |
同上;只有 deny(读写全拦)规则会拦 |
| 命令 | pwsh、bash |
命令文本启发式扫描(见上一条) |
不在覆盖范围内:
- 不暴露路径的工具(网络请求、子智能体、任务编排等);
- 其他插件注册的自定义工具(除非它也使用标准的路径参数)。
4. 判定依据是本机路径
路径解析基于 realpath,因此符号链接、目录联接、网络映射盘都会被解析到真实位置——这是好事(更准确),但也意味着:如果一个目录链接指向黑名单内的位置,它同样会被拦截。
许可
MIT