Skip to content

dsh-workplan 1.12.2 — 修好 G1/G2/G3 三个写保护漏洞

Choose a tag to compare

@abbaababa abbaababa released this 04 Nov 11:27
· 24 commits to main since this release

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

二、行为影响(会影响现有使用的部分,务必读完)

  1. 子 Agent 写已交付文件会被拒绝(G1)。以前后台子 Agent 能改掉用户手上那份报告,现在与主 Agent 同等对待。present 仍只有主会话可用,所以「交付能力」没有扩大,只是「改写已交付文件」的口子被堵上。
  2. 更多工具名进入写保护(G2)。过去改一个名字(如 apply_patch、write_file)就能绕过的写法,现在同样被拦;一次 patch 改动多个文件时,只要有一个是已交付文件就整单拒绝。
  3. 符号链接不再是第二种写法(G3)。通过软链接路径改写已交付文件会被拦下,报错文案与直接路径完全一致。
  4. 照旧保留的出路:计划交付就绪后放行;计划被 dsh_workplan_cancel 显式取消后放行;present 之后才新建的计划不受限制;plan 模式下写保护不生效。
  5. 没有削弱的权限:其余 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