Skip to content

fix(data): 重建 OpenClaw fs-bridge TOCTOU 分阶段写入链#52

Open
Qiyuanqiii wants to merge 1 commit into
Tencent:mainfrom
Qiyuanqiii:codex/fix-issue-7-fs-bridge-write-chain
Open

fix(data): 重建 OpenClaw fs-bridge TOCTOU 分阶段写入链#52
Qiyuanqiii wants to merge 1 commit into
Tencent:mainfrom
Qiyuanqiii:codex/fix-issue-7-fs-bridge-write-chain

Conversation

@Qiyuanqiii

Copy link
Copy Markdown

背景与去重

现有 #7 相关 PR(#15#20#24#29#47)均集中于 issue 点名的五条优先样本。本 PR 选择尚无提交涉及的 GHSA-MJ4P-RC52-M843

  • entry-00301
  • entry-00302

Related to #7

原标注问题

  • entry-00301 的入口是 readFile 结尾的孤立 },并错误地把 AbortSignal 描述成攻击者控制竞态时序的手段。
  • entry-00301 的关键操作是未参与旧写入路径的规范化 helper。
  • entry-00302 整条链围绕只读 stat()buildStatPlan() 展开,与 staged-write 公告无关。
  • 原关键操作是函数声明,没有创建文件、写入数据或改变安全状态。

重建方案

将两条记录重建为两个真实、独立的可达入口:

  1. entry-00301:沙箱 write/edit 工具接收模型控制的路径与内容。
  2. entry-00302:apply_patch 接收 patch input,并从 hunk 产生路径与内容。

两条入口最终汇聚到相同的漏洞链:

输入 -> assertPathSafety -> 父路径发生竞态变化 -> mktemp + cat + runCommand -> 最终 recheck + mv

关键操作定位到未固定父目录的临时文件创建、内容写入及脚本执行。最终 mv 虽然会重新检查目标,但执行时攻击者字节已经可能在允许挂载之外物化。

修复依据

上游修复提交 11924a7 删除旧 writeFileToTempPath(),改用目录 fd:

  • os.open(..., dir_fd=parent_fd) 创建临时文件
  • os.replace(..., src_dir_fd=parent_fd, dst_dir_fd=parent_fd) 完成替换

两条记录暂时降为 verify=0,等待维护者确认后再恢复人工审计状态。

验证结果

  • canonical 修改范围:2 entries / 8 fields
  • 上游源码逐字匹配:13/13 nodes
  • 字段级 diff 回放:8/8 rows
  • 自动化测试:6 tests passed
  • 全量加载:184 reports / 408 entries
  • 当前审计状态:391 entries / 177 advisories
  • 漏洞快照比修复父提交早 144 commits
  • Python 语法与 git diff --check 通过
export GITHUB_TOKEN="$(gh auth token)"
python scripts/rebuild_openclaw_fs_bridge_write_chain.py --base-ref upstream/main --check-upstream
python -m unittest discover -s tests -p "test_openclaw_fs_bridge_write_chain.py" -v
python examples/load_dataset.py
python -m py_compile scripts/rebuild_openclaw_fs_bridge_write_chain.py tests/test_openclaw_fs_bridge_write_chain.py
git diff upstream/main...HEAD --check

验证截图

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant