发现47个问题: - P0阻塞性问题: 8个 - P1重要问题: 14个 - P2轻微问题: 25个 - HIGH安全问题: 2个 - MED安全问题: 14个 测试质量评级: C- 安全评级: 需要改进 审查范围: IAM模块、审计日志模块、路由策略模块、合规能力包
11 KiB
11 KiB
立交桥项目深度质量审查报告
审查日期:2026-04-03 审查标准:高标准、严要求 审查范围:IAM模块、审计日志模块、路由策略模块、合规能力包
执行摘要
本次深度审查共发现 47个问题,其中:
- P0 阻塞性问题: 8个(必须立即修复)
- P1 重要问题: 14个(建议本周修复)
- P2 轻微问题: 25个(计划修复)
测试质量评级: C- (基础测试存在但核心业务逻辑覆盖严重不足) 安全评级: 需要改进 (发现2个高危安全问题)
一、P0 阻塞性问题(必须立即修复)
1.1 [P0-01] scope_auth.go - Context值类型拷贝导致悬空指针
| 属性 | 值 |
|---|---|
| 严重度 | P0 - 阻塞 |
| 位置 | supply-api/internal/iam/middleware/scope_auth.go:165,173 |
| 问题 | 返回指向栈帧的指针,函数返回后指针可能无效 |
问题代码:
func GetIAMTokenClaims(ctx context.Context) *IAMTokenClaims {
if claims, ok := ctx.Value(IAMTokenClaimsKey).(IAMTokenClaims); ok {
return &claims // BUG: 值类型拷贝,返回悬空指针
}
return nil
}
修复方案: 改为指针类型存储
// 存储时
context.WithValue(ctx, IAMTokenClaimsKey, claims) // claims 是 *IAMTokenClaims
// 获取时
if claims, ok := ctx.Value(IAMTokenClaimsKey).(*IAMTokenClaims); ok {
return claims
}
1.2 [P0-02] scope_auth.go - writeAuthError未写入响应体
| 属性 | 值 |
|---|---|
| 严重度 | P0 - 阻塞 |
| 位置 | supply-api/internal/iam/middleware/scope_auth.go:322-332 |
| 问题 | HTTP响应只有status code,无JSON body |
问题代码:
func writeAuthError(w http.ResponseWriter, status int, code, message string) {
// ... 构建resp
_ = resp // BUG: resp被丢弃,从未写入w
}
修复方案:
json.NewEncoder(w).Encode(resp)
1.3 [P0-03] audit_service.go - 内存存储无上限导致OOM
| 属性 | 值 |
|---|---|
| 严重度 | P0 - 阻塞 |
| 位置 | supply-api/internal/audit/service/audit_service.go:56-91 |
| 问题 | events slice无限增长,无清理机制 |
问题代码:
s.events = append(s.events, event) // 无限增长
修复方案:
const MaxEvents = 100000
if len(s.events) >= MaxEvents {
s.cleanupOldEvents(MaxEvents / 10)
}
1.4 [P0-04] audit_service.go - 幂等性检查存在竞态条件
| 属性 | 值 |
|---|---|
| 严重度 | P0 - 阻塞 |
| 位置 | supply-api/internal/audit/service/audit_service.go:209-235 |
| 问题 | 检查幂等键和插入事件之间无锁保护 |
修复方案: 在AuditService.CreateEvent级别添加互斥锁
func (s *AuditService) CreateEvent(...) (*CreateEventResult, error) {
s.idempotencyMu.Lock()
defer s.idempotencyMu.Unlock()
// ... 原有逻辑
}
1.5 [P0-05] compliance/engine.go - regexp编译错误被静默忽略
| 属性 | 值 |
|---|---|
| 严重度 | P0 - 阻塞 |
| 位置 | gateway/internal/compliance/rules/engine.go:90-100 |
| 问题 | regexp.Compile错误被完全丢弃 |
问题代码:
regex[0], _ = regexp.Compile(pattern) // 错误被丢弃
修复方案: 返回错误并记录日志
1.6 [P0-06] compliance/engine.go - compiledPatterns非线程安全
| 属性 | 值 |
|---|---|
| 严重度 | P0 - 阻塞 |
| 位置 | gateway/internal/compliance/rules/engine.go:24-27,73-87 |
| 问题 | map并发读写会导致panic |
修复方案: 添加sync.RWMutex保护
type RuleEngine struct {
compiledPatterns map[string][]*regexp.Regexp
patternMu sync.RWMutex
}
1.7 [P0-07] routing_engine.go - 策略注册非线程安全
| 属性 | 值 |
|---|---|
| 严重度 | P0 - 阻塞 |
| 位置 | gateway/internal/router/engine/routing_engine.go:34-36 |
| 问题 | RegisterStrategy无锁保护 |
修复方案: 添加写锁保护
func (e *RoutingEngine) RegisterStrategy(name string, template strategy.StrategyTemplate) {
e.mu.Lock()
defer e.mu.Unlock()
e.strategies[name] = template
}
1.8 [P0-08] routing_engine.go - 空指针解引用风险
| 属性 | 值 |
|---|---|
| 严重度 | P0 - 阻塞 |
| 位置 | gateway/internal/router/engine/routing_engine.go:52-59 |
| 问题 | decision可能为nil但仍被传递 |
修复方案:
if decision == nil {
return nil, ErrStrategyNotFound
}
二、安全高危问题
2.1 [HIGH-01] CheckScope空scope绕过
| 属性 | 值 |
|---|---|
| 严重度 | HIGH |
| CVSS | 6.5 |
| 位置 | supply-api/internal/iam/middleware/scope_auth.go:64-76 |
问题代码:
if requiredScope == "" { return true } // 空scope直接通过
影响: 如果路由配置错误要求了空scope,会绕过所有权限检查
修复方案: 空scope应拒绝访问
if requiredScope == "" { return false }
2.2 [HIGH-02] JWT算法验证不严格
| 属性 | 值 |
|---|---|
| 严重度 | HIGH |
| CVSS | 7.5 |
| 位置 | supply-api/internal/middleware/auth.go:298-305 |
问题: 只检查HMAC类型,未验证alg header本身
影响: 攻击者可用alg: "none"或算法混淆攻击伪造token
修复方案:
if token.Method.Alg() != jwt.SigningMethodHS256.Alg() {
return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
}
2.3 [MED-01] RequireAnyScope逻辑错误
| 属性 | 值 |
|---|---|
| 严重度 | MEDIUM |
| 位置 | supply-api/internal/iam/middleware/scope_auth.go:238-260 |
问题: 第251行逻辑错误,requiredScopes为空时不检查直接通过
2.4 [MED-02] Token状态缓存未验证后端
| 属性 | 值 |
|---|---|
| 严重度 | MEDIUM |
| 位置 | supply-api/internal/middleware/auth.go:333-344 |
问题: 缓存未命中时默认返回"active",不查询数据库
三、测试质量问题
3.1 测试覆盖率分析
| 模块 | 子模块 | 覆盖率 | 评级 |
|---|---|---|---|
| IAM | handler | 0.0% | F |
| IAM | service | 0.0% | F |
| IAM | middleware | 61.4% | C |
| IAM | model | 62.9% | C |
| Audit | 顶层 | 0.0% | F |
| Audit | events | 73.5% | C |
| Audit | model | 95.0% | A |
| Audit | sanitizer | 80.0% | B |
| Audit | service | 76.7% | B |
| Router | router | 94.8% | A |
| Router | engine | 75.0% | B |
| Router | fallback | 82.4% | B |
| Router | metrics | 76.9% | B |
| Router | scoring | 94.1% | A |
| Router | strategy | 71.2% | C |
整体评分: C- - 基础测试存在但核心业务逻辑覆盖严重不足
3.2 覆盖率0%的关键函数
IAM Handler (0.0%)
NewIAMHandler,CreateRole,GetRole,ListRoles,UpdateRole,DeleteRoleAssignRole,RevokeRole,GetUserRoles,CheckScope,ListScopesRequireScope,writeJSON,writeError,toRoleResponse
IAM Service (0.0%)
NewDefaultIAMService,CreateRole,GetRole,UpdateRole,DeleteRole,ListRolesAssignRole,RevokeRole,GetUserRoles,CheckScope,GetUserScopes
Audit顶层 (0.0%)
NewMemoryAuditStore,Emit,Query,generateEventID
3.3 测试与实现脱节
问题: iam_handler_test.go中的测试使用测试桩而非真实handler
// 当前测试:创建辅助HTTPHandler
type HTTPHandler struct {
iam *testIAMService // 使用测试桩
}
func (h *HTTPHandler) handleCreateRole(...) // 辅助函数
问题: 真实handler位于iam_handler.go但完全没有被测试覆盖
3.4 缺失的测试场景
| 场景 | IAM | Audit | Router |
|---|---|---|---|
| 空指针处理 | 未覆盖 | 未覆盖 | 部分 |
| 越界访问 | 未覆盖 | 未覆盖 | 未覆盖 |
| 超时场景 | 未覆盖 | 未覆盖 | 未覆盖 |
| Context取消 | 未覆盖 | 未覆盖 | 未覆盖 |
| 并发安全 | 未覆盖 | 未覆盖 | 部分 |
| 错误恢复 | 未覆盖 | 未覆盖 | 未覆盖 |
四、代码质量问题
4.1 P1重要问题
| ID | 问题 | 位置 | 严重度 |
|---|---|---|---|
| P1-01 | 重复的角色层级定义 | scope_auth.go:40-54 vs 141-155 | Medium |
| P1-02 | 伪随机数用于加权选择 | router.go:145 | Medium |
| P1-03 | FailureRate初始化导致首次计算错误 | router.go:217-223 | Medium |
| P1-04 | DefaultIAMService缺少并发控制 | iam_service.go:85-101 | Medium |
| P1-05 | YAML解析后未验证规则有效性 | loader.go:79-92 | Low |
| P1-06 | IP伪造漏洞 | middleware/chain.go:300-310 | Medium |
| P1-07 | 限流key提取逻辑错误 | ratelimit.go:302-328 | Medium |
| P1-08 | 缺少CORS配置 | main.go:131-163 | Medium |
4.2 P2轻微问题
| ID | 问题 | 位置 |
|---|---|---|
| P2-01 | 通配符scope安全风险 | scope_auth.go:182 |
| P2-02 | isSamePayload比较字段不完整 | audit_service.go:269-307 |
| P2-03 | regexp.MustCompile可能panic | sanitizer.go:55-109 |
| P2-04 | StrategyRoundRobin未实现 | router.go:83-92 |
| P2-05 | 数据库凭证日志泄露风险 | main.go:59-65 |
| P2-06 | 错误信息泄露内部细节 | auth.go:189 |
| P2-07 | 缺少Token刷新机制 | auth.go:171-233 |
| P2-08 | 缺少暴力破解保护 | scope_auth.go |
| P2-09 | 内存审计存储可被清除 | audit_service.go:56-70 |
| P2-10 | 审计日志缺少关键信息 | audit_service.go:48-53 |
五、修复优先级
立即修复 (P0 + HIGH)
- P0-01~08: 8个阻塞性问题
- HIGH-01~02: 2个高危安全问题
本周修复 (P1 + MED)
- P1-01~08: 8个重要问题
- MED-01~14: 14个中危安全问题
计划修复 (P2 + LOW)
- P2-01~10: 10个轻微问题
六、改进建议
6.1 紧急改进
- 重写IAM Handler测试: 使用httptest测试真实
IAMHandler - 重写IAM Service测试: 使用真实
DefaultIAMService而非Mock - 补充audit.go测试: 该文件目前完全无测试
- 引入并发测试: 所有模块添加race condition测试
6.2 高优先级
- 引入mock框架(gomock)替代手写mock
- 添加超时/取消场景测试
- 修复所有P0安全问题
6.3 中优先级
- 补充边界条件测试(0%, 100%, 空值)
- 增强断言(避免无意义断言)
- 添加性能/压力测试
七、总结
| 维度 | 评级 | 说明 |
|---|---|---|
| 代码质量 | 需要改进 | 发现P0问题8个 |
| 安全 | 需要改进 | 发现HIGH问题2个,MED问题14个 |
| 测试覆盖 | C- | 基础测试存在但核心逻辑覆盖不足 |
| 并发安全 | 危险 | 发现多处竞态条件 |
| 整体评级 | 不通过 | 建议修复P0问题后再继续开发 |
建议: 暂停新功能开发,优先修复本次审查发现的8个P0阻塞性问题和2个HIGH安全问题。
审查人员: Claude Code (深度审查Agent) 审查时间: 2026-04-03 审查标准: 高标准、严要求