merge(chv-muse-round12): 合入 P6 privsep worker + 确定性安全检查层 (81e4eaf)

唯一冲突是文档 §15 撞号:P6 一节顺延为 §17,基线说明更新
(P3 已在树里,接线走真实代码)。chv-sync.sh 自动合入正确:
P6 的 worker 路径与 P3 的 authd 路径(useHttpPath)都在。
P6 测试 43 项全过(skipped=1 是 root 下 uid 否定测试)。
This commit is contained in:
host committed 2026-11-07 00:02:22 +00:00
commit b0b9f5ed9d
10 files changed
+2072

No files matched your search

+60
View File
@@ -938,3 +938,63 @@ docs/chv-muse-p2-gap.md(现状 vs Muse、改了什么、诚实边界、
`test_open_returns_a11y_snapshot_with_fake_playwright`(合入 P4 后
`BrowserAgent` 不再直连 Playwright,改为走假 CDP broker)。
## 17. 对齐 Muse P6 轨 feat-chv-muse-p6(privsep worker + 确定性安全检查层)
本节是准备工作,不是启用结论。本轨只到本地提交,不合并、
不部署、不推;生产就绪与动态安全的外部关卡原样未动。
基线 06c3e17(P1/P2/P3 之前的基线,不含 P3 的 authd/sentinel
代码——本轨与 P3 的接线走文件/socket 协议;round-12 合入后 P3
已在树里,接线走真实 P3 代码,见集成说明)。
### 17.1 本轨改动
- `cloud/chv/safety.py`(新):`UntrustedData` 来源标记、
`InjectionScanner` 确定性规则(阻断/标记/放行三档)、
`redact_secrets`(审计前脱敏)、`AuditLogger`(只记指纹,
永不记值)、`audit_inference_request/response`(进出核心推理
的审计入口)。规则覆盖:指令覆盖(中英)、shell 执行链、
可疑 URL、分隔符隐藏指令;不覆盖:改写/编码指令、图片/
附件/二进制内指令、上下文相关社会工程(见 §17.3)。
- `cloud/chv/privsep.py`(新):`ConnectorSpec` 凭证白名单
(gitea 只含 GITEA_TOKEN)、`WorkerRequest/Response` 类型化
协议(request_id 绑定 + 64KB 上限 + 未知操作/字段拒绝)、
`PrivsepServer`(Unix socket,SO_PEERCRED 只放 root/chv,
仓目录限定 ~/workspace,git 只走 authd 凭证 helper,绝不
直读真 token)、`PrivsepClient`(薄客户端,响应再扫一遍,
取 worker 与客户端两者中更严的裁决)。
- `chv-guest/chv-gitea-worker.py`(新):systemd 沙箱化 worker
守护进程(`chv-guest/chv-gitea-worker.service`,NoNewPrivileges
+ ProtectSystem + PrivateTmp + 凭证白名单环境变量)。
- `chv-guest/chv-sync-worker-client.py`(新):agent 侧薄 CLI
(只解析参数、传类型化参数,走 Unix socket)。
- `chv-guest/chv-sync.sh`:pull/push/status 走 worker(socket
在时),否则旧直连路径 + stderr 警告(不静默回落)。
- `cloud/chv/executor.py`:`_run_guest` 前后加审计钩子
(`_audit_inference_request/_audit_inference_response`),
钩子失败不影响主流程。
### 17.2 本轨量化结果(实测)
- 新测试 `cloud/tests/test_chv_muse_p6.py` 43 项,全过
(root 身份跑时 uid 否定测试 skip 1 项——该测试只在
非 root 身份下才有意义)。
含否定测试:worker 越权取凭证被拒、worker 直连外网被拒
(无直连代码路径)、注入文本被标注/阻断、审计里无密钥值、
仓目录越界被拒、request_id 错配被拒、worker 崩溃不拖垮
agent(失败分类 WorkerRefusal)。
- 差距表:`docs/chv-muse-p6-gap.md`(现状 vs Muse 官方要求、
改什么、诚实边界、真机待验证清单)。
- mypy 在新增文件上干净;剩余报错 4 处全是基线旧错
(executor.py:1396/1401 的 `out` 未注解、
marker_tools.py:142),未动。
### 17.3 确定性检查层的覆盖边界(诚实版)
能拦:字面指令覆盖(中英)、shell 执行链、可疑 URL、
分隔符隐藏指令、git 输出里的注入文本(worker 侧与客户端
双重扫描)。不能拦:改写/编码后的指令、图片/附件/二进制
内指令、上下文相关的社会工程、需要理解语义的间接注入。
这些需要模型分类器,本轨不冒充。真机待验证清单见差距表
§4(worker 真实沙箱、SO_PEERCRED 真实 uid、超时/崩溃、
auditd 审计、与 P3 authd/Sentinel 的真接线)。