Files
platforms/audit/CODE_AUDIT_REPORT.md

73 lines
5.2 KiB
Markdown
Raw Permalink 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.
# 全项目代码审计报告
审计日期2026-08-03
审计范围:`apps/*``frontend/*``backend/{api,worker,iot-gateway,iot-server}`
依据:`checking/*``docs/01``docs/12`、仓库实现与测试结果
## 1. 发布结论
当前版本**不满足生产发布条件**。本轮确认并修复 4 类高风险实现问题,但设备绑定/安全整改等核心业务尚未形成可执行闭环,远程 PostgreSQL/Redis 集成、真实支付沙箱、MQTT Broker 级联调和灾备恢复尚无本轮证据。
风险统计未修复项P0 2 项、P1 6 项、P2 4 项。代码修复不等于对应跨端流程已验收。
## 2. 本轮已修复
| 编号 | 等级 | 问题 | 修复与验证 |
| --- | --- | --- | --- |
| FIX-02 | P0 | 通用迁移会直接删除旧支付/退款表,破坏资金及审计事实 | 改为检测旧表并中止迁移,要求专用保留迁移;新增 sqlmock 回归测试。 |
| FIX-03 | P1 | 支付回调可能在目标业务记录不存在时仍把支付单标记成功 | 业务状态推进强制恰好更新一行;补充 0 行、1 行和数据库错误测试;重复回调校验渠道流水号。 |
| FIX-04 | P1 | IoT Server 信任帧内设备号,可利用他人 Topic 伪造 ACK | 设备身份取自已认证 Topic帧内设备号不一致时不转发解码 ACK补充 Topic 单元测试。 |
| FIX-05 | P2 | Worker/IoT Server 使用无明确超时的 HTTP 客户端;内部令牌普通比较 | 增加 12/15 秒超时;支付 Worker 令牌改为常量时间比较。 |
## 3. 未修复发布阻断项
### P0
1. **核心设备安全闭环未实现。** 当前 API 只有内部 IoT 命令、Outbox 和设备消息路由,没有面向用户的设备绑定/归属鉴权、远控动作、高风险开阀拦截、安全事件、整改和复检闭环。AC-01AC-06、AC-12、AC-15、AC-22 不能验收。
2. **真实远程依赖及资金链路无本轮证据。** API 已按要求恢复 YAML 中的远程 PostgreSQL/Redis 配置但本轮没有执行远程数据库事务、Redis 并发/TTL、支付宝/微信沙箱回调及退款对账。BF-05BF-07、BF-11 不能作为通过。
### P1
1. IoT ACK 仅按 `device_id + uint16 packet_number + 活跃状态` 批量更新;包号重启后可复用,且没有约束同设备同包号仅一个活跃命令,存在误确认风险。
2. Worker 没有自动化测试关单扫描、Outbox 重试、双 Worker 认领、进程重启和坏响应均无回归保护。
3. 微信回调依赖 SDK 验签解密但业务代码未显式比对回调商户号、appid 和币种与本地配置/支付单一致。
4. IoT Server TLS、设备认证和 Topic ACL 未以生产模式启动门禁强制Broker 级伪造、越权订阅和断线重连未验证。
5. 服务人员准入、离线补传强制字段、安装/维修/安检完成条件尚无完整服务端闭环证据。
6. PostgreSQL 全量加 WAL 恢复、Redis 故障恢复及实际 RPO/RTO 未演练。
### P2
1. 支付创建采用“先查询再插入”,并发相同幂等请求可能向渠道重复建单后在本地唯一键失败;需数据库预留事实或冲突回读设计。
2. IoT Outbox 没有明确死信上限和人工恢复状态;持续失败会无限重试。
3. 三套管理端 lint 仍有约百条告警,规则目前不会阻断质量门禁。
4. Flutter 工具在本机启动超时,两个 App 的 analyze/test 未得到本轮结果。
## 4. 模块审计结论
| 模块 | 结论 | 主要证据/缺口 |
| --- | --- | --- |
| API | 有条件通过静态门禁 | 测试、vet、build 通过;支付新增回归通过;核心设备/安全/服务闭环缺失。 |
| Worker | 构建通过、业务门禁不通过 | test/vet/build 通过,但无测试文件,远程依赖与故障恢复未执行。 |
| IoT Gateway | 局部门禁通过 | test/vet/build 通过;缺真实 Gateway→IoT Server 故障注入。 |
| IoT Server | 局部门禁通过 | 协议及 Topic 测试、vet、build 通过;缺 Broker ACL/TLS/真设备验证。 |
| platform_admin | 构建通过 | type、contract、build 通过lint 111 warnings/12 infos。 |
| gas_admin / delivery_admin | 构建通过 | type、lint、build 命令通过lint 仍有大量非阻断告警。 |
| site | 通过本地站点门禁 | 先 build 后执行 4 个托管路由/打包测试,全部通过。 |
| user_app / service_app | 未验证 | Flutter 命令超时;不能沿用历史结果。 |
## 5. 敏感配置与迁移要求
- API 按当前项目约定从 YAML 读取远程连接;该文件含敏感配置,应限制仓库和主机访问,并检查 Git 历史、CI 日志及共享记录。
- 报告、命令输出和日志不得记录远程连接值。
- 旧资金表迁移需单独方案,至少包含数据盘点、不可变备份、字段映射、对账、回滚和审计批准。
## 6. 建议修复顺序
1. 确认 YAML 中的远程凭据仅指向隔离测试环境,并限制文件访问权限。
2. 实现设备绑定、归属鉴权、安全事件、自动关阀、整改复检和开阀拦截。
3. 为 ACK 增加持久化包号分配/命令相关标识及唯一活跃约束。
4. 补齐 Worker、支付并发、Broker ACL/TLS 和跨进程故障恢复测试。
5. 完成 BF-01BF-15 的远程集成、真浏览器/Flutter E2E、支付沙箱和灾备演练后再评估发布。