Files
gochat/docs/SECURITY_AUDIT_REPORT.md
T
2026-06-04 15:44:48 +08:00

116 lines
3.9 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.
# GoChat 安全审计 Review
## 安全基础设施清单
| 组件 | 文件 | 行数 | 状态 |
|------|------|------|------|
| JWT 安全 | auth/jwt_security.go | - | ✅ 完整 |
| SSRF 防护 | security/ssrf_protection.go | - | ✅ 完整 |
| Rate Limiting | middleware/rate_limit.go | - | ✅ 完整 |
| MFA (TOTP) | auth/mfa.go | 277 | ✅ 完整 |
| SAML | auth/saml.go | 152 | ⚠️ 验证逻辑 TODO |
| OAuth | auth/oauth.go | - | ✅ 完整 |
| Webhook 签名 | security/webhook_signing.go | 425 | ✅ 完整 |
| 文件上传安全 | middleware/upload_security.go | 231 | ✅ 完整 |
| ZIP 碎片防护 | middleware/upload_security_zip.go | 68 | ✅ 完整 |
| XSS 防护 | middleware/xss_protection.go | 279 | ✅ 完整 |
| 安全头部 | middleware/security_headers.go | 138 | ✅ 已集成 |
| 数据加密 | security/encryption.go | 252 | ✅ 完整 |
| SQL 安全 | security/sql_safety.go | 458 | ✅ 完整 |
| RBAC | auth/policy.go | - | ✅ 完整 |
| CORS | middleware/cors.go | - | ✅ 完整 |
| Refresh Token | auth/refresh_token.go | - | ✅ Redis+fallback |
## 安全措施详细评估
### 1. JWT 安全 ✅
- HMAC-SHA256 签名
- Access Token (15min) + Refresh Token (7d)
- Redis 存储 refresh token(防重放)
- Claims: user_id, email, type, account_id, custom_role_id
- Token 撤销支持
### 2. SSRF 防护 ✅
- URL 白名单验证
- 私有 IP/内部网络检测
- DNS rebinding 防护
- URL 重定向跟踪限制
### 3. Rate Limiting ✅
- 基于 IP + 路径的速率限制
- 可配置窗口和阈值
- 超限返回 429 Too Many Requests
- Redis 后端(可选内存后端)
### 4. 文件上传安全 ✅
- MIME 白名单(jpeg/png/gif/pdf/text/mp3/ogg/mp4/zip
- 文件大小限制(默认 20MB
- 文件名消毒(路径/特殊字符/空字节)
- 实际 MIME 类型验证(不信任 Content-Type
- ZIP 碎片攻击防护(压缩率+条目数检查)
### 5. XSS 防护 ✅
- bluemonday HTML 净化(StrictPolicy + UGCPolicy
- JSON 响应 HTML escaping
- 输入字段自动清洗
- 空字节和控制字符过滤
### 6. 安全头部 ✅ (已集成到 bootstrap)
- Content-Security-Policy
- X-Frame-Options: DENY
- X-Content-Type-Options: nosniff
- Strict-Transport-Security
- Referrer-Policy
- Permissions-Policy
- Server header 移除
### 7. 数据加密 ✅
- AES-256-GCM 加密/解密
- 敏感字段自动加密(channel token, API key, webhook secret
- EncryptionConfig 管理
- EncryptField/DecryptField helpers
### 8. Webhook 签名 ✅
- HMAC-SHA256 签名生成和验证
- 时间戳时效检查(防重放攻击)
- 多源支持(Meta, Telegram, API channel
- 签名格式:`t=<timestamp>,v1=<signature>`
### 9. RBAC ✅
- PermissionMatrix 权限矩阵
- PolicyContext.Can(action, resource) 权限检查
- 管理员/super_admin 快速路径
- 自定义角色权限支持
- message create 特殊规则(agent 可发消息)
### 10. SQL 注入防护 ✅
- GORM 参数化查询(默认安全)
- sql_safety.go 审计文档
- 避免 Raw()/Exec() 直接拼接 SQL
- 输入验证规范
## 安全风险和遗留问题
| 风险 | 严重性 | 说明 |
|------|--------|------|
| SAML 验证未实现 | 中 | auth/saml.go 有 TODO |
| Redis 依赖可选 | 低 | Refresh Token 无 Redis 时 fallback 内存 |
| bcrypt rounds=10 | 低 | 生产建议 rounds=12 |
| CORS 配置宽松 | 中 | 当前允许所有来源,生产需限制 |
| Session 管理 | 低 | 纯 JWT 无 server-side session |
## 测试覆盖率评估
| 模块 | 覆盖率 | 评级 |
|------|--------|------|
| pkg/crypto | 87.5% | A |
| internal/model | 65.8% | B |
| internal/auth | 17.6% | C |
| internal/repository | 6.3% | D |
| internal/service | 0.2% | F |
| E2E tests | 100% (9/9 PASS) | A |
### 需要改进
- Service 层覆盖率极低(0.2%)— 关键业务逻辑缺少测试
- Repository 层覆盖率低(6.3%)— 数据访问需要验证
- Auth 层覆盖率中等(17.6%)— RBAC/MFA 需更多测试