Skip to content

'# Gap Matrix:标准 → 现状 → 证据 → 关闭任务(2026-08-01 核查基线)

:差距层 | 基线日期:2026-08-01(三代理 file:line 实证核查) 维护:每任务完成/新差距发现时改行;不重排结构。任务编号=Hardening Plan(.claude/PRPs/plans/e2ee-top-tier-hardening.plan.md)。 图例:✅具备(待证=验收未闭环) / 🟡部分 / ❌缺失 / 📋路线图

A 类:协议正确性

TT现状证据(file:line)关闭任务
A1🟡 实现完成待真机Olm 收发链 chat_network_service.dart:595-699olm_session_service.dart:735-818;⚠️真机双端从未验证P2-1/P2-4/P2-5
A2🟡 版本有,单一规范文档缺PFv3/meta_version v3 在产;无统一 spec 白皮书P5-3
A3🟡 轮换已实现,单调性对抗缺,成本未实测三触发器 group_session_service.dart:60-65,186-191;矩阵#16❌P3-10、P4-4
A4🟡E2EE-031 PENDING;ratchet PFS/PCS 单测在 olm_ratchet_pfs_pcs_test.dartP3-6、P2(真机腿)
A5🟡 依赖库已审计;本地 pickle 层未核vodozemac LA 2022 Issue A;olm_session_service.dart pickle/_secureBytes 曾记弱随机(待复核现状)P5-4(核验+登记)
A6✅待证canonical/AAD 体系(trust 11 字段/附件 chunk_count 自洽门/域分离前缀)P1 重验闭环

B 类:用户可验证性

TT现状证据关闭任务
B1❌ 算法在零 UI;交叉签名地基零接线safety_number.dart 生产零调用;identity_verifier.dart:63-125 仅 test 引用P3-4、P3-5
B2✅待证TOFU fail-closed olm_session_service.dart:692-725;S2C 告警 e2ee_peer_key_warning_rule.dart+chat_page.dart:632P1/P2 闭环
B3🟡 Merkle 库完成未接线;profile 未签字;身份键就地覆盖无痕e2ee_kt_merkle.erl(golden 钉死);olm_identity_repo.erl:46 ON CONFLICT DO UPDATE;bigserial 失效已实证P3-8(依赖 P0-1)
B4🟡→群聊已可恢复(2026-08-02,imboyapp 9426e7e4):备份含 megolm_inbound 段(收集/回填/往返实证 9/9,v1 旧包兼容);1:1 Olm 历史仍不可恢复=有意设计(跨设备还原双棘轮会 key reuse/ratchet 分叉,同 Signal/Matrix);UI 明示与恢复文档已补(2026-08-02):导入成功对话框文案由含糊的「旧消息可能无法访问」改为分类明示「群聊已恢复/单聊不可恢复」,10 语言对齐;docs/guides/e2ee/history-recoverability.md 给出用户与支持口径。残留=换设备"前"的备份提醒未加(用户可能没备份就换机)megolm_backup_section.darte2ee_local_backup_service pack/unpack;导入页 _applyRestoredKeyse2eeBackupImportSuccessNote×10 语言;history-recoverability.md换机前提醒(P5-4)
B5🟡 策略文档已建,选型待拍板(2026-08-02)standard/device-verification-policy.md。先把事实说清:今天不存在「已验证设备」这个层级——Safety Number 生产零调用,用户没有任何途径标记设备为已验证,故 TT-B5 问的「未验证设备能做什么」答案是「所有设备都是未验证设备、能做全部事情」,这不是策略是策略缺位。唯一实际生效的门是 TOFU(首次固定 fingerprint,变化则 fail-closed)。新发现CryptoStore 不可用时 TOFU 整体跳过且无任何上限(此前只存在于一行代码注释),与 is_active 的 fail-open 同源但 014 有 60s TTL 封顶、本条没有——已登记 IMB-2026-028。四个选项 A 维持现状/B 软提示/C 高风险操作前强制/D 全面强制(Element 路线)已列,推荐 B 起步 C 为目标态、暂不做 D(D 的失败模式是用户被自己的加密锁在门外)。⚠️ 所有选项在 IMB-2026-006 关闭前均不可实施🔒 选型待拍板;实施依赖 P3-4/P3-5
B6🟡 TOFU+变更告警有;KT 自动检测无同 B2/B3P3-8

C 类:自动化测试

TT现状证据关闭任务
C1🟡 双实现 golden 有先例,未体系化trust canonical SHA256 锚;e2ee_kt_merkle_tests.erl goldenP4-3
C2❌ 零跨进程双端仅单进程双 Account round-trip(room_key_olm_roundtrip_test.dartP4-2(旗舰)
C3🟡 覆盖较强但 6❌TEST_COVERAGE_MATRIX.md:#3/#4/#7/#9/#15/#16❌,#12⚠️P4-4、P3-5/3-6/3-10
C4无进程/网络操纵能力P4-2 配套
C5🟡 回归散落在各测试,无公开索引evidence 系列 vs 测试名未建映射P4-9
C6🟡 CI 已复活,后端门已全绿(2026-08-02)推 github 后首次执行即暴露 4 条常红并逐条修完(803618d0+fa882554):①dependabot-auto-merge.yml 文件级 YAML 解析失败→每次 push 凭空多一条 0 秒失败 run;②架构层边界门假阳性(只排除 %%,单 % 注释漏网);③elvis 安装 exit 127(setup-beam 未装 rebar3;且其 curl 分支永不可能成功——inaka/elvis 所有 release 无资产);④trivy 钉死已删除的 v0.52.2(我先误判为 sudo 权限,实为 404)。gitleaks 改用免费 CLI 替代对组织仓收费的 action,历史扫描保留(本地实证 1386 commits/0 leak)。棘轮重设为实测值:elvis 8824/239→10352/298、文件大小 6→13(债务被承认非被修复,清单已写进 workflow 注释)。本提交实测 imboy Quality Gate ✅ / SBOM Diff Report ✅(两者此前长期红);Backend CIDocs Site 本轮仍在跑,此前连续 4 次绿、本线未动其配置。残留imboy SonarCloud 报 Not authorized or project not found(需 SONAR_TOKEN + sonarcloud.io 建项目,🔒凭证待拍板);imboyapp 6 条工作流仍全红(含同一个 dependabot-auto-merge.yml bug,该仓提交被并发线阻塞)P0-4(后端段已闭)、P4-1
C7🟡 auditor 未建KT 未接线P3-8+P4-1

D 类:审计就绪

TT现状证据关闭任务
D1白皮书已建(2026-08-02)standard/protocol-whitepaper.md刻意不复制任何 wire 格式——规范字节留在 ADR 作唯一真源;复制副本正是今日发现 e2ee-key-rotation-policy.md 失真的成因,再抄一遍只是预约下一次同样事故。改为提供 ADR 各自做不到的三件事:①supersedes 生效解析表(此前不存在;ADR 10 是依赖图、11 是版本兼容,都不解析"哪份现在生效")——直接读 ADR 03/04/05/06/07/08/13 会读到已被 14/15/16/17/18/26 取代的条款,且 ADR 19 仍 Proposed 故 MLS 的生效决定仍是 ADR 09「不实现」;②按协议关注点的分段导航(16 段);③规范与实现落差。顺带查出两处 ADR 状态头失真并已当场修正fd252cee):ADR 27 原写「设计草案(不实施)·不改动任何生产代码」而附件 Slice 1–8 早已接入生产(5 个模块各有 2–5 个 lib/ 引用、13 个测试文件),仅 Slice 9 开关未翻;ADR 28 原写「不改任何生产代码」而后端 e2ee_kt_merkle.erl 已落地。照原状态头读会得出"附件加密根本没做"的反事实结论。教训已写进白皮书 §3.1:以「不改动任何生产代码」措辞冻结的设计文档,一旦后续实施就必然失真而没人回头改P5-3
D2威胁模型已补齐 PFv3/附件/KT(2026-08-02)按该文 §5 自带演进协议扩展(未改动既有 T1–T9):新增 T10 Object-Store Adversary(并入 ADR 27 已枚举的 ATT-01..05)与 T11 Key-Server Equivocation(split-view / non-inclusion);§0 资产表补 Attachment Content Key;§3 诚实清单补 3 条;§4 矩阵补 PFv3 资源上限 + 附件四项 + Merkle/STH。两条关键审计口径:①T10/T11 今天判定均为 ❌ 不防御——附件加密代码全在但运行时开关未翻开(X12),KT profile v1 冻结但未部署(P3-8);②Safety Number 有守护测试但生产零调用(已实证 grep -rl "SafetyNumber" lib/ 只命中自身),即§4 矩阵原本声称的一条防御在产品里事实上不存在——已在矩阵加「读法警告」:有守护测试 ≠ 运行时生效,须分别求证。顺带逐条核实原有 16 条守护测试全部真实存在P5-1
D3清单已建 + AGPL 已标注(2026-08-02)scripts/license_inventory.sh 按 LICENSE 正文判定(非包元数据),docs/legal/third-party-licenses.md + 生成态清单 143 条(Erlang 34 + Flutter direct main 109,含 path/git/sdk 三种来源)。新增 3 项真实发现simple_captcha(无正文无元数据)、ic_storage_space(LICENSE 仅 Copyright 2021 无授权条款)——无许可证 = 无再分发权,与 AGPL 同级阻断jwerl 仅元数据声明 BSD-3 待补正文。已澄清 gpb LGPL-2.1 带链接例外且不覆盖生成代码,不构成阻断--check 门禁就绪但暂不接 CI(现必红,X15 后再接+补 NOTICE)。残留 ❌=Flutter 传递依赖 / imboyadmin npm / sdk-js 三段未扫(已在文档显式声明"真未扫",非静默截断)P5-2(联动 P0-6/X15)
D4统一生命周期文档已建(2026-08-02)docs/guides/e2ee/key-lifecycle.md:10 类密钥材料 × 生成/存储/轮换/可备份/销毁矩阵 + 服务端 8 张表敏感度分级 + 三条互不重叠的销毁路径 + 「审计员怎么自己查」5 条可验证性主张 + 4 条残留缺口如实列出。顺带查出既有 e2ee-key-rotation-policy.md(333 行)已严重失真:写 RSA-2048 为主协议(v2 早已 Olm-only,ADR 24)、存储清单漏掉几乎全部真实密钥材料(Olm/Megolm/OTK/fallback/SQLCipher)、§5.2 Shamir 社交恢复与 §4 e2ee_transfer_handler 均已从代码删除——失真的生命周期文档在审计场合比没有更糟,已加⛔被取代横幅并逐条列明不成立之处,正文不删以留决策语境P5-4
D5八件全部到位(2026-08-02)①威胁模型(D2)②密码学清单 crypto-inventory.md+D3 许可证清单 ③协议白皮书(D1)④密钥生命周期(D4)⑤已知问题台账(D6)⑥SOW audit-sow-template.md 附A自审计 self-audit-report.md签字栏留空待人工签署)附B证据清单 evidence-manifest.generated.md(脚本生成)。密码学清单三级证据等级 📄本仓实证/📕上游规范/⚙️上游默认,新发现 SQLCipher 分组密码/HMAC/KDF 全用库默认值、我方未显式选定也未做安全评估;另订正易混口径——消息通道是 CBC+HMAC(Encrypt-then-MAC)非 GCM,仅附件与备份用 GCM。自审计头条数字:26 条 MUST 中仅 6 条达成且有证据,且这 6 条全是 D 类文档+E4,即本轮达标的是可审计性而非密码学能力残留:未含 SBOM hash 锚;附 A 待签P5-7 签字待人工
D6统一台账已建(2026-08-02)standard/known-issues-ledger.mdIMB-2026-001..027 连续编号,按问题而非按标准条款组织(与本 gap-matrix 分工:这里追踪进度、那里对外披露),三态 Acknowledged/Open/Blocked 各带理由与负责人。分五节:①分发阻断 4 条(AGPL + 三项无授权依赖)②名义防御与运行时不符 3 条(附件明文/Safety Number 零调用/KT 未部署)③有意接受的取舍 7 条 ④已知未决 6 条 ⑤验证与流程缺口 7 条。§6 写明审计方使用说明,首条即「不要把 gap-matrix 的 ✅ 读成运行时生效」。收录标准=只收今天未消除的问题,已修项不在此邀功P5-5
D7审计向说明已建(2026-08-02)standard/reproduce-tests.md:后端 make e2ee-verify / eunit-local(并写明直接 make eunit 会因缺 -config+两个 -pa 而失败,非测试问题)、客户端 run_e2ee_suite.sh、许可证与证据门三段命令,均为仓内既有入口不新造。核心是 §4「已知会红/会跳过」7 条前置列出——跑测试最费时间的不是搭环境,是分不清「我搭错了」还是「它本来就红」;以及 §5「无法复现」5 条诚实声明(双端跨进程/真机/附件运行时/KT 运行时/故障注入),该 5 条正是 SOW 排除项的依据P5-9

E 类:服务端零信任与运维

TT现状证据关闭任务
E1🟡 机器可查下限有,全量可执行证明无;吊销与注销两条级联均已补(2026-08-02 26f21e64 + 529a3921PEM 拒收/密文保真/FTS 排除;user_device_repo:delete/2 不清 olm 三表 已修;delete_all_related_data 不含 olm_*/e2ee_key_backups 已修(含删除维度断言)。残留=trust_audit 未清:审计留存 vs 被遗忘权属政策判断,须显式拍板,代码里不默默删🔒 trust_audit 留存策略待拍板
E2🟡 PBKDF2-310k+端点限流;无 HSM/OPAQUE;XFF 限流被推翻(别线#5)e2ee_crypto_service.dartsys.config throttle;elib_req:first_forwarded_ip/2 取最左P3-9、台账 Acknowledged
E3🟡 trust_audit 有;KT 日志无迁移 44/47 append-onlyP3-8
E4已修(2026-08-02,26f21e64):olm_identity_repo:delete_by_device/2 一次清 olm 三表,接在 user_device_ds:delete/2 这个共享汇聚点,登出与删设备两条吊销路径同时生效;先删设备行后清键(避免"密钥没了但 token 还有效"),清理失败不阻断吊销但记 ERRORdevice_revocation_tests 路径 4 共 4 例(16→20):接线/顺序/error 不阻断/crash 不阻断;空测反证摘掉级联后恰前 2 例变红
E5🟡 append-only 有,树头签名无trust_audit_repo.erl(无 update/delete)P3-8 后补签名
E6🟡 SECURITY.md 待审P5-9

R 类:路线图登记

TT状态说明
R1 PQ📋用户 2026-08-01 决策不纳入;扩展位=capability_negotiator securityRank+ProtocolSuite 占位
R2 MLS📋ADR 19 维持 Proposed;ADR 31 记录"属性达标即可"决策
R3 形式化📋成本锚=2.5 人月(PQ3 Tamarin)
R4 元数据📋台账 Acknowledged 项

横切执行风险(非标准条目,但必须跟踪)

#状态任务
X1E2EE-012/024/025 三个 PASS 复核判不成立(验收建立在生产旁路)已重签 PASS(2026-08-02:回退→生产路径电池 40/40+套件 588+后端 387 全绿,evidence/E2EE-P1-reacceptance-2026-08-02.md)已关闭
X2真机双端从未验证(真机腿全在 22 号文件停放区)⛔人工门P2 全阶段
X3双仓 411 提交未推送(imboy 248/app 163)已推送三仓对齐(2026-08-02:imboy→345da003、imboyapp→9711b3b8,gitee/github/gitcode)P0-4(CI 首轮观察)
X4pro 缺 Olm 端点部署(代码已全,路由 155-163)已在线(2026-08-02 实证):生产跑 alpha.17(07-29 部署),8 Olm 端点+trust/record+backup 全部 200/902 鉴权正常;前提记忆已过时。全量升级(当前 main + 迁移 53)另行——迁移 53 是 sellable 线 user_collect_info_recrypt(连带密钥轮换),须该线 runbook 对齐,不可顺手跑P2 端点侧已解锁
X5AGPL 发布门(flutter_vodozemac AGPL-3.0)已拍板③自建 Apache-2.0 绑定(2026-08-02)X15 实施;分发前必须完成
X6ADR 14-19 签字门(cross-signing/064/KT profile 全 BLOCKED)已全签(2026-08-02 leeyi solo;19 维持 Proposed)P3-4/3-8/3-11 解锁
X7全量 eunit >40min 不可用(harness 结构性慢)P4-7
X8e2ee 三 API 文件 fail-open(olm_api/e2ee_api/e2ee_backup_api 0 throwIfFailed)第一批已修(2026-08-02,imboyapp 8b4330fb):olm 三写操作+备份链三方法改抛(e2ee 591/591 零回归);保留=有意决策:countPrekeys null 语义、查询侧经下游 fail-closed、reportDeviceKey ok:false 已有检查——见下轮复核P3-2 第二批(查询侧+调用方深化)
X9policy 缓存无 TTLP3-9
X10E2EE-027 outbox 残留(读侧未接线/非同一事务)读侧已关闭(2026-08-02:confirmOutbox 接入 ACK 汇聚点+重发 byte-for-byte 实证 3/3;纠正"重发重新 encrypt"为不实——实际复用库中信封;原子性维持 Acknowledged=ADR 02 冻结项)evidence/E2EE-027-read-side-wiring-2026-08-02.md
X11E2EE-062 残留 7 项(拼接实证/租约 TTL/fallback 验签守护/降级守护/告警规则等)🟡P3-7
X12附件加密开关未翻开(Slice 9 真机 BLOCKED+两项拍板)🟡P2-2
X13并发会话领地:imboy 9 个 staged 文件(AI 助手/消息策略线)、imboyapp 7 个 staged 文件——勿碰勿卷入;e2ee-verify 当前红=并发线 user_handler→user_export_logic 模块边界违规,归该线 owner 修,本线不代修⛔别线领地P0-8(已登记,2026-08-02)
X14XFF 限流根基被推翻(sellable 线 #5:elib_req:first_forwarded_ip/2 取最左=攻击者可控)——OTK claim 限流、备份端点限流的有效性依赖该修复;修复落地后本线复核(P3-9)⛔别线依赖P0-8(已登记)→P3-9 复核
X15自建 Apache-2.0 FFI 绑定替换 flutter_vodozemac(R4 裁定 ③):基于 Apache-2.0 vodozemac crate 写自有绑定(flutter_rust_bridge 先例在仓),保持 fvod 调用面兼容使 lib/ 零改动;完成后 NOTICE 更新+许可证扫描进 CI❌ 待实施(排期建议 P3 段,不阻塞 P1/P2)P0-6 后续(2026-08-02 裁定)
X16全量套件 6 例环境依赖失败(CI 首跑暴露,2026-08-02 全部定位):e2ee_health_check_service_test ×5(直接实例化 E2EEApi 打真实后端,本地 9800 在跑则全绿)+ db_migration_encryption_test ×1(isEncryptionSupported 断言 macOS 平台行为)。处置=ubuntu CI glob 暂排两文件(已加注释);正解=测试注入 API mock/平台守卫(非排除),P4 段复核撤销排除🟡 暂排中(coverage 步已随全量绿恢复阻塞力)P4 复核
X17格式门红因定位(2026-08-02 worktree 复刻实证):test/page/chat/chat/chat_page_utils_test.dart HEAD 提交版是旧格式;别线工作树已改好(本地门 0 changed)但未提交→CI 检出旧版必红。处置=格式门暂排该单文件(已加注释),别线提交落仓后必须撤销排除🟡 门暂排中别线提交后撤销排除即关

IMBoy — 企业私有化即时通讯平台