Files
ai-contract-platform/project-docs/V2-privileged-identity-security-review-2026-08-09.md
T
yuqei ff6ea2877e
Build and Test Quality Gate / Contract Web typecheck and build (pull_request) Successful in 3m58s
Build and Test Quality Gate / Python tests and Contract API migration (pull_request) Failing after 29m6s
Security Quality Gate / npm audit, Bandit, pip-audit, detect-secrets (pull_request) Successful in 15m55s
feat: close provider promotion and support access gates
2026-08-11 15:21:14 +08:00

83 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AI 合同平台 V2 特权身份与支持访问安全评审
> 日期:2026-08-09
> 范围:固定锁复核、确定性身份计划、隔离 PostgreSQL 事务演练、support access validation-only 策略
> 发布结论:**No-Go,真实身份执行器与 support access 不得启用**
## 1. 已验证的安全属性
- 运行态不存在 execute、rollback、merge、split、recover、grant、revoke、support-access、retry、requeue 或 ack 路由;execution-attempts 仍为 GET-only。
- 固定锁和锁内二次 preflight 已在真实 PostgreSQL 隔离 schema 验证,revision 漂移、审批过期、审批人失权和锁超时均 fail closed。
- 确定性计划只保存 target ref 指纹,正向/补偿步骤和双 hash 可检测篡改;support access 不生成身份 mutation plan。
- 隔离事务演练覆盖身份更新后故障和 event/outbox 后故障,身份、event、outbox 同时回滚;随机 schema 清理后残留为 0。
- support access 策略只允许固定 read/comment scope,逐次检查主体、工作空间、scope、状态、revision、时间、policy hash 和 revocation hash;所有结果固定 `access_granted=false`。
## 2. P0 发布阻断项
状态说明:本节保留首次评审时的历史阻断基线,不随代码整改直接改写。后续关闭或部分关闭状态以第 6、7 节复核为准;基础设施或 validation-only 验收不得被解释为真实 support access 发布批准。
1. **无运行时可信授权源**:当前策略材料是纯内存输入,没有持久化 grant、撤销记录、单一真相版本或跨实例一致性协议。任何接入都可能读取陈旧授权。
2. **TOCTOU 未闭合**:validation-only 检查与未来资源访问不在同一受控事务/策略执行点;检查后账号、工作空间、scope、revision 或撤销状态仍可能变化。
3. **可信时间未定义**:`checked_at` 由内部调用方传入,尚未绑定数据库时间或受保护的服务端时钟;不能作为真实自动到期依据。
4. **强认证与会话绑定缺失**:没有 step-up/MFA、设备与会话绑定、短时凭证、不可转移 audience、网络/设备约束或重认证窗口。
5. **撤销传播缺失**:紧急撤销只有纯函数语义,没有 durable revoke、缓存失效、跨节点传播 SLA、拒绝列表或 kill switch 演练。
6. **逐请求审计缺失**:没有对每次支持访问记录资源、scope、决策、策略版本、操作者、时间、结果和关联工单的不可变审计/outbox;也没有异常访问告警。
7. **授权执行面缺失**:没有专用 policy enforcement point,无法证明所有合同、审查、模板和审计读取路径均经过同一 deny-by-default 检查。
8. **隐私与法律门禁未完成**:支持人员可见字段、最小数据集、数据驻留、客户通知、保留期、导出/下载限制和具名法务批准尚未验收。
## 3. 后续实现准入标准
- 加法迁移建立不可变 grant/revocation 状态、版本与审计模型;任何 UPDATE/DELETE、过期或撤销竞争均有数据库约束和并发测试。
- enforcement point 使用服务端/数据库可信时间,在每个受保护请求上在线读取或验证当前 grant、scope、revision、撤销和会话绑定;默认拒绝,依赖不可用时不得降级放行。
- 支持人员使用独立平台身份和强认证,不共享用户密码、cookie、refresh token 或现有会话;不得伪装成用户主体。
- 短时凭证具备固定 audience、workspace、scope、grant ID、策略版本和不可转移绑定;自动到期和紧急撤销在所有节点达到明确 SLA。
- 每次授权检查和资源访问生成最小披露、不可变、可关联的审计事件;告警、人工复核、导出管控、保留和删除策略通过运营演练。
- 独立渗透/越权测试覆盖跨 workspace、scope 提升、时钟偏移、缓存陈旧、撤销竞态、重放、并发和依赖故障;全部 P0 阻断关闭后再进行发布评审。
## 4. 回归清单
- 有效材料仍不得在 validation-only 模式返回 `access_granted=true`。
- 到期边界使用 `checked_at >= expires_at`,时区缺失或时钟异常 fail closed。
- 账号/工作空间停用、revision 漂移、主体或 scope 不匹配立即拒绝。
- policy hash、grant ID、revocation code/hash、scope 顺序、TTL 或时间篡改均拒绝。
- 相同撤销重放幂等,不同材料不能改写历史撤销。
- API/OpenAPI 不出现 support access、grant、revoke、execute 或 rollback 写入口。
- 真实 PostgreSQL 演练只使用随机 schema,异常和成功路径后均精确清理,凭据不得落盘。
- Web 不出现执行、代入、重试、撤销或共享会话控件。
## 5. 证据摘要
- Contract API 全量基线:`250 passed, 1 skipped`;真实 PostgreSQL stage 19 专项随后单独 `1/1` 通过。
- 确定性计划:`9/9`;计划/投递/反滥用组合:`54/54`。
- 隔离 PostgreSQL 原子性演练:`1/1`,残留 schema:`0`。
- support access validation-only:`15/15`;与计划层组合:`24/24`。
- Python compileall、`git diff --check`、三服务健康检查通过;运行态危险身份路由 `0`、plan 路由 `0`。
本报告批准继续开发安全基础设施,不批准启用真实身份执行、支持访问、transport、共享会话或人工绕过入口。
## 6. 第一次整改复核(2026-08-09)
`20260809_0044` 已完成不可变 validation policy/revocation 持久化、数据库可信时间、并发幂等和数据库硬关闭,关闭了第 2 节第 1 项的 durable state 基础缺口,并部分关闭第 3 项可信时间缺口。SQLite 专项、迁移和真实 PostgreSQL 隔离并发均通过,运行时仍无 support access 路由且 `access_enabled=false` 由数据库约束。
发布结论仍为 **No-Go**。尚未关闭的 P0 包括:授权检查与资源读取 TOCTOU、统一 deny-by-default enforcement point、强认证与会话/设备绑定、撤销跨节点传播 SLA 与 kill switch、逐请求不可变审计/告警,以及隐私与法律门禁。真实 support access、身份执行器和共享会话不得启用。
## 7. 第二次整改复核:锁内 deny-only enforcement(2026-08-09)
第 25 阶段已完成统一 deny-only validation enforcement point、固定动作到 scope/resource 的服务端映射、PostgreSQL 锁后 `clock_timestamp()` 复核,以及合同/审查资源锚点的同事务锁定。所有决策仍固定 `enforcement_status=denied`、`access_granted=false`、`executor_enabled=false`,未增加 API、资源内容读取、token/session 或 impersonation。
历史 P0 状态更新如下:第 1 项 durable policy/revocation 基础和第 3 项 validation 使用的数据库可信时间已关闭;第 2 项 TOCTOU 与第 7 项统一 enforcement point 只在 deny-only validation 和当前可锁资源锚点范围内部分关闭,尚未覆盖真实资源读取与使用;第 4 项强认证/会话绑定、第 5 项跨节点撤销传播与 kill switch、第 6 项逐请求不可变审计/告警、第 8 项隐私与法律门禁仍未关闭。
新增的内部 enforcement contract 只允许固定资源动作,并在 policy、审批/主体、撤销记录和可锁定资源锚点全部取得行锁后刷新状态。即使 `policy_satisfied=true`,决策仍固定 `enforcement_status=denied`、`access_granted=false`、`executor_enabled=false`;模板等缺乏稳定资源锚点的动作直接拒绝。该实现未增加路由、transport、凭据、session 或 impersonation。
本阶段已完成验证,但不能宣称完整 check-use TOCTOU 已关闭;真实资源读取尚未接入同一事务,强认证/MFA、设备/会话绑定、撤销传播 SLA、逐请求审计/告警及隐私/法律门禁仍未完成。发布结论继续为 **No-Go**。
具名法务批准必须来自实际法务责任人对正式版本的可核验证据;AI、研发、测试或运营不得代签、推定、补写或伪造姓名、日期、签名、批准记录及生效版本。没有真实批准证据时,隐私与法律门禁必须保持未完成。
## 8. 第三次整改复核:安全控制账本与逐请求审计(2026-08-10)
`20260809_0045` 已补齐 deny-only 内部路径的 fail-closed control、revocation epoch、默认启用的 kill switch、受信认证断言契约、资源锁内 anchor、逐请求不可变 audit 和同事务 outbox。PostgreSQL 并发启动只创建一个 baseline control event,audit 在 outbox 前 flush 以满足即时外键,两者仍在同一事务中原子提交或回滚。
历史 P0 状态再次更新:第 5 项的 durable revocation epoch 和默认 kill switch、第 6 项的逐请求不可变审计/outbox 已在内部 deny-only 范围部分关闭;第 2、4、5、6、7、8 项仍不能整体关闭。原因是当前没有真实资源内容读取、外部 IdP/WebAuthn/硬件 OTP/session 集成、多节点传播测量、kill switch 运维控制面与告警演练、审计消费/告警链路以及具名隐私法律批准。
发布结论继续为 **No-Go**。运行态不存在 support access API,危险身份写路由为 `0`,所有决策和数据库约束保持 `access_granted=false`、`executor_enabled=false`。`revocation_sla_seconds<=5` 是待验证的目标,不是已通过的跨节点 SLA;内部请求中的 assertion/hash 也不是认证系统签发或验证证据。