# 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