Repository navigation
dsh-workplan 1.12.2 — 修好 G1/G2/G3 三个写保护漏洞
1.12.2 — 2026-11-04
修好 G1/G2/G3 三个写保护漏洞(1.12.1 只记录了缺口)。这是一次有意的行为变更:已交付文件的写保护现在真正无死角,且不再区分「谁在写」。
一、修了什么(三个漏洞,逐条)
| 编号 | 1.12.1 的状态 | 1.12.2 的修法 | 代码位置 |
|---|---|---|---|
| G1 子 Agent 不受保护 | 非根会话直接放行:「门卫只认户主,保姆拿钥匙能进」 | 去掉角色判断。已交付文件在计划未就绪期间不得被原地改写,与谁在写无关。 | src/runtime.ts presentedWriteDenialReason |
| G2 只认三个工具名 | 只接管 write / edit / str_replace_editor,第四个写工具(如 apply_patch)根本不进闸门 |
改为按参数形状识别写操作:带 file_path/path,或 patch 文本含 *** Update/Add/Delete File:。一次调用含多个文件时,只要有任一命中就整单拒绝。读类工具显式白名单排除。 |
src/host.ts fileWriteGuardReason / isWriteShapedCall;src/runtime.ts writeTargets |
| G3 符号链接绕过 | 只做 path.resolve,/link/report.md 与 /real/report.md 被当成两个文件 |
两侧都归一到真实文件身份(realpath.native)。交付链接、写真实路径(或反之)都能认出来。文件尚不存在时解析最近的存在祖先;完全解析不了时退回旧行为。 |
src/runtime.ts realPathIdentity / identityPath |
二、行为影响(会影响现有使用的部分,务必读完)
- 子 Agent 写已交付文件会被拒绝(G1)。以前后台子 Agent 能改掉用户手上那份报告,现在与主 Agent 同等对待。present 仍只有主会话可用,所以「交付能力」没有扩大,只是「改写已交付文件」的口子被堵上。
- 更多工具名进入写保护(G2)。过去改一个名字(如
apply_patch、write_file)就能绕过的写法,现在同样被拦;一次 patch 改动多个文件时,只要有一个是已交付文件就整单拒绝。 - 符号链接不再是第二种写法(G3)。通过软链接路径改写已交付文件会被拦下,报错文案与直接路径完全一致。
- 照旧保留的出路:计划交付就绪后放行;计划被
dsh_workplan_cancel显式取消后放行;present 之后才新建的计划不受限制;plan 模式下写保护不生效。 - 没有削弱的权限:其余 8 处
NOT_ROOT校验(子 Agent 不能 update / replan / cancel / dispatch 主计划、不能下发指示、不能处置跨部门需求、不能补发 follow-up、不能 present)一处未动。那是「子 Agent 不能改计划」的权限,与「不能改文件」是两件事。
三、验证(双向红绿,不是只跑一次绿)
- 修复前(换回 1.12.1 的
src/runtime.ts+src/host.ts):tests 498 / pass 491 / fail 7,失败项正是 6 条 G1/G2/G3 新用例 + 1 条既有契约用例。 - 修复后:
tests 498 / pass 498 / fail 0,退出码 0;npm run check(tsc --noEmit)退出码 0。 - 用例数构成:基线 495 + G1 一条 + G2 一条 + G3 反向一条 = 498。
- 三条原本「钉住缺口」的用例已翻转成「钉住修复」:
p03-m1-write-guard-gaps.test.ts的 G3 条、p03-m1-guard-gating-gaps.test.ts的 G1/G2 条、以及既有契约workplan-presented-write-guard.test.ts中「非根会话放行」的断言。
四、事实边界(不得外推)
- 真实模型在 20 条任务上的通过率未被本版刷新,仍为 2026-11-03 的
pass 4/20。原因:模型密钥 4 个环境变量全空 + 工作区外写配置权限缺失,20 条真实模型验证无法在本轮重跑。 - 1.12.2 是代码级修复 + 回归验证的结论,不代表 20 条真实模型任务的表现有任何变化。
安装
dsh plugin --profile web add dsh-workplan@1.12.2本次不包含(如实说明)
- 真实模型 20 条验证:本机 4 个模型密钥环境变量为空,未重跑,通过率仍为 2026-11-03 的 pass 4/20。补齐密钥后可执行
rerun_ms2_20.sh复现。 - npm 包 dsh-workplan@1.12.2:https://www.npmjs.com/package/dsh-workplan