Skip to content

dsh-permission-control

Verified

dsh-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