# dsh-permission-control **Repository Path**: Lineer/dsh-permission-control ## Basic Information - **Project Name**: dsh-permission-control - **Description**: 给 DeepSeek Harness 的权限体系加一层按需临时放权与敏感路径兜底。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-10-26 - **Last Updated**: 2026-10-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dsh-permission 给 [DeepSeek Harness](https://www.deepseek.com) 的权限体系加一层**按需临时放权**与**敏感路径兜底**。 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),会话头部就会出现权限徽章。 > 想锁定版本:`dsh-permission-control@0.3.1` > > 升级方式:插件页**卸载 → 重新安装**。 --- ## 使用 点徽章打开面板: | 分区 | 作用 | | --- | --- | | 完全权限 | 选择期限后立即开启;也可随时撤销 | | 黑名单 | 自动扫描常见系统目录、手动添加、逐条移除 | | 访问记录 | 工作区外被访问过的目录,含历史 | | 内置保护 | 内置敏感路径规则(只读) | | 审计 | 最近判定记录 + 导出 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](./SECURITY.md)。 --- ## 边界与安全 **它做什么** - 只影响**当前会话**,不影响其他会话; - 有明确期限,到期自动失效;DSH 进程退出即全部清空; - 黑名单**优先级高于授权**:开了完全权限也拦得住; - 所有授权动作都必须在界面上由人触发,插件不提供模型可调用的授权入口。 **它不做什么** - 不能只给某个目录放权(见下方"已知限制"); - 不能替代系统级隔离:插件运行在 Host 进程内,权限与 DSH 本身相同; - 对 `bash` / `pwsh` 这类命令工具,只能扫描命令文本里的路径,属**启发式**,不构成完整隔离。 --- ## 数据与隐私 - **不联网**:插件不做任何网络请求,无遥测、无统计上报。 - **授权只存内存**:进程退出即消失,不落盘。 - **本地文件**(都在你的机器上): - 黑名单:`$DSH_HOME/permission-rules.json` - 审计:`$DSH_HOME/permission-audit.jsonl` - 审计记录**包含本机绝对路径**(这是它的用途)。分享日志或截图前请自行脱敏。 --- ## 配置(可选) 在 profile 的 `cordis.patch.yml` 里覆盖 `dsh-permission` 行的 `config`: ```yaml - 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