feat(chv): 对齐 Muse P6 privsep worker + 确定性安全检查层

- cloud/chv/privsep.py(新):Gitea worker 注册表(凭证白名单只含
  GITEA_TOKEN)+ 类型化请求/响应(request_id 绑定、64KB 上限)+
  Unix socket 客户端(超时/崩溃 -> 类型化失败 WorkerRefusal)+
  客户端白名单校验
- cloud/chv/safety.py(新):UntrustedData 来源标记 +
  InjectionScanner 确定性规则(block/flag/allow,中英)+
  redact_secrets + AuditLogger(只记指纹,不记值)+
  audit_inference_request/response
- chv-guest/chv-gitea-worker.py + .service(新):systemd 沙箱化
  worker(SO_PEERCRED 只放 root,仓限 ~/workspace,git 只配 authd
  helper,绝不持 token;输出先扫描再返回)
- chv-guest/chv-sync-worker-client.py(新):agent 侧薄 CLI
- chv-guest/chv-sync.sh:pull/push/status 有 socket 时走 worker,
  否则旧路径 + stderr 警告(过渡兼容)
- cloud/chv/executor.py:_run_guest 前后加推理边界审计钩子
  (best-effort)
- docs/chv-muse-p6-gap.md(新):差距表 + 覆盖边界 + 真机待验证清单
- docs/chv-production-readiness.md:§15
- cloud/tests/test_chv_muse_p6.py(新):43 项

测试:新测试 43/43;全量 cloud 套件 1910 OK(skipped=9);mypy
在新增文件上干净(剩余 4 处为基线旧错 executor.py:1396/1401、
marker_tools.py:142,未动)。
真机验证:未做,排队在 round-11 之后,清单见
docs/chv-muse-p6-gap.md §4。
This commit is contained in:
host committed 2026-11-06 22:31:54 +00:00
1 parent 06c3e172fe
commit 81e4eaf4db
10 files changed
+2071

No files matched your search

+59
View File
@@ -833,3 +833,62 @@
UNSTABLE、未合并、未部署、真机 0 项。差:外部为主。
- 动态安全 2.0 → 2.0,未达 10:本轨无任何动态验证,
V-7 未跑。差:外部(KVM 宿主 + 审计结论)。
## 15. 对齐 Muse P6 轨 feat-chv-muse-p6(privsep worker + 确定性安全检查层)
本节是准备工作,不是启用结论。本轨只到本地提交,不合并、
不部署、不推;生产就绪与动态安全的外部关卡原样未动。
基线 06c3e17(P1/P2/P3 之前的基线,不含 P3 的 authd/sentinel
代码——本轨与 P3 的接线走文件/socket 协议,合入时再接真实现)。
### 15.1 本轨改动
- `cloud/chv/safety.py`(新):`UntrustedData` 来源标记、
`InjectionScanner` 确定性规则(阻断/标记/放行三档)、
`redact_secrets`(审计前脱敏)、`AuditLogger`(只记指纹,
永不记值)、`audit_inference_request/response`(进出核心推理
的审计入口)。规则覆盖:指令覆盖(中英)、shell 执行链、
可疑 URL、分隔符隐藏指令;不覆盖:改写/编码指令、图片/
附件/二进制内指令、上下文相关社会工程(见 §15.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`),
钩子失败不影响主流程。
### 15.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),未动。
### 15.3 确定性检查层的覆盖边界(诚实版)
能拦:字面指令覆盖(中英)、shell 执行链、可疑 URL、
分隔符隐藏指令、git 输出里的注入文本(worker 侧与客户端
双重扫描)。不能拦:改写/编码后的指令、图片/附件/二进制
内指令、上下文相关的社会工程、需要理解语义的间接注入。
这些需要模型分类器,本轨不冒充。真机待验证清单见差距表
§4(worker 真实沙箱、SO_PEERCRED 真实 uid、超时/崩溃、
auditd 审计、与 P3 authd/Sentinel 的真接线)。