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
83 lines
9.2 KiB
Markdown
83 lines
9.2 KiB
Markdown
# 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 也不是认证系统签发或验证证据。
|