- 三份 gateway 审计(20260801/0807/0809)合并为单一 docs/security/gateway_SECURITY_AUDIT.md - 已完成修复已合入 gateway/src/main.cpp 注释,认证相关项标注迁 ca - 新建 docs/security/ca_SECURITY_AUDIT.md,同步迁入 P2-3/P1-7/A2 等开放项 - 更新 docs/INDEX.md 审计表、ca/README.md 引用、auth_service_plan/libhttp 文档链接 Co-Authored-By: WorkBuddy <workbuddy@tencent.com>
7.3 KiB
gateway 模块安全审计(合并文档)
本文档合并了 gateway 自 v0.8.0 以来的三轮安全审计记录:
- 2026-08-01 初版审计(gateway v0.8.0,2500+ 行,认证内嵌)
- 2026-08-07 复审(P0 全部修复、进程退出 bug 修复)
- 2026-08-09 增量复审(8 项新发现:优雅关闭崩溃、头名大小写、XFF 伪造绕过修复、黑盒测试重写落地)
架构变更(v0.9.0):gateway 已退化为纯转发服务(仅 loopback 监听,不验签),认证职责(Token 签发/验签、登录/注册/重置、限流、WS 代理鉴权、PBKDF2/RSA)整体迁移至 ca 模块。
所有 ✅ 已修复项已作为代码注释合入
gateway/src/main.cpp(以“审计 A*”“P1-1”等标记内联于对应代码)。本文档仅保留开放项、历史追溯与上线检查清单,避免陈旧信息。
1. 审计轮次概览
| 轮次 | 日期 | 基线 / 范围 | 关键结论 |
|---|---|---|---|
| 初版 | 2026-08-01 | v0.8.0 src/main.cpp、src/shared/(libth/libhttp/libcrypt/libsqlite3) |
建立 P0/P1/P2 分级;P0-1 RSA 持久化定为设计接受;发现认证内嵌带来的 Token 吊销缺失等 |
| 复审 | 2026-08-07 | v0.9.0 前 src/main.cpp、inc/、配置 |
P0 三项全部修复;进程退出 bug 修复;Token 吊销(P1-1)实现并随认证独立化迁 ca |
| 增量复审 | 2026-08-09 | v0.9.0 纯转发 src/main.cpp |
8 项新发现(A1/A2/A5/A8 等代理层修复、黑盒测试重写落地);认证类问题转入 ca 审计 |
2. 已完成修复(已合入代码,供追溯)
代码位置:gateway/src/main.cpp(注释以“审计 A*”/“P1-1”等标记)。
- A1 优雅关闭
double-join崩溃(删除 else 分支重复join) - A2 白名单外 Target-Url 返回 403(改抛
HttpException 2303,不再 500) - A5
is_special_header头名大小写归一(统一转小写比较) - A8 错误消息
[Http][Error NNNN]前缀剥离(仅e.message()外泄,前缀留服务端日志) - P1-1 路径遍历防护(
is_safe_target)+ XFF 剥离与可信注入(is_special_header/handleProxy) - libhttp P1-2 反向代理响应体 10MB 上限
- 信号安全重构(async-signal-safe 标志 + SIGPIPE 忽略 + 关闭 8s / 日志 3s 超时保护)
- 启动 loopback 强制自检 +
X-Auth-User存在性不变量(v0.9.0 新增)
认证侧脱敏(P0-2 / P0-3 错误信息脱敏)已在
wrapperHttp/ExpBase.hpp闭环。
3. 已随认证迁移至 ca(v0.9.0,不再属 gateway 待办)
以下历史问题在 v0.9.0 认证独立化后于 ca 模块闭环,gateway 侧无需再处理;ca 的独立审计见 ca_SECURITY_AUDIT.md(其 §2 为 ca 相关开放项)。
- P0-1 RSA 密钥持久化(设计接受:重启即密钥轮换)
- P0-2 / P0-3 错误信息脱敏
- P1-1 Token 吊销机制(jti 黑名单 + 用户版本号双轨,已实现于 ca)
- P1-2 账户级登录失败锁定(ca 侧)
- P2-5 JTI 黑名单内存有界(ca 侧)
- P2-6 用户名 / 邮箱长度限制(ca 侧)
- A3 缺字段返回 400(ca 侧 handler)
- A6 / A7 验证码双渠道统一 / 废弃内置验证码(ca + captcha2 侧)
4. 当前开放项(gateway v0.9.0 纯转发)
| 编号 | 等级 | 问题 | 状态 | 说明 / 修复建议 |
|---|---|---|---|---|
| P1-3 | 🟠 | 上游代理 HttpClient 未显式设置超时 |
⚠️ 部分修复 | 下游服务(captcha/smtp)超时已配;代理转发 HttpClient 未设连接/读取超时。建议连接 5s、读取 30s(handleProxy 出站调用处) |
| P1-5 | 🟠 | 请求体大小无显式限制 | ❌ 未修复 | req.body() 直接读取,gateway 层未检查 Content-Length;依赖 libhttp 默认 10MB。建议超 10MB 返回 413 |
| P1-7 | 🟠 | CSRF Token 缺失 | ❌ 未修复(低优先级) | gateway 纯转发、无认证表单;前端 + ca 会话模型覆盖。如启用独立 HTTPS 模式(tls = on)需评估 |
| P1-8 | 🟠 | 日志注入 | ⚠️ 部分修复 | 用户输入经 ca 透传后直接拼接日志;内部 pymsg→db,外部不可见,风险低。建议对 username/email 等字段做换行符转义 |
| P2-2 | 🟡 | TLS 版本 / 套件未限定 | ❌ 未修复(低风险) | tls = off,TLS 由 WAF 终止;如启用 tls = on 需增加 TLS 版本与 CipherSuites 配置项 |
| P2-3 | 🟡 | CORS 反射任意 Origin | ❌ 未修复 | _CORS_ORIGINS 白名单已加载但未用于响应头;OPTIONS 预检由 libhttp 直接反射 Origin。需 libhttp 层接入白名单或由 gateway 注册显式 OPTIONS 路由 |
| P2-4 | 🟡 | HTTP 服务器无 Read/Write/Idle 超时 | ⚠️ 部分修复 | HttpServer(addr,port,4) 的 4 为连接超时,无请求级超时;存在 Slowloris / 连接耗尽风险 |
| A4 | 🟡 | 模式 B 独立部署限流可被 XFF 伪造绕过 | 📝 已文档化 | README 模式 B 已加安全降级提示(伪造 XFF 可绕过限流,生产必须用模式 A / WAF 前置)。根因需 libhttp 向 handler 透传 TCP 对端地址(跨模块 API 变更,见 ../reports/libhttp_remote_addr_dev_doc.md) |
不在 gateway 范围(libhttp 层,gateway 侧跳过):P1-4 C++ HTTP 解析器 fuzz(属 libhttp);P1-6 反向代理响应大小已由 libhttp 默认 10MB 保证(视为已闭环)。
5. 配置安全审计(历史结论,仍适用)
| 检查项 | 状态 | 说明 |
|---|---|---|
| 监听地址 | ✅ 安全 | address = 127.0.0.1 |
| TLS 模式 | ✅ 符合部署 | tls = off,WAF 终止 |
| 管理员白名单 | ✅ 安全 | users 显式配置,无默认管理员 |
| CORS 白名单 | ⚠️ 配置未生效 | allowed_origins 已配但未用于响应头(见 P2-3) |
| Token 有效期 | ✅ 合理 | keep_time = 3600,max_refresh = 10 |
| WS 代理路由 | ✅ 安全 | 仅 /ws/aibox,需管理员权限 |
| 敏感凭据 | ✅ 无泄露 | 配置文件无硬编码密码 / 密钥 |
6. 黑盒测试待办(需测试钩子)
- 完整旅程(captcha → send_code → register → login → whoami → logout)、Cookie 链路(Set-Cookie 属性、代理注入 Authorization)、jti / 版本号吊销、refresh_token、白名单 403(A2 已转绿)、防枚举时序
test_captcha.py/test_smtp.py重写为 pymsg 直连(captcha2:8009、smtp:8008)- 钩子方案(二选一):captcha2 / smtp 提供测试模式(固定验证码答案);或
gateway.ini增加[Security] captcha_required / email_code_required开关
7. 上线前检查清单
- 确认 WAF 规则已启用
- 确认所有服务绑定 127.0.0.1
- 确认云安全组 / ufw 仅放行 TCP 443
- 确认无默认管理员账户
- 确认
.env权限 0600,SMTP 密码未硬编码 - 确认 gateway 配置
tls = off、address = 127.0.0.1 - 回归测试:登录 / 注册 / 代理 / Token 刷新 / 吊销全链路正常
维护说明:新增 / 复测开放项请直接编辑本文件;修复后请将对应行移至“已完成”(§2)或合入 gateway/src/main.cpp 代码注释后删除本行。
审计人: AI Security Auditor
合并于: 2026-08-10(三轮审计合并;源文件 gateway_SECURITY_AUDIT_20260801.md / _20260807.md / _20260809.md 已归档删除)