对齐 Muse P4:浏览器完全对齐(CDP broker 单元外 + a11y-tree-only + 确定性分类器)

- chv-guest/chv-cdp-broker.py(新):单元外 CDP broker,用户 chv-browser,
  独家 chromium.launch(headless=True, args=LAUNCH_ARGS);启动参数白名单
  无 --remote-debugging-port、无 devtools;导航前 URL 校验 + 拦截名单;
  快照恒带 untrusted_input 与 injection_flags;高风险表单在页时 open
  即 ask 入队;观测到导航 POST 自动暂停;命中拦截规则的下载取消 + 暂停
  + ask;全部回包与错误经 sanitize_error + response_leaks 检查。
- chv-guest/chv-browser.py(P2 版重构):改为 broker 客户端,不再直连
  Playwright(本文件无 playwright import),保留 URL 校验 + 快照截断
  作为第二层防线;暂停状态与 broker 同步。
- chv-guest/chv_browser_guard.py(新):纯 stdlib 共享规则——validate_url、
  拦截名单加载/匹配、快照截断、错误消毒(去 HTML、截断 200 字符、凭据形
  key=value 与 sk- 形 token 打码)、注入启发式(中英文各 6 条)、表单风险
  扫描、下载扫描(可执行扩展名)、文件型 ask 队列(pending/allowed/denied,
  与 P3 ApprovalQueue 同语义)、启动参数与回包泄露检查、脚本注入面
  禁止清单(FORBIDDEN_PAGE_ATTRS/FORBIDDEN_OPS)。
- chv-guest/browser-blocklist.txt(新):静态拦截名单;首版只有 RFC 2606
  .test 自测条目,生产条目由运维构建时填入,无在线更新。
- chv-guest/build.sh/buildinfo.py:P2 三脚本 + P4 三文件纳入镜像与
  buildinfo;新增 chv-cdp-broker.service 与 /run/chv/ask-queue tmpfiles。
- docs/chv-muse-p4-gap.md(新):现状 vs Muse 官方要求差距表、改动、
  诚实边界、P2 合入约定、真机待验证清单(round 12)。
- docs/chv-production-readiness.md:补 §15(P4 一节;编号合入时若与
  P2 的 §15 撞,顺延)。
- cloud/tests/test_chv_muse_p4.py(新,36 项):guard 单元、AST 钉住
  禁止属性、假 Playwright broker 测试、假 broker agent 测试、真 Unix
  socket 联调、buildinfo/build 干跑断言;含否定测试(evaluate 被拒、
  DOM 外泄被拒、DevTools 不可达、私有地址被拒、高风险表单被拦、
  注入文本被标注)。

测试:P4 新测试 36/36;全量 cloud 套件 1903 项,两次连续全过
(skipped=8)。附记:第一次全量跑出 1 个失败但输出未保留、后两次
均未复现,疑为时序抖动,未追认。
真机验证未做:排队等 round-11/第三棒释放 100.65.51.33,清单见 gap
表 §5。本地提交,未推未合未部署。
This commit is contained in:
host committed 2026-11-06 22:36:56 +00:00
1 parent 06c3e172fe
commit 1c8fc3f7c8
11 files changed
+2878 -9

No files matched your search

+54
View File
@@ -833,3 +833,57 @@
UNSTABLE、未合并、未部署、真机 0 项。差:外部为主。
- 动态安全 2.0 → 2.0,未达 10:本轨无任何动态验证,
V-7 未跑。差:外部(KVM 宿主 + 审计结论)。
## 15. 对齐 Muse P4:浏览器完全对齐(堆叠于 P2 之上)
> 编号说明:本节在本分支写为 §15;P2 在其分支也补了 §15(P2 一节),
> 合入时若 P2 的 §15 已在,顺延编号,内容不改。
### 15.1 本轨做了什么(代码已做、真机未验证)
- Chromium 的所有权从浏览器子代理移到单元外 CDP broker:
`chv-guest/chv-cdp-broker.py`(新,用户 `chv-browser`)独家
`chromium.launch(headless=True, args=LAUNCH_ARGS)`;子代理
`chv-guest/chv-browser.py`(P2 版基础上重构)改为 broker 的
客户端,不再直连 Playwright,本文件里不再有 playwright import。
- a11y-tree-only 收紧到底:快照只出无障碍树 + 标题/URL;全部回包与
错误信息过 `sanitize_error`(去 HTML 标签、截断 200 字符、凭据形
key=value 与 sk- 形 token 打码);回包先过 `response_leaks`
检查(ws 端点、DevTools 路径、HTML 标签即拦截);Playwright
调用白名单 + AST 测试钉住两个客机脚本里不存在脚本注入面
(evaluate/add_script_tag/add_init_script/expose_function/
set_content/keyboard/mouse 等属性名)。
- DevTools 不暴露:启动参数白名单无 `--remote-debugging-port`、
无 `devtools=True`;CDP 端点(ws 地址)绝不进任何响应。
- 暂停状态机:CDP broker 持 `active/paused`,`pause`/`resume`/
`status` 操作;暂停时除 ping/resume/status/list_asks/resolve_ask
外一切操作拒绝;自动暂停触发源:观测到导航 POST、下载命中拦截规则。
- 确定性分类器(规则,不冒充模型):`detect_injection` 启发式
(中英文各 6 条模式,命中只标注 `untrusted` + `injection_flags`,
快照恒带 `untrusted_input: true`);`detect_form_risk` 扫密码/
支付字段,高风险表单在页时 `open` 导航即返回 ask 入队;
`scan_download` 一条可执行扩展名规则(命中即取消下载 + 暂停 + 入队)。
- 静态恶意站名单 `chv-guest/browser-blocklist.txt`(一行一个域名/
后缀),导航前检查;首版只有 RFC 2606 `.test` 自测条目,生产条目
由运维构建时填入;无在线更新。
- 文件型待审批队列 `/run/chv/ask-queue/`(与 P3 ApprovalQueue 同语义:
pending/allowed/denied;`list_asks`/`resolve_ask` 操作;`allowed`
解除暂停,`denied` 关当前页)。
- 测试:`cloud/tests/test_chv_muse_p4.py` 36 项全过(含否定测试:
evaluate 被拒、DOM 外泄被拒、DevTools 端口不可达、私有地址被拒、
高风险表单被拦、注入文本被标注、真 socket 联调整条链)。
### 15.2 本轨明确不做(见差距表 §3)
- 不做模型分类器;不做在线更新的拦截名单;不做用户接管浏览器与
凭证注入填表的真实触发源联动(只留 `pause` 操作与状态机);
不封单元内 curl/Python 直接取页面原文的口子(那是 P3 Sentinel
的出口管辖);不做独立根文件系统(P2 的取舍,本轨沿用)。
### 15.3 真机待验证清单(round 12,测试机空闲后)
见 `docs/chv-muse-p4-gap.md` §5:CDP broker 进程身份与启动参数、
整条链快照无泄露、单元内连不上 CDP、密码表单 ask 流程、注入标注、
拦截名单、下载拦截、暂停/恢复、性能记录。另:集成者须改 P2 测试
`test_open_returns_a11y_snapshot_with_fake_playwright`(合入 P4 后
`BrowserAgent` 不再直连 Playwright,改为走假 CDP broker)。