给 AI 用的持久终端:tmux 常驻会话 + DSH 面板 + 审计链 + 引用库
层级:专题 适用:0.1.x 权威性:安全边界与引用库说明;具体参数见《工具与参数》
这是个人工具,不是沙箱、不是多租户隔离、也不是“AI 权限系统”。
它给 AI 的是你本人权限下的真实 shell。AI 能执行命令之后,就能读写你的文件、访问本机接口、改插件数据,甚至改审计文件。插件内的任何规则都只能约束“愿意遵守规则的程序”,挡不住恶意或提示词注入后的 AI。
所以,真正能约束 AI 的只有两类东西:
插件内的模式闸门、锁、危险命令护栏、审计和引用库,都是在这个前提下的降低风险,不是安全隔离。
这是理解所有边界的起点:
你的用户账号
├── DSH / 本插件进程
│ ├── 读取 ~/.dsh/terminalkeeper/ 下的数据
│ ├── 提供本机 HTTP 接口
│ └── 驱动 tmux 服务端
├── tmux 服务端
│ └── 持久 shell(AI 通过工具操作)
└── AI 的 shell
└── 和插件进程拥有同一个 UID、同一套文件权限
因此:
connection 服务做了浏览器会话校验);这不是“实现得不够好”,而是部署形态决定的上限。
| 机制 | 能做什么 | 不能做什么 |
|---|---|---|
| DSH 模式闸门 | 在 workspace-write / read-only 下拒绝插件写工具,避免插件 shell 绕过 DSH 文件沙箱 |
完全控制模式下不拦截;不限制 DSH 原生 bash;不防 AI 用其它通道 |
| 手动锁 | 人锁住 shell 后,AI 对该 shell 的写入/改动被拒;人可解锁 | 只读不受影响;不是身份认证;AI 仍可读屏 |
| 危险命令护栏 | 拦 rm -rf /、mkfs、dd of=/dev/*、curl|sh 等明显高危形状 |
启发式;变量、脚本、拼接、别名都能绕过;会误报 |
| 审计链 | 记录输入、开关会话、引用库操作等;可发现删改/重排/截断;可选镜像和 chattr +a |
同用户可改审计文件和签名私钥;不能证明“没被改过” |
锁和归属不是权限模型。
owner 只表示“谁创建的”,跨对话用具体 id 操作别的 shell 是允许的;“不要动别人的 shell”是模型使用约定,不是系统强制。
引用库(vault)解决的是一个很具体的问题:
不要把密码、令牌等敏感值直接放进模型的上下文,也不要把它们展开进 AI 可以加工的普通命令。
它采用“键值分离”:
sudo -S / read -s 的 stdin);echo、管道、curl -H、宏等命令形态会被拒绝,避免值进入 AI 可读取的输出管线;引用库不防 AI 主动读取。 只要 AI 有 shell / 本机接口访问权,它仍可能:
cat ~/.dsh/terminalkeeper/vault.json;/vault-get 之类的接口;cat、env、日志程序);base64/rev/od 等变换绕过字面打码;output/ 留痕、进程输出、终端屏幕里读到值。所以准确的表述是:
引用库防“敏感信息直接进入模型上下文”,不防“AI 主动把值读出来”。
引用组有三种模式:
| 模式 | 落盘 | 主要作用 |
|---|---|---|
| 不加密 | 明文 | 开箱即用;不防本机同用户 |
| 简单混淆 | 设备密钥混淆 | 防“全盘搜索直接看到明文”;不是强保密 |
| 口令加密 | AES-GCM 密文 | 未解锁时磁盘上只有密文;不知道口令无法解密 |
口令组的密钥派生:
KEK = HMAC-SHA256(pepper, scrypt(口令, salt))
scrypt 让每次口令猜测都有 CPU/内存成本;pepper 是 32 字节设备随机值,存在 vault.pepper,和 vault.json 分文件;vault.json:没有 pepper,不能直接用密文离线猜口令;vault.json 只能得到密文;vault.json 和 vault.pepper,pepper 就不再提供额外保护,只剩 scrypt + 口令强度;因此:
口令模式在“未解锁”时可防直接读盘得到明文;它不防同用户 AI 主动拿走密文后离线尝试,也不防用户解锁后的读取。
最稳妥的用法是:长期秘密放在口令组,只在可信时段解锁;不要把“引用库”当成秘密不会泄露的保证。
max(文件里的值, 内存里的值),单侧回滚不会把已用次数改小。entryId 和名字指纹(用于烧伤标记)。seq,用于判断回滚/缺头/篡改;读取和写入都是 O(1),不需要每次扫描全部内容。审计记录进入逐天 SHA-256 哈希链,检查点用 Ed25519 签名;可配置镜像,也可以给审计目录加 chattr +a。
| 路径 | 风险 |
|---|---|
| 提示词注入 → AI 调工具 | AI 以你的用户权限执行命令;插件内的规则不能阻止 |
| 本机 HTTP 路由 | 面板和宿主通过本机 HTTP 通信;如果 AI 能发请求,它可能操作会话或读取面板能读的数据 |
| 同源浏览器页面 | 同源插件 JS / XSS 可以访问面板接口;不要把不可信页面装进同一个 DSH |
| 引用库文件 | 同权限可直接读;口令组未解锁只见密文 |
| 终端输出 / 留痕 | 值进入屏幕就会进原始留痕;打码占位符是 redacted,只覆盖部分可见面 |
| 插件代码 / 配置 | 同用户可改;改完可能影响下一次启动或运行中的行为 |
| 审计 / 签名私钥 | 同用户可改;镜像和 chattr +a 只是提高成本 |
danger-full-access;模式闸门只有在完全控制之外才有意义。vault.json 和 vault.pepper。./install-deps.sh --audit-lock;它防的是文件被追加/删改,不防读取,也不防同用户控制整台机器。一句话:
模式闸门负责避免插件绕过 DSH 沙箱,锁负责人机互斥,护栏负责减少手滑,审计负责事后追溯,引用库负责避免秘密直接进入模型上下文;它们都不负责“防住已经拿到同用户 shell 的 AI”。
请不要在公开 issue 里贴可利用载荷、凭据、内网地址或完整日志。
优先用 GitHub 的 Security → Report a vulnerability 私有报告;说明 DSH 版本、tmux -V、插件版本和受影响工具/页面即可。
不得把“显示打码”说成“防泄露”,不得把状态头/审计链说成“不可篡改”,也不得把引用库说成“AI 无法读取”。