@furongjun1999/dsh-memory 0.6.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +588 -572
- package/codebuddy/CODEBUDDY.md +10 -10
- package/data/policy.json +27 -0
- package/docs/discipline/harnesses.yaml +31 -0
- package/docs/discipline/templates/full.md.tmpl +1 -1
- package/docs/discipline/templates/rules.mdc.tmpl +1 -1
- package/docs/eval/N225_/347/264/242/345/274/225/346/227/245/345/277/227/351/235/236/345/257/271/350/261/241/350/243/205/350/275/275/351/235/242/347/261/273/345/236/213/351/227/270_v1.0.md +418 -0
- package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/344/270/216/351/224/256/347/261/273/345/236/213/351/227/270_v1.1.md +441 -0
- package/docs/eval/issue43_/351/273/230/350/256/244/347/255/226/347/225/245/345/212/240/350/275/275/344/270/216/345/207/255/346/215/256/346/230/216/346/226/207/351/230/237/345/210/227_v1.0.md +398 -0
- package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/200/346/211/271_/346/216/245/347/272/277/344/270/216/347/255/211/344/273/267/345/217/230/346/215/242_v1.0.md +498 -0
- package/docs/eval//344/274/230/345/214/226/347/254/254/344/270/211/346/211/271_/351/227/250/347/246/201/350/275/254/346/255/243/344/270/216/350/260/203/345/272/246/346/255/242/350/241/200/344/270/216/351/227/250/346/216/247/346/224/266/345/217/243_v1.0.md +669 -0
- package/docs/eval//344/274/230/345/214/226/347/254/254/344/272/214/346/211/271_/344/276/235/350/265/226/351/200/217/344/274/240/344/270/216/345/257/271/346/213/215/345/217/243/345/276/204/344/270/216/350/264/237/347/274/223/345/255/230_v1.0.md +683 -0
- package/docs/eval//345/217/221/345/270/20307_/345/244/226/351/203/250/346/212/245/345/221/212/345/233/233/346/211/271/344/277/256/345/244/215/344/270/216/346/217/222/344/273/266/351/235/242/345/212/240/345/233/272_v1.0.md +205 -0
- package/docs/eval//346/200/247/350/203/275/344/270/223/351/241/271_/345/206/267/346/237/245/350/257/242/344/270/216/345/206/205/345/255/230_v1.0.md +218 -0
- package/docs/eval//346/225/205/351/232/234/346/263/250/345/205/245/345/256/236/346/265/213_v1.0.md +10 -0
- package/docs/eval//347/274/226/347/240/201/351/235/242/345/211/215/347/275/256_/345/205/245/345/217/243/350/207/252/344/277/235/350/257/201UTF8/344/270/216/346/226/207/346/234/254open/345/256/210/345/215/253_v1.0.md +646 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v20.md +283 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v21.md +224 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v22.md +223 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v23.md +293 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v24.md +303 -0
- package/docs/eval//347/274/272/351/231/267/346/214/226/346/216/230_/350/207/252/344/270/273/350/277/255/344/273/243_v25.md +230 -0
- package/docs/hive//346/243/200/347/264/242/350/267/257/345/276/204/344/270/216/350/256/244/347/237/245/347/273/223/346/236/204/345/245/221/347/272/246_v0.1.md +20 -0
- package/docs/hive//350/234/202/345/267/242M6_ingest/345/256/236/346/226/275/350/256/241/345/210/222_v0.1.md +1 -1
- package/docs/mdcg/README/350/257/246/347/273/206/347/211/210_v0.4.10.md +12 -0
- package/docs/mdcg//345/212/237/350/203/275/350/260/203/347/224/250/346/230/240/345/260/204/350/241/250_v0.1.md +40 -40
- package/docs/mdcg//345/217/221/345/270/203/351/227/250/347/246/201/351/223/276_v0.1.md +21 -9
- package/docs/mdcg//347/201/265/346/236/242/350/256/260/345/277/206/345/212/250/350/257/215/345/215/217/350/256/256_v1.0-draft.md +7 -2
- package/docs/mdcg//350/256/244/347/237/245/345/233/276_/347/264/242/345/274/225/344/270/216/345/267/245/347/250/213/350/247/204/350/214/203/345/214/226_/350/256/241/345/210/222_v0.1.md +39 -3
- package/docs/plans//345/205/250/344/270/255/346/226/207/347/274/226/347/240/201/344/270/216/350/234/202/345/267/242/344/273/273/345/212/241/346/240/207/350/257/206/345/245/221/347/272/246_v2.0.md +220 -0
- package/docs/plans//347/234/237/346/272/220/347/264/242/345/274/225_/351/200/232/347/224/250/346/234/272/345/210/266_v0.3.md +227 -0
- package/docs/plans//350/234/202/345/267/242/346/250/241/345/236/213/345/257/206/351/222/245/351/205/215/347/275/256/351/235/242_v1.0.md +385 -0
- package/docs//345/267/245/344/275/234/347/272/252/345/276/213_/350/256/244/347/237/245/345/233/276/346/235/241/347/233/256_v1.1.json +460 -460
- package/lib/bridge.js +24 -2
- package/lib/hooks.d.ts +31 -2
- package/lib/hooks.js +219 -16
- package/lib/init.js +16 -1
- package/lib/lib/prompt_safety.d.ts +52 -1
- package/lib/lib/prompt_safety.js +76 -1
- package/md_cg/audit.py +652 -379
- package/md_cg/bench6_arms.py +1 -1
- package/md_cg/bench_p0.py +1 -1
- package/md_cg/branches.py +2 -2
- package/md_cg/ccgc.py +1071 -1006
- package/md_cg/chain.py +1 -1
- package/md_cg/consistency.py +97 -9
- package/md_cg/consolidate.py +34 -9
- package/md_cg/crypto.py +59 -26
- package/md_cg/docindex.py +16 -1
- package/md_cg/evolution.py +17 -1
- package/md_cg/export.py +1 -1
- package/md_cg/forgetting.py +309 -13
- package/md_cg/fsutil.py +454 -8
- package/md_cg/identity.py +3 -3
- package/md_cg/insight.py +24 -3
- package/md_cg/linkref.py +1 -1
- package/md_cg/logref.py +327 -0
- package/md_cg/mcp_server.py +4152 -3818
- package/md_cg/mdcg.py +4208 -3547
- package/md_cg/mdcos.py +4491 -4159
- package/md_cg/mreview/pipeline.py +15 -1
- package/md_cg/nodefile.py +639 -575
- package/md_cg/protect.py +158 -11
- package/md_cg/protocol.py +41 -2
- package/md_cg/provenance.py +22 -4
- package/md_cg/reach.py +4 -4
- package/md_cg/readcache.py +76 -15
- package/md_cg/reconcile.py +1 -1
- package/md_cg/refindex.py +246 -37
- package/md_cg/refine.py +1 -1
- package/md_cg/routing.py +32 -5
- package/md_cg/run_tests.py +17 -0
- package/md_cg/scrub.py +30 -3
- package/md_cg/security.py +47 -1
- package/md_cg/self_state.py +5 -5
- package/md_cg/sources.py +23 -6
- package/md_cg/srcindex.py +352 -0
- package/md_cg/stg.py +47 -3
- package/md_cg/subgraph.py +2 -2
- package/md_cg/sustain.py +1299 -1168
- package/md_cg/tasks.py +469 -470
- package/md_cg/test_b1_auto_id_multiproc.py +277 -0
- package/md_cg/test_b1b2_write_face.py +417 -0
- package/md_cg/test_b2_sensitivity_landing.py +223 -0
- package/md_cg/test_b3_merge_keeps_content.py +576 -0
- package/md_cg/test_b4_shard_dir_selfheal.py +843 -0
- package/md_cg/test_b4_shard_dir_selfheal_guard.py +238 -0
- package/md_cg/test_c3_transient_read_negative.py +793 -0
- package/md_cg/test_c8_search_rrf_gates.py +502 -0
- package/md_cg/test_ccg_form_parity.py +188 -0
- package/md_cg/test_ccgc.py +28 -3
- package/md_cg/test_govern_directread.py +17 -4
- package/md_cg/test_h2_session_view_norm.py +233 -0
- package/md_cg/test_h4_sustain_snapshot.py +1377 -0
- package/md_cg/test_hive_ingest.py +285 -285
- package/md_cg/test_issue39_utf8_stdio.py +307 -16
- package/md_cg/test_issue43_default_policy.py +865 -0
- package/md_cg/test_legacy_p3_node_id_type.py +375 -0
- package/md_cg/test_linkref.py +10 -3
- package/md_cg/test_lock.py +2 -2
- package/md_cg/test_logref.py +1109 -0
- package/md_cg/test_m3_h9_bucket_health_protect_mark.py +301 -0
- package/md_cg/test_m3_h9_semantic_guard.py +525 -0
- package/md_cg/test_mr_m2.py +15 -3
- package/md_cg/test_n130_verify_falsified_protect.py +1 -1
- package/md_cg/test_n139_dek_provision_failclosed.py +185 -0
- package/md_cg/test_n176_link_trust.py +221 -0
- package/md_cg/test_n178_units_jobid_gate.py +212 -0
- package/md_cg/test_n184_keys_concurrent_provision.py +307 -0
- package/md_cg/test_n195_writepath_reload.py +283 -0
- package/md_cg/test_n196_stale_gate_skip.py +169 -0
- package/md_cg/test_n197_n208_write_face_gates.py +471 -0
- package/md_cg/test_n198_tokens_corrupt_failclosed.py +225 -0
- package/md_cg/test_n199_tokens_concurrent_write.py +378 -0
- package/md_cg/test_n201_proposal_visibility.py +382 -0
- package/md_cg/test_n202_session_notes_visibility.py +461 -0
- package/md_cg/test_n204_n205_n226_n227_n228_n229_exit_gates.py +542 -0
- package/md_cg/test_n206_stdio_jsonrpc_type.py +403 -0
- package/md_cg/test_n209_verify_write_face_gates.py +461 -0
- package/md_cg/test_n212_n213_n224_generation_gates.py +513 -0
- package/md_cg/test_n214_n215_n221_n222_write_face_gates.py +563 -0
- package/md_cg/test_n225_nonobject_load.py +1110 -0
- package/md_cg/test_n62_tenant_bind_failclosed.py +200 -0
- package/md_cg/test_neg_condition_hits.py +333 -0
- package/md_cg/test_neg_tail_honesty.py +663 -0
- package/md_cg/test_none_id_write_guard.py +4 -3
- package/md_cg/test_opt_batch1_md_cg.py +451 -0
- package/md_cg/test_p1.py +5 -5
- package/md_cg/test_p11_consistency.py +161 -12
- package/md_cg/test_p26_refindex.py +2 -2
- package/md_cg/test_p27_docindex.py +777 -774
- package/md_cg/test_p28_refcheck.py +740 -13
- package/md_cg/test_p29_session_ingest_export.py +2 -2
- package/md_cg/test_p2_mcp.py +12 -1
- package/md_cg/test_p30_maintain.py +33 -2
- package/md_cg/test_p31_insight.py +1 -0
- package/md_cg/test_p9c_dedup_hints.py +276 -0
- package/md_cg/test_policy_required_ccg.py +426 -0
- package/md_cg/test_protocol.py +22 -0
- package/md_cg/test_rank_parity_score_mode.py +516 -0
- package/md_cg/test_read_face_input_gates.py +363 -0
- package/md_cg/test_read_face_semantics.py +489 -0
- package/md_cg/test_recall_face_guards.py +812 -0
- package/md_cg/test_rejected_credential_forms.py +188 -0
- package/md_cg/test_rejected_redact.py +146 -0
- package/md_cg/test_retr_s1b.py +2 -2
- package/md_cg/test_retr_s5.py +20 -7
- package/md_cg/test_review_conformance.py +21 -3
- package/md_cg/test_security_audit_v21.py +2 -2
- package/md_cg/test_server_version.py +67 -0
- package/md_cg/test_srcindex.py +171 -0
- package/md_cg/test_tenant_env_override_warn.py +63 -50
- package/md_cg/test_token_lowercase_form.py +315 -0
- package/md_cg/test_v21r1_package_version.py +310 -0
- package/md_cg/test_writepipe.py +10 -4
- package/md_cg/tokens.py +225 -95
- package/md_cg/tool_face.py +4 -4
- package/md_cg/trust.py +49 -5
- package/md_cg/units.py +204 -6
- package/md_cg/weights.py +4 -4
- package/md_cg/whitebox_kb/wisdom/knowledge_points.py +1 -1
- package/md_cg/writelimit.py +42 -8
- package/md_cg/writepipe.py +651 -554
- package/package.json +3 -2
- package/skills/plugin.json +1 -1
- package/src/bridge.ts +25 -2
- package/src/hooks.ts +229 -16
- package/src/init.ts +15 -1
- package/src/lib/prompt_safety.ts +88 -1
- package/zcode/AGENTS.md +10 -10
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# 缺陷挖掘·自主迭代 第 22 轮报告(安全专项·三圈第七站)
|
|
2
|
+
|
|
3
|
+
> **元信息**:第 22 轮 = 安全专项·三圈第七站(承接 v20=第 20 轮三圈第五站、性能专项=第 21 轮〔`性能专项_冷查询与内存_v1.0.md`,编号用至 N172〕);落盘文件名 `缺陷挖掘_自主迭代_v21.md` 为编排指定(v20 之后顺延)。基线 HEAD `710a9d79`(批次 63);本轮修复落码注释标注「批次 65」。日期 2026-09-27。
|
|
4
|
+
> **报告会话核验口径**:本报告不是材料的誊抄——编号基线、历轮考证、代码锚点、4 件新守卫、敏感读名单守卫、`npm run gate` 归因均由本报告会话第一手实跑(命令与输出见第四节与第六节);各专项会话的动态复现按材料转述并逐项标注归属,未复跑项如实声明。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 一、执行摘要
|
|
9
|
+
|
|
10
|
+
本轮为四区复核(legacy / recent / authz / gateway)+ 五项修复落闸的安全专项轮:
|
|
11
|
+
|
|
12
|
+
- **确认 22 条**(条目口径):legacy 7 / recent 4 / authz 4 / gateway 7;**证伪·剔除 5 条**(recent 3 条候选证伪、gateway 2 条已修核销剔除)。
|
|
13
|
+
- **修复 5 项**(批次 65,全部红→绿守卫落仓):
|
|
14
|
+
- **3 项 high**:N173(hive `system_prompt_from` 裸读全文外发外部网关——凭据外发第三出口)、N174(`_redact_pii` `\b` 词边界对中文紧邻 PII 全漏——内容层兜底对主语料实质失效)、N176(ccgc `link` 对无凭据自报签章零消费——伪造「编外复核」直写 knowledge 层)。
|
|
15
|
+
- **2 项 legacy medium 欠账闭合**:N139(密钥库损坏静默重签 DEK 整份覆盖写回→损坏标记+provision fail-closed,v16 首报第 5 轮落闸)、N62(租户绑定被 env 入参覆盖 warn-only→fail-closed + 登记租户 clearance_cap 夹紧接线,v8 首报第 5 轮落闸)。
|
|
16
|
+
- **1 项搭车**:N175(`_context_block` 文本分支补 `_redact_pii` + `HIVE_READ_ROOTS` 对照,随 N174 同批落闸)。
|
|
17
|
+
- **留档 16 条**(分诊口径):其中 N175 条目已随修复⑤落闸核销(净未修 15 条);含 1 条 medium-越权首报 **N180**(as_unit 收窄读 restricted,建议下轮首批)、3 条 low 新发现(`_package_version` 导入崩、发版门禁占位符真阳性抑制、retire×碰撞重复集)、2 条流程/设计决策项与 7 项多轮 legacy 维持。
|
|
18
|
+
- **门禁**:python 全量回归通过(编排侧,退出码 0);npm test 未运行(TS 面无改动);**`npm run gate` 失败**——本报告会话实跑归因:`check_publish_artifact.py` **R4 非追踪件面命中=3**,恰为本轮 3 件新守卫尚未 git 提交所致(纪律规定 commit 由编排会话负责),入库提交后即转绿,非代码缺陷。
|
|
19
|
+
- **材料一致性声明(如实,未静默调和)**:①并行专项编号双占 N173/N174(gateway 已落码 vs authz 首报留档),本报告按 v16/v17 先例裁决消歧(见 3.0);②N175 已修仍列留档清单(分诊时点口径,五-13 核销标注);③N139 原轮次修复材料载「v8 首报」与全库 grep 实证(仅现身 v16)不符,以 grep 为准(3.1-L1)。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 二、修复清单(5 项,批次 65)
|
|
24
|
+
|
|
25
|
+
### 修复① N176(high):ccgc 无令牌签章可直写 knowledge 层——link 加信任闸
|
|
26
|
+
|
|
27
|
+
- **where**:`md_cg/ccgc.py`——attest(:606-672,无 `verifier_token` 时 `verifier_identity="self-reported"` 纯自报,:138 缺省值)→ link(:713-833,原对 `verifier_identity` **零消费**,`apply=true` 经 `_cg._write_node` :785-786 直写 knowledge 层)/ link_pending(:984-1000,委托 link 同面);MCP 面 `mcp_server.py:2541`(ccgc link 走 link_pending 同一写闸)、:2520-2537(attest 直通)。
|
|
28
|
+
- **攻击面**:record 角色(can_write=True、ops_allow 含 ccg,`tokens.py:126-141`)单 agent:compile → attest(verdict=ACCEPT、verifier=任意编造名、无令牌,E041 只拦同源不拦编造名)→ link(apply=true):未经验证内容带「已签章」状态直写 knowledge 层并进入检索传播;docstring「下游策略可据此拒绝」为未兑现空防线(全仓 grep `verifier_identity` 无任何下游消费)。
|
|
29
|
+
- **修复**:①`E_CODES` 新增 **E052**「无凭据签章:验证方身份未经 mdcg 令牌验签」(ccgc.py:73-76);②link 在依赖闸门之后、dry-run 分支之前加信任闸(ccgc.py:759-770):`verifier_identity != "token"` 且 `apply=true` → E052 拒绝写入(**fail-closed**,字段缺失/未知取值按无凭据处理,兼容 issue#27 之前旧 pending 数据);`apply=false` 不拦、仅附「E052 预告」warning;③模块/attest/link docstring 与机器可读生效条件注释同步(ccgc.py:20-21、:619-620、:714、:720-722,本报告会话 grep 实证 :21/:73/:620/:714/:720/:761 锚点在位)。有令牌路径与同源 E041 判据一字未动。
|
|
30
|
+
- **攻防前后对比**:修复前(临时 MDCG_ROOT+临时 MDCG_TOKEN_FILE 实测):编造名 attest ok=True(identity=self-reported)→ link(apply=true) ok=True、written=6、errors=[],knowledge 层六行落盘、六要素判 complete;修复后同一攻击链:attest 环节病灶如实保留(自报签章 ok=True 但标注 self-reported),link(apply=true) 返回 ok=False、written=0、errors 含 E052(link_pending 委托同闸且拒绝后 pending 保留待令牌复核);MCP 面 compile→attest→link 同闸;盘上 knowledge 层无六行、六要素 incomplete——未落库即无检索传播。对照面:有令牌签章(verifier 被令牌 actor 覆盖、identity=token)正常落库 written=6;同源变体 E041 照拦;dry-run 行为不变。
|
|
31
|
+
- **守卫**:`md_cg/test_n176_link_trust.py`(新守卫 20 断言,X1 权限面固定 / X2 攻击复现四连断言 / X3 link_pending 同闸 / X4 MCP 工具面同闸 / X5 有令牌不误伤 / X6 同源 E041 不动 / X7 dry-run 预告)。红→绿实测(修复会话):修复前 FAILED 7 项(exit 1)→修复后 ALL OK 20 项(exit 0)。**本报告会话复跑:`python -X utf8 -m md_cg.test_n176_link_trust` → ALL OK 20 项**。
|
|
32
|
+
- **回归(修复会话)**:test_ccgc 87/0、test_govern_directread 40/0、test_i27_e041_identity 12 全过、`run_tests md_cg` 163/163+3 跳过(runner 固有口径)。
|
|
33
|
+
- **边界声明**:蜂巢 review 通道自动签章(units.to_attest_args 无 verifier_token)现状即 self-reported,修复后其 link 被 E052 拒、须令牌验证方重签——正是兑现「下游可拒绝」语义;全量验证方信任协议按 ask 留档不扩(第七节跳过项 8)。
|
|
34
|
+
|
|
35
|
+
### 修复② N62(medium-legacy,第 5 轮):租户绑定被入参覆盖 warn-only → fail-closed + cap 夹紧接线
|
|
36
|
+
|
|
37
|
+
- **where**:`md_cg/tokens.py` verify_token(:394-455)——①租户绑定被入参覆盖:原 :433-446 仅 stderr 告警(warn-only 零闸变),:447-448 `tenant=tenant or rec.get("tenant") or "default"` 形参照常顶替令牌租户;②cap 夹紧欠账:`security.TenantRegistry.cap_of/principal_for`(security.py:323-341)现成但权威令牌路径零调用。
|
|
38
|
+
- **攻击面**:env 注入面(MDCG_TENANT)+ 任一他租户令牌:tenantA 签发的 designer(secret,can_admin) 令牌借 MDCG_TENANT=tenantB 即以 secret+can_admin 对 tenantB 登记根运行;跨租户 DEK 面(`crypto.py:285-294` 信封按 (tenant,actor) 键控 + issue 缺省 actor=role 名 tokens.py:373)——actor 同名部署形态下 private 加密档同洞(材料 B6/B7 端到端解出跨租户 private 明文双证)。
|
|
39
|
+
- **修复**(最小修 +46/-18,mcp_server 零改动):a) 导入 TenantRegistry(:39,security.py 无 tokens 反向依赖零环);b) ②覆盖告警改 **fail-closed raise TokenError**(:441-452,触发条件与原告警完全同形,消息保留「租户绑定被入参覆盖」锚点+两侧租户名+校正指引;本报告会话 grep 实证 :433 注释「第 5 轮成立,2026-09-27」、:442 拒绝文案、:452/:456 登记表接线在位);c) ①令牌路径 cap 夹紧接线(:453-465):MDCG_TENANT_REGISTRY env 回落(与 `_resolve_root:3575` 同源)构造 TenantRegistry,**仅登记租户在册且 `_rank(clearance)>_rank(cap)` 时夹紧为 cap**;未登记租户/登记表缺失或损坏零闸变(N124 先例同口径,fresh install 行为不变);d) :393 生效条件注释同步新契约。
|
|
40
|
+
- **攻防前后对比**:修复前:tenantA designer 令牌+verify_token(tenant="tenantB") → Principal(tenant='tenantB',clearance='secret',admin=True)(仅告警覆盖成功);tenantC cap=internal 的 designer 令牌 clearance='secret' 未夹紧、allows private/secret 均 True;修复后:覆盖被抛 TokenError(冲突路径零 Principal);tenantC 夹紧 internal(allows private/secret 均 False、internal 本级可读,纯收紧);未登记 tenantD 原样、tenant=None/空串/同值零异常回落;MCP 面同闸(err 含锚点/principal=None)。
|
|
41
|
+
- **守卫**:`md_cg/test_n62_tenant_bind_failclosed.py`(新守卫 12 项,R1 覆盖被拒 / R2 cap 夹紧 / R3 未登记零闸变 / R4 无冲突三态零误伤 / R5 MCP 进程面三断言)。红→绿实测(修复会话):红 6 项(R1a/R1b/R2a/R2b/R5a/R5b,exit 1)→ ALL OK 12 项(exit 0)。**本报告会话复跑:ALL OK 12 项**。既有 `test_tenant_env_override_warn.py` 按新契约适配(v8 告警止血→fail-closed,docstring 留档演进,非静默改绿)。
|
|
42
|
+
- **原轮次与复测轮数(本报告会话 grep 考证)**:v8:94 首报(v8.md:94 实证)→ v9/v15/v16 历轮复测(v9/v15/v16 文件 grep 均现身)→ 本轮第 5 轮落闸(tokens.py:433 注释原文自证)。
|
|
43
|
+
- **边界声明**:仅登记租户夹紧(cap_of 对未登记租户返回 DEFAULT_SENSITIVITY,无条件接线会把全部 fresh-install 令牌夹到 internal 属改宽风险,守卫 R3 钉死);derive 派生子令牌继承 parent.tenant 同闸;DEK (tenant,actor) 键控面随覆盖被拒一并闭合;issue 缺省 actor=role 名未动(改名属改宽面不在本单)。
|
|
44
|
+
|
|
45
|
+
### 修复③ N139(medium-legacy,第 5 轮):密钥库损坏静默重签 DEK 整份覆盖写回 → 损坏标记 + provision fail-closed
|
|
46
|
+
|
|
47
|
+
- **where**:`md_cg/crypto.py`——`_load_keys`(修复前 :263-274,`except (ValueError, OSError): pass` 静默回落空 envelopes,损坏 JSON 与版本漂移双腿零告警零标记)+ `provision_dek`(修复前 :290-314,据空表走重签分支并经 `_save_keys` :313 **唯一写点**整份覆盖写回——旧信封无痕抹除、旧密文永久不可解,全程无备份无审计无 stderr;rotate_dek :343-345 委托 provision_dek 自动继承)。
|
|
48
|
+
- **攻击面**:本地文件系统访问或部署侧事故(磁盘截断/部分写/版本升级脚本写坏 `_keys.json`)即触发;非远程可利用但后果**不可逆**。
|
|
49
|
+
- **修复**(三处最小改动,编排侧 git diff 取证含且仅含三处):a) import sys;b) `_load_keys`:缺文件=fresh install 零告警零标记(纯收紧不改宽);JSON ValueError、OSError、或顶层 dict 但 envelopes 缺失/非 dict(版本漂移腿)→ stderr 告警开口(「[mdcg-crypto] ⚠ 密钥库损坏/不可读…N139…请修复或恢复该文件后重试」,本报告会话 grep 实证 :278-279 文案、:283 load_error 标记)并返回带 load_error 的空结构(unwrap/has/envelopes 读面零闸变);c) `provision_dek`:load_error 为真即 raise LockedError(:298 生效条件注释实证),**损坏文件字节永不覆盖**;LockedError⊂CryptoError 被 `mdcos._init_crypto`(mdcos.py:3689-3700)既有 catch 捕获 → `_crypto_error` 留痕 + dek=None,fail-closed 降级不崩进程。
|
|
50
|
+
- **攻防前后对比**:修复前(哑 KEK=os.urandom(32)+临时目录确定性复现):截断 JSON → provision 返回新 DEK 且 stderr=''→整份覆盖写回(文件 20→289 字节)→旧信封被抹、旧密文 unwrap 抛 LockedError 永久不可解;版本漂移腿同面。修复后:provision 被拒(含锚点+修复/恢复指引)、stderr 告警开口、原文件字节不被覆盖;unwrap 照旧按无信封抛(不假装能解密,文件留原样供手工修复);fresh install / 完好文件幂等路径零闸变;生产面 MdCGSecure 构造不崩、`_crypto_error` 留痕、dek=None(private/secret 写被拒降级)、坏文件字节原样。
|
|
51
|
+
- **守卫**:`md_cg/test_n139_dek_provision_failclosed.py`(新守卫 14 项,R1 截断腿五断言 / R2 读面零闸变 / R3 fresh install / R4 幂等对照 / R5 版本漂移腿 / R6 生产面四断言)。红→绿由**编排侧 git stash 双态机械证据**独立裁决(stash 后实跑=8 FAIL 与修复前红项清单逐项一致;pop 恢复后=ALL OK 14)。**本报告会话复跑:ALL OK 14 项,stderr 告警真实打印可见**。
|
|
52
|
+
- **原轮次与复测轮数(本报告会话 grep 考证)**:**v16:91 首报**(v16.md:5 载明由检索区暂编 N131 顺延重编为 N139、:91 留档行实证;v16:166/:180 列为「大设计决策专项」)→ 本轮动态再实锤并落闸。**如实声明**:修复材料「v8 首报→v9/v15/v16 历轮成立→本轮第 5 次」的历轮计数链与全库 grep 不符(`grep -rln "N139" docs/eval/` 仅现身 v16 一件)——以 grep 实证为准,「第 5 轮」口径采 tokens/crypto 落码注释自证(N62 同轮第 5 轮)。
|
|
53
|
+
- **边界声明**:闸只接 provision_dek(_save_keys 唯一写点在其内,rotate 委托继承;unwrap/has/envelopes 只读零闸变);损坏回落仍返回空结构;审计 jsonl(_crypto.jsonl)接线未含(ask 定 stderr+标记即可)。**环境声明(照录)**:修复会话中段 Read/sed/grep/Bash 输出面劣化,该会话输出仅作旁证,以编排侧 git diff+stash 双态机械证据为准——本报告会话独立复跑守卫 14 项全绿,佐证落闸状态。
|
|
54
|
+
|
|
55
|
+
### 修复④ N173-gw(high):`system_prompt_from` 裸读全文外发外部网关——第三出口封堵
|
|
56
|
+
|
|
57
|
+
- **where**:`hive/exec.py` resolve_system_prompt(修复前 :357-371 裸 `open(path).read()`)→ :456-459 build_messages 置 system 消息 → :1253-1260 build_body 原样携带 → :1275-1292 `_post_chat` POST `{HIVE_API_BASE}/chat/completions`;`_sensitive_read`/`HIVE_READ_ROOTS`/`_redact_pii` 三道防线一概不生效(N127/P2-22 只堵了 context_files 同族通道,此为第三出口)。对照 :384 `_context_block` 通道调 `_sensitive_read(os.path.realpath(path))` 同函数族不对称。
|
|
58
|
+
- **攻击面**:spec 作者/提交方(CLI 层)设 `system_prompt_from` 指向任意可读文件(私钥/凭据)→ 全文作为 system prompt 随首次请求外发外部网关。入口面核实:`hive_mcp/mcp_server.py:403-408` SPAWN_ALLOWED_KEYS 不含该键(:413-420 显式拒绝)、orch.py:461 子任务白名单同——入口为 CLI spec 作者/`exec_cmd.py:163 _delegate` 读 spec.json 全量透传(与 N127 补闸时威胁模型同族,入口更窄)。
|
|
59
|
+
- **修复**(38+/5-,落码 :347-395;本报告会话 grep 实证 N173 注释 :357/:370/:377/:395):闸一 realpath 规范化后过 `read_roots()`(HIVE_READ_ROOTS 非空且 real 不在任一根下 → SpecError fail-closed,部署收窄面从 read_file:1157-1162 扩展覆盖本通道);闸二 `_sensitive_read(real)` 命中敏感凭据路径 → SpecError(**不回落** spec.system_prompt 旧字面量,与 _context_block 同判据);正文过 `_redact_pii` 内容层兜底(脱敏生效时 log 留痕);source 标签保持 `file:ref` 不变。
|
|
60
|
+
- **攻防前后对比**:修复前(git HEAD 旧码,哑 id_rsa+哑 env 临时目录,`_post_chat` mock 零真实网络):函数面返回私钥全文、出站 body `messages[0].content` 含 OPENSSH 私钥块(标准 PEM 头);.env 族扩展/白名单外真源/PII 正文同样放行(红证 5/6)。修复后:函数面 SpecError「命中敏感凭据路径拒读(fail-closed,不回落旧提示词)」;build_messages 组装前拦截;白名单内真源(prompt.md)重建语义不误伤;正文哑 `sk-` 令牌替换为 `[已脱敏:API密钥]`(5/6 绿,F10e 旧码本绿为无误伤对照)。
|
|
61
|
+
- **守卫**:`hive/test_exec_tools.py` F10~F10f 六件(+65 行,哑私钥/.env 临时文件+哑数据,零网络零真凭据)。红→绿逐字实测(修复会话):git HEAD 旧 exec.py(临时副本模块加载,零 stash 避并发冲突)× 新守卫 = 5 红/1 绿 → 修后 6/6 绿。**本报告会话复跑:`python hive/test_exec_tools.py` → 104 通过 / 0 失败**。回归(修复会话):`run_tests.py hive --jobs 4` 17/17、全仓 `run_tests.py --jobs 4` 221/221+5 跳过(依赖缺失,此前即有)。
|
|
62
|
+
|
|
63
|
+
### 修复⑤ N174-gw(high)+ N175 搭车(medium):`_redact_pii` CJK 紧邻漏脱敏 + `_context_block` 内容层补闸
|
|
64
|
+
|
|
65
|
+
- **where**:`hive/exec.py` `_PII_PATTERNS`(修复前 :1030-1041)五模式全用 `\b` 词边界——Python3 Unicode 下 CJK 属 `\w`、与数字/字母紧邻处无边界,中文紧邻形态(中文语料默认书写形态)全部漏脱敏;`read_file`(tool_read_file 内容脱敏点)与 `lingshu_cg` 返回体(`_redact_deep`)同源失效,「内容层兜底」对主语料实质失效。**N175**:`_context_block`(修复前 :396-403)文本分支不过 `_redact_pii` 且无 `HIVE_READ_ROOTS` 检查(与 read_file :1157-1162/:1201 双防线不对称)。
|
|
66
|
+
- **攻击面**:任何含「电话13800138000」「身份证…」「邮箱zhangsan@example.com」(PII 与中文直接相邻)的被读文件/记忆节点 → tool 消息/返回体原文发外部网关;spec.context_files 传含 PII 的普通命名文件 → 全文随 user 消息外发(同一文件走 read_file 则被脱敏)。混淆形态(换行拆分/零宽字符/全角/连字符)亦全漏。
|
|
67
|
+
- **修复**:①`_PII_PATTERNS` 四类文本模式 `\b` → 显式 ASCII 边界 lookaround:前 `(?<![0-9A-Za-z])`、后 `(?![0-9A-Za-z])`(API密钥/身份证号/手机号/邮箱四条;私钥块用字面标记不受影响;落码 :1045 起定义、:1052/:1054/:1056/:1058/:1060 lookaround 实证)。**与 ask 最小修方向的一处偏差(实测依据)**:ask 的后瞻负类写作 `(?![0-9A-Za-z)])`(含 `)`)——实测旧 `\b` 码对「张三(13800138000)」本命中(红证对照基线 5/5 hit 含半角括号样本),把 `)` 纳入负类会使该常见书写形态从命中变漏出=回退;而旧集⊆新集可证(旧 `\b` 命中需两侧非 `\w` ⇒ 非 ASCII 字母数字 ⇒ 新 lookaround 必放行),故纯 ASCII 负类是旧集严格超集、零回退且多兜中文紧邻;红守卫 F11b 以半角括号样本把该偏差钉进常驻守卫。②**N175 搭车(ask 明示同批)**:`_context_block` 入口 realpath 单次规范化后补 `read_roots()` 白名单对照(越界返回 `skipped="读权限白名单拒读"` 标注块+notes 留痕+log,不拒整个 spawn,语义对齐 P2-22 敏感凭据跳过先例)+ text 分支补 `content = _redact_pii(content)`(落码 :402 生效条件注释与 :412/:414/:441 N175/N174 注释实证)。
|
|
68
|
+
- **攻防前后对比**:修复前(git HEAD 副本实测):「电话13800138000」「身份证110101199003078515」「邮箱zhangsan@example.com」「令牌sk-abcDEF1234567890ab」四样本 `_redact_pii` 全部原样返回(RED-COUNT 4/4);同源失效端到端:tool_read_file 原文含手机号(leak=True)、`_redact_deep` 同漏、`_context_block` 文本块原文随 user 消息外发、白名单外 context 块旧码直读外发(红 8/9)。修复后:四样本全部替换为 `[已脱敏:*]`(漏出 0/4);read_file `pii_redacted=True` 如实标记;context 文本块脱敏、无 PII 块逐字不变、白名单外返回 skipped 标注块;对照样本(空格分隔/纯 ASCII/全角括号/半角括号紧邻)与 ASCII 串内长令牌子串行为与旧码逐位一致(零回退零误伤)。
|
|
69
|
+
- **守卫**:`hive/test_exec_tools.py` F11/F12 共 11 件(F11×4 中文紧邻、F11b 五样本对照不回退、F11c ASCII 串内不半截吞、F11d `_redact_deep`、F11e read_file 端到端、F12 context 文本块脱敏、F12b 无 PII 块逐字不变、F12c 白名单外 skip-block)。套件 93→104 通过/0 失败(修复会话)。**本报告会话复跑:104 通过 / 0 失败**。完整性(修复会话):`_PII_PATTERNS`/`resolve_system_prompt`/`_context_block`/`_redact_pii` 定义各恰 1、lookaround 4+4、旧 `\b1[3-9]` 残留 0。
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 三、发现明细
|
|
74
|
+
|
|
75
|
+
### 3.0 编号裁决声明(照 v16:5 / v17:5 先例,非暗改)
|
|
76
|
+
|
|
77
|
+
本轮并行专项材料存在编号双占:gateway 专项 N173/N174 与 authz 专项 N173/N174 指向**不同**缺陷。裁决规则=①**修复结果、落码注释与守卫文件名已锚定者保留原名**:hive/exec.py 的 N173(:357/:370/:377/:395)、N174(:412/:414 注释,lookaround 落码 :1052-1060)、N175(:402/:412/:441)与 md_cg/ccgc.py 的 N176(:73/:759-770,守卫 `test_n176_link_trust.py`)——均带「批次 65,2026-09-27」落码注释(本报告会话 grep 实证);②**未落码的 authz 区两项顺延重编**:原暂编 **N173-authz(as_unit restricted 提权)→ N180**、原暂编 **N174-authz(legacy env clearance 未夹紧)→ N181**;③本轮新发现自 N173 续编(基线 grep 实证 docs/eval max=N172、N173-N179 零占用)、**终号 N181,下轮自 N182 续编**。留档材料按原暂编号引用处,以本映射为准。
|
|
78
|
+
|
|
79
|
+
### 3.1 legacy 区确认 7 条(原轮次与复测轮数逐条标注)
|
|
80
|
+
|
|
81
|
+
| # | where | 问题(一句话) | 级别 | 原轮次→复测 | 处置 |
|
|
82
|
+
|---|---|---|---|---|---|
|
|
83
|
+
| L1 | `md_cg/crypto.py`(修复前 :263-274 + :290-314) | 密钥库损坏/版本漂移静默回落空 envelopes→provision 据空表重签新 DEK 整份覆盖写回,旧信封无痕抹除、旧密文永久不可逆 | medium | **v16:91 首报**(暂编 N131→N139 顺延,grep 实证全库仅现身 v16)→ 本轮动态再实锤(临时目录+哑 KEK 复现与留档口径逐点一致:截断 JSON 下 provision 返回新 DEK、stderr=''、t1\|a2 信封被抹、unwrap 抛 LockedError) | **本轮已修**(修复③) |
|
|
84
|
+
| L2 | `md_cg/mdcg.py:2709`(基类 search 负记忆段裸调)+ :2388(get 同款) | A6-d 复测定案:生产检索面不成立(豁免链实测成立——MdCGSecure 加 _readable 过滤 mdcos.py:4023-4024、_neg_coverage 走 _read mdcos.py:736、生产入口 cg=MdCGSecure mcp_server.py:3712),仅基类残面在位——脏负记忆条目令 :2709 裸调 `_node_disk_path` 抛 ValueError 中断全检索 | low | 外部对抗清单 A6-d(v0.6.0 实测报告后半)→ 本轮复测定案 | 留档(五-1;本报告会话 grep 实证 :2709 `full_path = self._node_disk_path(e)`、:2388 `p = self._node_disk_path(e)`、:2399 P2-20 生效条件注释在位) |
|
|
85
|
+
| L3 | `scripts/bootstrap_watchdog.py:66-68 + :138-147 + :107-120/:124-134/:265-270 + :303-308` | A7-a 复测定案两臂:①ts/JSON 格式漂移臂不成立(read_tail 跳坏行、no_log 走 return 1 fail-closed 不假绿);②round 枚举漂移残面在位——未来新增错误类轮次名未登记 DEGRADED_ROUNDS 时被「不计入不打断」吞掉,内容级判活对该类型静默失效 | low | 外部对抗清单 A7-a → 本轮复测定案(与 v20 S4/N170 及批次64 F3/N169〔git bc5ae11f〕同文件不同面,无重复报) | 留档(五-2;本报告会话 grep 实证 :67 DEGRADED_ROUNDS、:107 read_tail、:137 生效条件「其他 round(如 gap_watch)既不计数也不打断」原文在位) |
|
|
86
|
+
| L4 | `hive/exec.py:962-990`(A5-b)+ `md_cg/audit.py:171-176`(A6-b)+ `md_cg/audit.py:329-335`(A6-a)+ `md_cg/mcp_server.py:3506-3520`(A5-c) | 外部对抗清单四项已修剔除的核销复核全部成立:A5-b=V21-8 族匹配+N141 后缀族在位;A6-b=P2-18 test_cmd 只取服务端 env(audit.py:171 注释实证)、调用 ctx 无 cwd 键;A6-a=P2-19 模块名格式白名单在位(MDCG_VERIFIER_MODULES 任意合法 import 路径属部署 env 信任面,low 备注维持);A5-c=P1-5 双开关收紧在位(单开关降级 recorder stderr) | low | 外部对抗清单(批次 26/30/34/49 已修)→ 本轮核销复测 | **核销留档,无修复需求**(五-3;本报告会话第一手:复跑 `python -m hive.test_sensitive_read_names` → 16 pass / 0 fail;grep 实证 audit.py:171/:310-317、mcp_server.py:3470/:3476/:3506 锚点) |
|
|
87
|
+
| L5 | `hive/exec.py:920-936`(A1-e)+ `md_cg/crypto.py:63`〔材料写 :62,行号微漂 1 行〕、`md_cg/security.py:372-383`、`md_cg/mdcos.py:3942-3945`(A3-c)+ `scripts/migrate_restricted.py:28/:47-49/:73-89`(A3-d) | 三项设计裁定面留档维持,无越权实证:A1-e read_roots「未设置=放开」文档化语义在位但显式空值静默失效无告警(四形态直调 unset/空串/`" ;;; "`/真实目录→()/()/(dir,) 实证);A3-c restricted=错误处置标记(批次28 分型)且读取仍过 can_read_restricted 角色闸,PII 概率防线只挂 hive 侧=v17 N86 同族 low;A3-d 迁移脚本 --apply 一步全量不可逆、无 --yes 二次确认(dry-run 缺省+docstring 警示在位,V22 passthrough 已修) | low | 外部对抗清单 → 本轮设计裁定面留档维持 | 留档(五-4;本报告会话 grep 实证 crypto.py:63、security.py:380、mdcos.py:3943/:3945、hive/exec.py:964) |
|
|
88
|
+
| L6 | v8 N66 / v8 N68 / v15 N125 / v15 N126 / v15 N129 / v16 N134 / v17 N143(七项;v8 N62 已由修复②闭合移出) | 多轮留档未修安全项现状读核全部在位、维持原分级与 deferred 理由,本轮无升级证据:N66 chat CSRF(v8:104 首报→v13:102→v15:120→v20:158 T6 第四次→本轮留档确认,未重跑浏览器面);N68 orch/env 白名单(v8:112 首报;orch.py:459-463 含 "mdcg_root"+exec.py:771 兜底在位);N125 MDCG_SESSION 重设(v15:100 首报→v16 第 2 次→本轮第 3 次,见 3.3-A2);N126 审计吞错(v15:17 首报;mdcos.py:378-382+crypto.py:399-404 两处 except OSError: pass 在位,材料实测行号微漂 :403-404);N129 P1-4「env 未设置=放开」裁定(v15:18 首报;security.py:344-347 注释在位);N134 readcache 无差别缓存(v16:18 首报;readcache.py:105-110 在位);N143 swarm shared_secret 空串缺省(v17:4-5 首报〔WAL 缺省密钥族两域合并〕;swarm_cli.py:93 在位) | low | 见各条首报轮 → 本轮读核在位性确认 | 留档(五-5;v16 其余留档 N133/N135-N138/N140 未逐项重测——批次63 纯性能、批次64 scripts+TS 域,以 v16 留档为准,如实标注) |
|
|
89
|
+
| L7 | 编号基线与清账口径 | 全 docs/eval 实测最大 N 编号=N172(本报告会话 `grep -rhoE "N1[0-9]{2}" docs/eval/*.md \| sort -u` 尾部 N161..N172、计数 73);外部对抗清单 4 项已修剔除、1 项 medium 再实锤已修(N139)、5 项定性 low;本轮全部动态复测在系统临时目录+哑 KEK 环境、测毕清理(CLEANED:True) | 记账项 | 本轮清账 | 编号裁决见 3.0;纪律见第六节 |
|
|
90
|
+
|
|
91
|
+
### 3.2 recent 区:确认 4 条 + 证伪 3 条
|
|
92
|
+
|
|
93
|
+
**确认(均 origin=new,本轮首报编号):**
|
|
94
|
+
|
|
95
|
+
| # | where | 问题 | 级别 | 证据要点 | 处置 |
|
|
96
|
+
|---|---|---|---|---|---|
|
|
97
|
+
| R1 | `md_cg/mcp_server.py:47-53`(同族 `hive/hive_mcp/mcp_server.py:47-54`;消费点 :3786/:702) | `_package_version` 异常网只捕 (OSError, ValueError):package.json 为合法 JSON 但顶层非对象时 **AttributeError 逃逸**→:57 `SERVER_VERSION=_package_version()` 在 import 时求值→MCP server 起不来,违背 :46「损坏回落保底值不阻塞启动」契约;version 非字符串(如 123)经 `.get("version") or "0.1.0"` 原样返回 int | low | 材料实测:`[1,2]`→RAISED AttributeError(md_cg 与 hive 同构);`{"version":123}`→返回 123 (type=int);对照坏 JSON/文件缺失→'0.1.0'、合法对象→'9.9.9' 均正常;真实导入两模块 SERVER_VERSION='0.6.0';守卫 `test_server_version.py` 4/0 但其 ④ 仅 OSError side_effect(:60),两新面未覆盖 | 留档(五-6,速收候选) |
|
|
98
|
+
| R2 | `scripts/check_publish_artifact.py:85-96`(FAKE_TOKEN_MARKERS :85 + `_looks_placeholder` :89 全串子串匹配)+ :205-228 | 占位符降级按「标记子串出现在命中全串任意位置」判定:真形态令牌任意段恰好含标记子串即被静默降级为 NOTE,整条逃逸 R1 凭据 FAIL(批次64 修掉首配逃逸后残留的真阳性抑制面) | low | 材料实测:`npm_a1B2…xxxx9J0…`(fullmatch npm_[A-Za-z0-9]{36})→ FAIL hits=0, NOTE=1;含 'fake' 同型同面;`mdcg1.example-user.tk_…`→NOTE;对照无标记同型→FAIL hits=1(正确)、既有占位样串→NOTE(正确);`--selftest` 30 PASS、占位符断言 6 条全过——标记子串逃逸面零断言覆盖 | 留档(五-7,小设计决策) |
|
|
99
|
+
| R3 | `scripts/bootstrap_loop.py:190-198`(N169 新增 `_atomic_write_json` 固定 `path+'.tmp'` 名,无锁)+ :178-183(P2-14 原子款同型)+ :201-227 自愈面 | 固定 tmp 名使设计外并发写者互相碰撞:①大量 PermissionError(WinError 32)更新整体丢失;②半写者持句柄挂起+并发写→撕裂内容经 os.replace 落进**活路径**→`_load_json_state` 隔离重建=状态静默清零 | low | 材料实测(MDCG_DATA_ROOT=临时目录,真函数直调):S1 两线程各 30 次完整原子写→errors=28/60;S2 半写者+并发写→活文件终态 `{"writer": "B"}\x00×N`(len=431)、json.loads TORN: Extra data——撕裂直接落活路径;v20:114 已裁决「单实例拉起、多实例并发非设计场景、不加锁取舍成立」(本报告会话 Read v20:114 原文实证)→ 文档化运行模型内不构成缺陷 | 留档(五-8,文档化取舍维持) |
|
|
100
|
+
| R4 | `scripts/dsh_log_index.py:551-562`(碰撞→ext 兜底切换)+ :564-588(写循环只查 id 存在即跳过)+ :595-620(`--retire-private-legacy` 软删);碰撞防线主体 :478-506 | retire×碰撞一致性缺口:碰撞→ext 入账(正确)→retire 软删主空间旧节点→重摄时主空间已空→同会话同章节以主 token 再次全量入账,与 ext 旧副本并存(两套节点 id、无 tombstone、无去重)——文档化处置流对每个发生过碰撞的会话稳定产出永久重复集,检索池双份召回稀释排序 | low | 材料端到端实测(临时库+哑密钥 'ab'*32,真 derive/ingest/retire 直调):ingest#1 collision=True fail-closed 切 ext(正确)→retire 返回主 token 件→ingest#2 collision=None skipped=0→终态双份同正文节点 DUPLICATE SET=True;retire 直构 can_admin designer Principal 零凭据与 review_cli 同款 local-cli 信任模型一致,爆炸半径限于 dsh-log-*∧private(trash+删除清单可恢复) | 留档(五-9,大设计决策) |
|
|
101
|
+
|
|
102
|
+
**证伪/剔除 3 条(rejected,全部有实测依据):**
|
|
103
|
+
|
|
104
|
+
| # | where | 证伪理由 |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| J1 | `src/init.ts:119-146、:305-312`(候选5:mcp.json 片段内容注入面) | 前提不成立:buildSnippet 经 JSON.stringify(:310)序列化、片段落盘固定名不含用户输入、落盘 cwd 无遍历;tsx 直调真 buildSnippet/runInit(cwd/home 落临时目录,Write 工具直写探针文件杜绝 shell 转义失真):敌意值 `'C:\\we"ird\nline\\..\\..\\evil'` 与 `'py"thon\n& calc'` → stringify→parse lossless:true、落盘片段 JSON.parse 后与内存对象逐字节等——宿主 JSON.parse 后值逐字节还原无逃逸;波浪线探针(~→home、~user→cwd 字面 ~user 为 :110 文档化边界);`node --import tsx --test test/init.test.ts` 7/7 PASS;临时目录已清理 |
|
|
107
|
+
| J2 | `src/bridge.ts:211-223`(N119 stdin error 监听)、:262-311(exit 恢复分支)(候选6) | 修复成立::220-223 监听仅 console.error+probe 留痕、零状态变更、按 spawn 每代一份;恢复由既有 exit 分支收尾(rejectAll+状态迁移+重试/冷却),换代旧 proc exit 早退分支 :266-269 防串台;`node --import tsx --test test/bridge_stdin_error.test.ts` 1/1 PASS(断言「大消息滞留+子进程死亡不产生 uncaughtException」);唯一残余=「stdin 断但子进程不发 exit」罕见态挂起等至 timeoutMs——超时闸在,不构成缺陷 |
|
|
108
|
+
| J3 | `scripts/dsh_log_index.py:478-506`(派生标识)、:509-520(_dsh_log_owner fail-closed)、:551-562(占用核验→整体切 ext)(候选7:N167 派生标识碰撞静默丢数据) | 修复成立:命名守卫 `python scripts/test_dsh_log_index_token.py`(哑 zstd 日志+哑密钥+临时库)23 passed/0 failed(含 R4 碰撞 stderr WARNING、R5 先占/后到并存、G1 重跑幂等、R1 同批 6 会话 token 互异);直调边界探针:两退化会话派生同 token(碰撞面真实存在)、1MB 超长首条正常出 16 hex、ext 兜底对同退化不同目录对恒互异(3/3);候选4 的 retire×碰撞残余交互已单列 R4,不重复计账 |
|
|
109
|
+
|
|
110
|
+
### 3.3 authz 区:确认 4 条(含编号重编 2 条)
|
|
111
|
+
|
|
112
|
+
| # | where | 问题 | 级别 | 证据要点 | 处置 |
|
|
113
|
+
|---|---|---|---|---|---|
|
|
114
|
+
| A1 = **N180**(原分诊编号 N173-authz,见 3.0) | `md_cg/tokens.py:537-547`(narrowed_principal 定义 :530)+ `md_cg/mdcos.py:3942-3945` + `md_cg/security.py:376-385`(触发入口 `md_cg/mcp_server.py:3007-3013`) | **新发现(medium)**:请求级 as_unit 收窄把 Principal.role 替换为单元名(role=u,tokens.py:539),而 restricted 档可见性由角色串判定(_readable restricted 分支调 can_read_restricted,security.py:380-385 放行 designer/orchestr/verify)——任意无凭据 guest 或 record/reflect/output/sustain 令牌经 `cg(op=read, as_unit=verify)` 即可读 restricted(错误处置标记、明文不加密)节点,打破 narrowed_principal docstring 与 call_tool docstring(mcp_server.py:2994-2996「伪造 as_unit 也无法提权」,本报告会话 grep 实证原文)明示的「收窄单调」不变量与批次28「record/output/guest 限读」裁定;提权半径限于 restricted 档(private/secret 仍受 clearance 求交与会话绑定闸约束);can_read_restricted 唯一权限相关消费点=mdcos.py:3945(全仓读码核对成立) | medium | 材料沙箱实测 9/9(临时哑 env 全套):F1 guest 直接 get→None、F2 search 0 条(基线限读正确);F3 guest 经真实 call_tool(op=read,node_id=…,as_unit=verify) 返回正文含标记=True;F4 op=read query 召回 1 条含标记=True;F5 record 令牌直接 get→None;F6 record+as_unit=verify 读回明文=True;F7 narrowed 前后 role: record→verify、can_admin/clearance 不变、can_read_restricted False→True;F8 对照 as_unit=record 仍不可见;F9 落盘明文(restricted 不在 ENCRYPTED_LEVELS)。攻击面:cg 工具 inputSchema 未声明 as_unit 但 call_tool 无条件读取(MCP 面不校验额外参数),匿名 guest 即可触发 | 留档(五-10,**下轮首批建议**;修复方向:can_read_restricted 改核未收窄 role,或 narrowed_principal 保留原 role 供 _readable 判定;红守卫=F3/F6 两断言现成) |
|
|
115
|
+
| A2 | `md_cg/mcp_server.py:3702-3704`(对照 :3458-3461 与 :3391-3415) | 留档复测(**v15 N125 首报**(v15:100 实证)→v16 第 2 次→**本轮第 3 次**,非新缺陷勿另编号):main() 在 _build_principal(其内 _apply_attribution→_normalize_session)之后把 MDCG_SESSION 仅 strip 原样重设进 principal.session——_normalize_session 的 DSH 防编造校验对 env 路径恒被打穿,且 principal.session 是 _readable 绑定档(private/secret)的授权锚(mdcos.py:3955-3956) | low | 材料真实 serve stdin 回路复测(临时根/哑密钥/哑 DSH 根,测毕清理):A 编造 DSH 形态 id+空 DSH 根 → whoami.principal.session=编造 id 原文(rc=0);B 同 env 独立进程直调 _normalize_session='anonymous'(守卫语义成立、被 :3702-3704 覆盖);C 绑定档增量:受害者 private 节点 fm.session=编造 id → 攻击者伪造同 id env → nodes_visible=1/1 且读回明文=True;对照不伪造→不可见。攻击面:能写 MCP serve 进程 env;请求级声明路径(_declared_session)不受影响 | 维持留档(五-11;修复建议维持 v15/v16 口径:改走 _normalize_session 或删除+拒 '*') |
|
|
116
|
+
| A3 | `md_cg/tokens.py:441-448`(修复前)+ `md_cg/security.py:323-341` + `md_cg/mcp_server.py:3489` | 留档复测(**v8 N62 首报**(v8:94 实证)→v9/v15/v16 历轮→**本轮第 5 轮**,非新缺陷勿另编号):verify_token 的 tenant 形参(MCP 侧来自 MDCG_TENANT)优先于令牌签发记录的租户绑定且零闸变(仅 stderr 告警),TenantRegistry.capability clearance_cap 夹紧从未接线——本轮新增量化:DEK 信封按 (tenant,actor) 键控且 issue 缺省 actor=role 名,两租户默认签发 actor 同名→跨租户读面不止 secret 明文面,加密档(private)同洞 | medium | 材料端到端再证并新增跨租户 DEK 面实证(临时登记表+临时双根+哑令牌库/哑密钥,测毕清理):B4 告警在位(库层与真实 serve stderr 双验证,warn-only);B4b/B1 tenantA designer 令牌+MDCG_TENANT=tenantB → principal tenant=tenantB(真实 serve whoami 同证);B2 root 解析为 tenantB 登记根;B3 whoami readable_sensitivities 全档未夹紧(cap_of/principal_for 零生产调用);B6/B7 在 rootB 上 get() 受害者 private 节点解出明文(跨租户标记命中=True,库层与真实 serve 回路双证) | **本轮已修**(修复②) |
|
|
117
|
+
| A4 = **N181**(原分诊编号 N174-authz,见 3.0) | `md_cg/mcp_server.py:3522-3528`(对照 tokens.py:366-367 签发侧夹紧与 tokens.py:15-18 角色矩阵不变量) | **新发现(low)**:legacy env 身份路径(MDCG_LEGACY_ENV_AUTH=1)直接以 MDCG_CLEARANCE 构造 Principal(:3525 `clearance=os.environ.get("MDCG_CLEARANCE","internal")`,本报告会话 grep 实证原文),不经 _clamp_level 夹紧到角色 clearance_cap——recorder(角色矩阵上限 internal,tokens.py:15-18)在 MDCG_CLEARANCE=secret 下获 secret clearance 并通过 require_write("secret"),角色矩阵不变量在 MCP 可达路径被打破(对照:令牌路径 issue() 签发侧已夹紧;MDCG_CLEARANCE 与令牌冲突的告警先例 :3496-3502 只覆盖令牌路径) | low | 材料沙箱实测:D1 role='recorder' 且 clearance='secret';D2 require_write('secret') 未抛;D3 require_layer_write('self','secret') 仍抛 AccessDenied(layers_allow 闸未失守,泄漏面限于密级维度);D4 端到端 add(sensitivity='secret') 成功、落盘已密封套、同身份读回明文=True;D5 对照不设 MDCG_CLEARANCE → clearance=internal、require_write 拒;D6 对照令牌路径 issue(record,clearance=secret) 签发侧夹紧 internal、require_write 拒——闸口差异坐实在 legacy 构造点。攻击面:legacy 部署(显式启用,P1-5 收紧后仍为兼容面)+ env 配置/注入 | 留档(五-12;修复建议:legacy 构造后按 role_spec(role)['clearance_cap'] 做 _clamp_level 夹紧(与签发侧同源)+对覆盖开口告警;建议与身份构造面批次搭车,本轮未碰) |
|
|
118
|
+
|
|
119
|
+
### 3.4 gateway 区:确认 7 条 + 核销剔除 2 条
|
|
120
|
+
|
|
121
|
+
| # | where | 问题 | 级别 | 证据要点 | 处置 |
|
|
122
|
+
|---|---|---|---|---|---|
|
|
123
|
+
| G1 = N173 | `hive/exec.py:357-371`(修复前) | resolve_system_prompt 对 spec.system_prompt_from 直接 open 读全文进 system 消息外发 HIVE_API_BASE 外部网关,_sensitive_read/HIVE_READ_ROOTS/scope/PII 四道防线一概不生效——N127/P2-22 只堵 context_files 通道,此为**第三出口** | high | 材料哑环境实测(哑 id_rsa+哑 HIVE_API_KEY+HIVE_API_BASE=127.0.0.1:1,_post_chat mock 零真实网络):系统提示词含私钥块原文=True;同路径 _sensitive_read 返回拒读原因(检查存在但该通道未调用);同文件走 context_files 通道被替换 skipped 标注块;build_messages 首条 system 含私钥块=True;入口面核实(hive_mcp SPAWN_ALLOWED_KEYS :403-408 不含该键、orch.py:461 同——入口为 CLI spec 作者/exec_cmd.py:163 全量透传) | **本轮已修**(修复④) |
|
|
124
|
+
| G2 = N174 | `hive/exec.py:997-1021`(修复前) | `_redact_pii` 五模式全用 `\b` 词边界,Python3 Unicode 下 CJK 与数字/字母紧邻处无边界——中文紧邻形态(主语料默认书写形态)全部漏脱敏;read_file 与 lingshu_cg 返回体同源失效,「内容层兜底」对主语料实质失效 | high | 材料直调实测:`re.match(r'\w','电')=True`(根因);中文紧邻四样本全漏;对照空格分隔命中;混淆形态(换行拆分/零宽/全角/连字符)亦全漏;交叉证据:同一哑 diary.txt,tool_read_file 返回体 API key(前有空格)命中脱敏而 CJK 邻接项漏——内容层对中文语料实际失效 | **本轮已修**(修复⑤) |
|
|
125
|
+
| G3 = N175 | `hive/exec.py:396-403`(修复前) | `_context_block` 文本分支不过 `_redact_pii`:context_files 通道读文件全文拼进 user 消息外发,与 read_file 内容层防线不对称;N127 止血只补了路径层 _sensitive_read(:384),内容层未补;附带亦无 HIVE_READ_ROOTS 检查 | medium | 材料实测 build_messages(spec={context_files:[diary.txt]}):上下文块含手机号/邮箱/API key 原文=True;同文件 tool_read_file 带 [已脱敏:*] 且 pii_redacted=True | **本轮已修·搭车**(修复⑤;留档清单中该条为分诊时点口径,五-13 核销) |
|
|
126
|
+
| G4 = N176 | `md_cg/ccgc.py:624-646`(修复前) | attest 无 verifier_token 时验证方身份纯自报字符串,换编造名即伪造「编外复核」;link/link_pending 与全仓均无任何下游消费 verifier_identity(docstring「下游策略可据此拒绝」为未兑现空防线);伪造签章经 link 直写 `_cg._write_node`(:785-786)落 knowledge 层,绕过 review 编外复核与裁定 A | high | 材料读码+端到端复现(临时 MDCG_ROOT+临时 MDCG_TOKEN_FILE,种子节点):record 权限面断言过;compile success→attest(ACCEPT,编造名,无令牌) ok=True、verifier_identity='self-reported'→link(apply=True) ok=True、written=6、盘上节点落 verification_basis='test'+condition_space;对照:同源变体被归一化 E041 拒——唯一有效拦截仍是同源名(材料备注:候选引 _write_node 为 :783 实际 :785-786;落库字段实测 verification_basis/condition_space 与候选写法略有出入,不影响成立性) | **本轮已修**(修复①) |
|
|
127
|
+
| G5 = N177 | `hive/exec.py:960-990`(修复后现位) | `_sensitive_read` 后缀链/ADS 残余绕过:后缀族 endswith 只匹配末段、名字族 startswith/子串只匹配前/中缀——`token.txt`、`db.kdbx.bak2`、`notes.txt:secret`(NTFS ADS)实测均放行;与 V21-8/N141 已堵的「改名/加后缀即免检」同类残余形态 | low | 材料实测三形态均返回 None(放行);对照 14 项点名样本全命中拒读(未命中数=0);需攻击者知晓部署侧命名 | 留档(五-14,low 加固项) |
|
|
128
|
+
| G6 = N178 | `md_cg/units.py:336`(poll 穿越)+ :291-330/:82-84(jobs 透传)+ `mcp_server.py:2438→2451/2452/2486` | units 派发面参数未约束:①poll 的 job_id 直接 `os.path.join(jobs_dir, job_id)` 无白名单,『../』穿越读目录外 result.json 正文;②submit 的 jobs 经 jobs_dir(:82-84 直接 abspath)透传,可在任意可写目录创建 spec.json+status.json(prompt 模型可控),review 带 autostart 可在模型选的目录拉起 serve;③doctor(jobs)/plan(jobs) 同样透传 | low | 材料哑环境实测:units.poll('../victim') 返回 state=done、content='TOPSECRET-CONTENT-123'(读出 jobs 目录外自建 result.json);units.submit(prompt='POISON-PROMPT-x', jobs=任意嵌套目录) ok=True 且 spec.json 实际落盘该目录;模型可达性核实(mcp_server.py:2438 jobs=str(o.get('jobs'))→:2451/:2452/:2486,autostart :2493;仓内 hive.exe isfile=True);poll 当前无直接工具入口(git grep 'units.poll' mcp_server.py 无匹配),属纵深加固 | 留档(五-15,小设计决策+poll 白名单可速收) |
|
|
129
|
+
| G7 = N179 | `src/lib/roleplay_web.ts:745` | `/roleplay/api/roles/<role>/import` 是唯一缺 validRoleId(role) 的角色写入口(/meta:804、/chat:845、/translate:922 均有白名单):role 直通 meta[role] 键赋值、node_id 模板 `roleplay_${role}_…` 与 capability.callTool('role_import',{role_id})。当前爆炸半径被 toNullProto(:606-608)与 md_cg node_id 白名单+realpath 越界闸兜住,属纵深缺失+四入口不一致;与 v6 N45 残面同源(v20:158 T6 记录在档),本轮首次独立编号 | low | 材料读码核实+本报告会话 grep 实证:validRoleId 定义 :601、使用 :668/:804/:845/:922,import 路由段 :728 起无调用;403 面四写入口 requireEditKey 全在位、editKeyHint(V21-1 修复后)两分支终止文案——未发现新 403 分支缺口。**未在本会话运行 TS 侧动态复现**(导入引擎面不在本仓,如实声明) | 留档(五-16,一行加固随 TS 低危批次) |
|
|
130
|
+
|
|
131
|
+
**核销剔除 2 条(rejected,复测确认非缺陷):**
|
|
132
|
+
|
|
133
|
+
| # | where | 剔除理由 |
|
|
134
|
+
|---|---|---|
|
|
135
|
+
| K1 | `hive/exec.py:960`(A5-b,origin=legacy) | 「已闭环」结论成立:材料实测 _sensitive_read 对 14 项点名样本全部返回拒读原因(未命中数=0);V21-8 前缀/子串族+N141 后缀族读码与实测均闭环;本报告会话复跑 `python -m hive.test_sensitive_read_names` → **16 pass / 0 fail**。残余形态(token.txt/.kdbx.bak2/ADS)已单列 G5=N177,不重复计账 |
|
|
136
|
+
| K2 | `md_cg/audit.py:186`(A6-b,origin=legacy) | 「不成立」结论成立:①_verify_code 的 cwd=ctx.get('cwd') 唯一生产调用点为 writepipe.py:182-185,ctx 只传 {cg, principal} 无 cwd 键;test_cmd 注入点已移除(audit.py:171 只读 env MDCG_CODE_TEST_CMD——本报告会话 grep 实证 :151/:155/:171 锚点;守卫 test_read_scope_b27.py:235-238 B30-3 在位)——当前 HEAD 无模型可控 cwd/test_cmd 面;②roleplay transcripts 无读改写竞态:转录面 appendFileSync 单调用(roleplay_web.ts:573-578),/meta 读改写段同步无 await(P2-11 注记在位),/translate 同为单 tick |
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 四、验证(门禁结果)
|
|
141
|
+
|
|
142
|
+
| 门禁 | 结果 | 出处 |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| **python 全量回归** | **通过(退出码 0)** | 编排侧执行(材料口径);修复会话分项口径:全仓 `python scripts/run_tests.py --jobs 4` → 221/221 通过+5 跳过(依赖缺失,此前即有)〔修复④⑤〕、`python -X utf8 -m md_cg.run_tests md_cg` → 163/163+3 跳过(runner 固有口径)〔修复①②③〕 |
|
|
145
|
+
| **npm test** | **未运行**(TS 面无改动) | 材料口径;本报告会话 git status 同证(改动面仅 hive/md_cg python 件+3 新守卫,无 TS 件) |
|
|
146
|
+
| **npm run gate** | **失败** | 编排侧材料 + **本报告会话实跑双证**(见下归因) |
|
|
147
|
+
| 四区/修复/留档清点 | 确认 22 / 修复 5 / 留档 16 | 材料;本报告逐条对应(3.1-3.4 / 二 / 五) |
|
|
148
|
+
|
|
149
|
+
**npm run gate 失败归因(本报告会话第一手实跑 `npm run gate`)**:
|
|
150
|
+
- 前序全绿:`check_unreachable.py` 436 文件命中 0;`check_publish_artifact.py` R1 凭据面/R2 私有数据面/R3 隐私文本 PASS(NOTE 5 条均为既有哑样串)。
|
|
151
|
+
- 失败点:**R4 非追踪件面 命中=3**(非追踪=31,允许=28)——`md_cg/test_n139_dek_provision_failclosed.py`、`md_cg/test_n176_link_trust.py`、`md_cg/test_n62_tenant_bind_failclosed.py`,恰为本轮 3 件新守卫尚未 git 提交(工作纪律:commit 由编排会话负责,本报告会话禁止 commit)。**入库提交后 R4 即转绿,非代码缺陷**;`VERDICT=FAIL 规则数=1`。
|
|
152
|
+
|
|
153
|
+
**本报告会话第一手抽查复跑(全部通过)**:
|
|
154
|
+
1. `python -X utf8 -m md_cg.test_n176_link_trust` → **ALL OK: 20 项**(修复①守卫)
|
|
155
|
+
2. `python -X utf8 -m md_cg.test_n62_tenant_bind_failclosed` → **ALL OK: 12 项**(修复②守卫)
|
|
156
|
+
3. `python -X utf8 -m md_cg.test_n139_dek_provision_failclosed` → **ALL OK: 14 项**,stderr 告警真实打印含 N139 锚点与路径(修复③守卫)
|
|
157
|
+
4. `python hive/test_exec_tools.py` → **104 通过 / 0 失败**(修复④⑤守卫 F10-F12 全含)
|
|
158
|
+
5. `python -m hive.test_sensitive_read_names` → **结果: 16 pass / 0 fail**(A5-b 核销第一手佐证)
|
|
159
|
+
6. 编号基线:`grep -rhoE "N1[0-9]{2}" docs/eval/*.md | sort -u` → 尾部 N161..N172(max=**N172**)、计数 73;`grep -rln "N173|…|N179" docs/eval/` 零命中 → 本轮自 N173 续编成立、终号 N181
|
|
160
|
+
|
|
161
|
+
**材料会话实跑、本报告未复跑项(如实标注归属)**:`python md_cg/test_server_version.py` 4 通过/0 失败、`python scripts/check_publish_artifact.py --selftest` exit 0/30 PASS、`node --import tsx --test test/init.test.ts` 7/7、`test/bridge_stdin_error.test.ts` 1/1、`python scripts/test_dsh_log_index_token.py` 23 passed/0 failed、`python -X utf8 -m md_cg.test_ccgc` 87/0、`test_govern_directread` 40/0、`test_i27_e041_identity` 12 全过、`run_tests.py hive --jobs 4` 17/17——均为修复/复核会话在各自哑环境实跑,输出见材料。
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 五、遗留清单(分诊口径 16 条;净未修 15 条 + 1 条核销)
|
|
166
|
+
|
|
167
|
+
### 5.1 逐条清单
|
|
168
|
+
|
|
169
|
+
| # | where | 问题与 deferred 理由 | 处置建议 |
|
|
170
|
+
|---|---|---|---|
|
|
171
|
+
| 1 | `md_cg/mdcg.py:2709`(基类 search 裸调)+ :2388(get 同款)〔A6-d,legacy low〕 | 生产检索面不成立(豁免链实测成立),仅基类残面;名额让位于 3×high+2×medium-legacy | **下轮低危批次首选**;最小修方向已在档(:2709 改 _read 同款捕获+计数告警、不写负缓存对照 N134 教训)——速收 |
|
|
172
|
+
| 2 | `scripts/bootstrap_watchdog.py:66-68 + :138-147`〔A7-a,legacy low〕 | no_log 臂已 fail-closed 无需修;未知 round 告警开口属加固项(不动「不计入不打断」语义) | 随 scripts 低危批次处理 |
|
|
173
|
+
| 3 | `hive/exec.py:962-990`(A5-b)+ `md_cg/audit.py:171-176`(A6-b)+ `audit.py:329-335`(A6-a)+ `mcp_server.py:3506-3520`(A5-c)〔legacy〕 | **已修项核销复核成立,无修复需求**,仅核销留档 | 不进修复队列 |
|
|
174
|
+
| 4 | A1-e(hive/exec.py:920-936 read_roots 空值静默失效)+ A3-c(restricted=错误处置标记且读取仍过角色闸)+ A3-d(migrate_restricted --apply 无 --yes)〔legacy low 设计裁定面〕 | 无越权实证;--yes 属 CLI 误操作面加固、read_roots 空值告警属加固候选、restricted 角色闸为既定分型 | 维持设计裁定;加固候选随低危批次 |
|
|
175
|
+
| 5 | v8 N66 / v8 N68 / v15 N125 / v15 N126 / v15 N129 / v16 N134 / v17 N143〔七项多轮留档维持;v8 N62 已由修复②移出〕 | 多轮留档维持原分级与原 deferred 理由,本轮无升级证据(逐项本轮读核在位,见 3.1-L6) | 按原留档继续;N125 修复方向在档(改走 _normalize_session 或删除+拒 '*'),随 mcp_server 身份面批次 |
|
|
176
|
+
| 6 | `md_cg/mcp_server.py:47-53` + hive 同族 :47-54〔N-new recent low〕 | `_package_version` 非对象 JSON AttributeError 逃逸导入即崩 + 非字符串 version 原样返回 | **速收候选**:修复极简(except 面补 AttributeError/TypeError + isinstance(version,str) 校验),红守卫两断言现成,随任一 md_cg/hive 批次搭车 |
|
|
177
|
+
| 7 | `scripts/check_publish_artifact.py:85-96 + :205-228`〔N-new recent low〕 | 占位符降级真阳性抑制:真令牌含标记子串即被静默降级 NOTE 逃逸 R1 FAIL | **小设计决策**:降级判据重定义(标记子串命中→整串占位形态判定)需先定门禁语义标准(假阴性 vs 假阳性权衡)——deferred 待规则定标后修 |
|
|
178
|
+
| 8 | `scripts/bootstrap_loop.py:190-198 + :178-183 + :201-227`〔N-new recent low〕 | 固定 tmp 名无锁,设计外并发写者碰撞致 PermissionError/撕裂落活路径(v20:114 文档化取舍维持:watchdog 单实例模型) | 维持文档化取舍;未来引入多实例再开(含撕裂几何 NUL 填充新实测事实留档) |
|
|
179
|
+
| 9 | `scripts/dsh_log_index.py:551-562 + :564-588 + :595-620`(碰撞防线主体 :478-506)〔N-new recent low〕 | retire×碰撞一致性缺口:处置流(摄取→retire→重摄)对发生过碰撞的会话稳定产出永久重复集 | **大设计决策**:需 tombstone/去重跨摄取流设计(处置流重构+检索池去重语义)——deferred |
|
|
180
|
+
| 10 | `md_cg/tokens.py:537-547` + `mdcos.py:3942-3945` + `security.py:376-385`(触发入口 `mcp_server.py:3007-3013`)〔**N180**(原 N173-authz),new medium〕 | as_unit 收窄读 restricted(medium-越权但本轮首报,按标准②让位于 legacy 欠账 N62/N139) | **下轮首批建议**:修复方向明确(can_read_restricted 改核未收窄 role,或 narrowed_principal 保留原 role 供 _readable 判定);红守卫=F3/F6 两断言现成 |
|
|
181
|
+
| 11 | `md_cg/mcp_server.py:3702-3704`〔v15 N125 第 3 次复测,legacy low〕 | main() 把 MDCG_SESSION 仅 strip 原样重设进 principal.session——DSH 防编造校验对 env 路径恒被打穿 | 三轮留档 low;最小修方向在档,名额让位,随 mcp_server 身份面批次 |
|
|
182
|
+
| 12 | `md_cg/mcp_server.py:3522-3528`〔**N181**(原 N174-authz),new low〕 | legacy env 身份路径 MDCG_CLEARANCE 不经 _clamp_level 夹紧——recorder 可获 secret clearance 通过 require_write | 最小修一行(legacy 构造后按 role_spec(role)['clearance_cap'] 夹紧+覆盖开口告警);建议与 tokens/mcp_server 身份构造面批次搭车(修复②同族面,本轮未碰——ask 标注 low/deferred) |
|
|
183
|
+
| 13 | `hive/exec.py:396-403`〔N175〕 | ~~文本分支不过 _redact_pii + 无 HIVE_READ_ROOTS~~ | **已随修复⑤落闸核销**(本报告会话实证 :402/:412/:441 注释与 F12/F12b/F12c 守卫绿);本条为分诊时点口径,实际净留档 15 条 |
|
|
184
|
+
| 14 | `hive/exec.py:960-990`〔N177,new low〕 | _sensitive_read 后缀链/ADS 残余绕过(token.txt/.kdbx.bak2/ADS) | low 加固项,修复面明确(按 dot 段全匹配+段名族扩展),随 hive 低危批次 |
|
|
185
|
+
| 15 | `md_cg/units.py:336`(poll 穿越)+ :291-330/:82-84(jobs 透传)+ `mcp_server.py:2438→2451/2452/2486`〔N178,new low〕 | jobs 目录约束需定根策略(防目录逃逸 vs 合法自定义 jobs_dir 兼容面)——**小设计决策** | jobs 根定标 deferred;poll 的 job_id 白名单可先随低危批次速收 |
|
|
186
|
+
| 16 | `src/lib/roleplay_web.ts:745`〔N179,new low〕 | /import 唯一缺 validRoleId 的角色写入口(纵深缺失+四入口不一致;爆炸半径被 toNullProto 与 md_cg node_id 闸兜住) | 一行补 validRoleId(role)(TS 面归 runtime 员),随 TS 低危批次搭车 |
|
|
187
|
+
|
|
188
|
+
### 5.2 大设计决策项处置建议(汇总)
|
|
189
|
+
|
|
190
|
+
1. **dsh_log_index retire×碰撞(五-9)**:tombstone/去重需跨摄取流设计与检索池去重语义,建议与处置流文档一并重构后再动代码;短期可先在处置流文档标注「碰撞会话重摄前须人工清理 ext 副本」的操作性缓解。
|
|
191
|
+
2. **check_publish_artifact 占位符降级语义(五-7)**:先定门禁标准(对真令牌宁可 FAIL 误报 vs 对哑样串容忍 NOTE),再重定义判据为「整串占位形态」而非子串命中;本轮 R4 实跑证明该脚本在门禁链路地位关键,定标优先级不宜再拖。
|
|
192
|
+
3. **units jobs 根定标(五-15)**:定「jobs 根白名单(env+缺省仓内目录)+根内相对路径校验」策略;poll 的 job_id 白名单独立速收不依赖定标。
|
|
193
|
+
4. **A7-a 未知 round 告警开口(五-2)**:加 stderr 告警不动「不计入不打断」语义,纯可观测性增强。
|
|
194
|
+
5. **A6-d 基类残面(五-1)**:最小修方向已在档,直接进下轮低危批次。
|
|
195
|
+
6. **大设计决策可落闸的先例**:v16:180 曾将 N139/N62 列为「需先设计决策后代码」,本轮已分别以 fail-closed+告警开口、在册才夹紧的纯收紧口径落闸——N180(五-10)建议优先复制该路径(修复方向已收敛为两选一,红守卫现成)。
|
|
196
|
+
7. **编号治理(流程项)**:并行专项编号双占已按 3.0 裁决;建议后续编排侧在派发 ask 时预分配编号段,避免再度双占。
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 六、纪律合规声明
|
|
201
|
+
|
|
202
|
+
1. **复现环境红线**:材料全部动态复测在**系统临时目录**+哑 KEK(os.urandom(32))/哑 MDCG_MASTER_KEY('ab'*32 或哑 hex 64)/哑 MDCG_TOKEN_FILE/哑 MDCG_TENANT_REGISTRY/哑 HIVE_API_KEY(HIVE_API_BASE=http://127.0.0.1:1)/哑 zstd 日志环境进行;**未触真实令牌库、真实 serve、在役数据目录、DSH 探针节点**;清理证据载明(CLEANED:True、TEMP n173*/n174* REMAIN=0、库目录测毕清理)。
|
|
203
|
+
2. **本报告会话自身执行面**:WORKSPACE_INDEX.md 读核定位(安全专项入口按职责定位,未全盘浏览);docs/eval 编号 grep 与历轮考证(v8/v9/v15/v16/v17/v20);代码锚点只读 grep(mdcg.py:2709/:2388、tokens.py:393/:433/:442/:452/:456、crypto.py:63/:263/:278/:283/:298、ccgc.py:21/:73/:620/:714/:720/:761、hive/exec.py:347-441/:964/:1045-1060、mcp_server.py:47/:57/:3470-3525、audit.py:151-171/:310-317、security.py:380、mdcos.py:3943-3945、units.py:336、bootstrap_loop.py:190、bootstrap_watchdog.py:67/:107/:126/:137/:141、roleplay_web.ts:601/:728/:804/:845/:922、check_publish_artifact.py:85/:89);4 件本轮守卫+hive 敏感读名单实跑(第四节);`npm run gate` 实跑(pack --dry-run 本地模式只读)。**零代码改动、零 git commit、零新起攻击复现脚本**(攻击复现均引各专项会话临时环境实测,不重复执行)。
|
|
204
|
+
3. **已修项勿重报**:第 8/15/16/19/22 轮已修安全项未重复列账——本轮修复①-⑤即第 22 轮(批次 65)落闸项,L2/L3/L4/L5/L6 等 legacy 条目均为「复测定案/核销/维持留档」性质并逐条标注;外部对抗报告(v0.6.0 实测报告后半)的历史区间实锤 V21-1/V21-2/V21-3 维持「当前 HEAD 全部闭环」结论未再报(gateway 核销区仅照录 A5-b/A6-b 复核结论)。
|
|
205
|
+
4. **编号纪律**:`grep` 实测 docs/eval max=N172 → 自 N173 续编成立;并行专项双占 N173/N174 按仓库先例(v16:5、v17:5「守卫/落码锚定者保留原名+其余顺延+逐项标注原暂编号,非暗改」)裁决为 gateway 保留、authz 顺延 N180/N181(映射见 3.0);本轮终号 N181。
|
|
206
|
+
5. **材料不一致项全部显式声明、未静默调和**:①N173/N174 双占(3.0 裁决);②N175 已修 vs 留档清单在列(五-13 核销标注,净留档 15);③N139 原轮次修复材料「v8 首报」口径 vs 全库 grep 仅现身 v16(以 grep 为准,3.1-L1 声明);④行号微漂照录(crypto.py 材料 :62 实测 :63;mdcos.py 材料 :401-402 实测 :403-404);⑤修复③会话环境输出劣化声明照录(该会话输出仅作旁证,以编排侧 git diff+stash 双态机械证据为准;本报告会话独立复跑其守卫 14 项全绿佐证落闸状态)。
|
|
207
|
+
6. **输出纪律**:本报告不含本机绝对路径(材料中临时目录绝对路径一律代称「系统临时目录」);修复①②会话声明「工作区中 hive/exec.py、hive/test_exec_tools.py 改动为并行会话产物,本会话未读未改」如实转录,两会话改动面经 git diff --stat 各自核销(恰 2 文件口径)。
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 七、跳过项及原因
|
|
212
|
+
|
|
213
|
+
1. **npm test 未运行**:TS 面零改动(材料口径+本会话 git status 同证);gate 链路不含 npm test,TS 回归不在本轮门禁面。
|
|
214
|
+
2. **N66 浏览器面 CSRF 未重跑**:以 v20:158(T6 第四次复测记录,本报告会话 Read 实证该行在档)为准,本轮留档确认(deferred 维持 medium)。
|
|
215
|
+
3. **v16 其余留档 N133/N135-N138/N140 未逐项重测**:批次 63 为纯性能改动、批次 64 为 scripts+TS 域,均未触其文件——以 v16 留档为准,如实标注、不升格。
|
|
216
|
+
4. **N179 引擎面未动态验证**:capability 侧 roleplay 导入引擎不在本仓(材料声明照录);本报告会话补读码锚点(:601/:728/:804/:845/:922)。
|
|
217
|
+
5. **材料会话实跑项未逐项复跑**(归属如实标注,见第四节末):test_server_version、check_publish_artifact --selftest、init.test.ts、bridge_stdin_error.test.ts、test_dsh_log_index_token、test_ccgc、test_govern_directread、test_i27_e041_identity、run_tests hive/全仓/md_cg 分项——本报告会话仅复跑 4 件新守卫+hive 敏感读名单+gate。
|
|
218
|
+
6. **真实 serve 进程端到端**:修复②(N62)以库层+MCP 进程内面双证替代(修复会话声明);authz 区 N62 条目另载真实 serve whoami 同证,两面互补。
|
|
219
|
+
7. **rust/cargo、swarm、compiler 面**:本轮零改动未跑(本轮改动面= hive/md_cg python 件+3 新守卫+2 既有测试适配,git status 同证)。
|
|
220
|
+
8. **蜂巢 review 通道全量验证方信任协议**(给蜂巢单元发签章令牌):按 ask 留档不扩(修复①边界声明)——现状蜂巢自动签章 link 被 E052 拒属兑现「下游可拒绝」语义,信任协议属后续设计项。
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
*报告会话留痕:本报告全部第一手核验命令与输出见第四节与第六节第 2 条;除本报告文件外未写入任何文件,未执行 git commit。*
|