diff --git a/VULNERABILITY_REPORT.md b/VULNERABILITY_REPORT.md new file mode 100644 index 0000000..ff232fb --- /dev/null +++ b/VULNERABILITY_REPORT.md @@ -0,0 +1,197 @@ +# 漏洞报告 — Volcano-Engine-TTS-UI + +## 元信息 + +| 项目 | 内容 | +|---|---| +| 目标 | ByteDance TTS v3 → OpenAI 兼容接口适配器(Go) | +| 审查范围 | 全部 12 个包、约 2400 行源码(不含 health.html 前端静态页) | +| 审查方式 | 人工代码审查 + `go build` / `go vet`(均通过) | +| 分支/提交 | develop @ 78c7200 | +| 报告日期 | 2026 年 8 月 25 日 | +| 严重度分级 | 🔴 高(必须修复)/ 🟠 中(建议修复)/ 🟡 低(视部署环境)/ ⚪ 信息(记录备查) | + +--- + +## 漏洞清单(按严重度) + +| 编号 | 严重度 | 标题 | 位置 | 一句话影响 | +|---|---|---|---|---| +| VUL-004 | 🔴 高 | `.env` 未被 `.gitignore` 忽略,凭据可能入库/入镜像 | `.gitignore` | API Key 随 git 提交或 Docker 镜像层泄露 | +| VUL-001 | 🟠 中 | aac/flac 响应 Content-Type 与数据不一致 | controller/tts.go、adapter/volcano/synthesis.go | 客户端按 AAC 解码 MP3 数据,播放失败 | +| VUL-003 | 🟠 中 | `X-Forwarded-For` 信任链可伪造 IP 绕过限流 | middleware/ratelimit.go | 反代追加模式下限流失效 | +| VUL-002 | 🟡 低 | transport 层错误不进入 `UpstreamErrors` 指标 | metrics/metrics.go、adapter/volcano/synthesis.go | 网络故障在监控上不可见 | +| VUL-005 | 🟡 低 | 日志注入:客户端可控内容原样写入日志 | middleware/logger.go、controller/tts.go | 可伪造日志行 | +| VUL-006 | 🟡 低 | `/metrics`、`/health`、`/dashboard` 无鉴权 | router/router.go | 公网暴露时泄漏运行细节(设计权衡) | +| VUL-007 | 🟡 低 | `OPENAI_TTS_API_KEY` 未设置时鉴权完全关闭 | middleware/auth.go | 公网直连即无访问控制(设计权衡) | +| VUL-008 | ⚪ 信息 | speed 超范围静默截断 | adapter/volcano/request.go | 0.25~0.5x、2.0~4.0x 实际被 clamp,无提示 | +| VUL-009 | ⚪ 信息 | WAV 输出采样率依赖配置而非上游实际值 | adapter/volcano/audio.go | 配置错误导致音频变速 | + +--- + +## VUL-004 🔴 高 — `.env` 未被忽略,凭据可能入库/入镜像 + +**位置**: `.gitignore`(全文件仅忽略构建产物与编辑器文件) + +**描述**: README 与 `.env.example` 均指导用户执行 `cp .env.example .env` 后填入火山 API Key。但 `.gitignore` **没有包含 `.env`**。任何按此流程操作并执行 `git add .` / `git commit` 的用户,都会把含 `BYTEDANCE_TTS_API_KEY`、`OPENAI_TTS_API_KEY` 的文件提交进仓库历史(即使之后删除,历史中仍可找回)。Dockerfile 第 8 行 `COPY . .` 同样会把 `.env` 拷入镜像层。 + +**影响**: 火山账号 API Key 泄露 → 冒用额度、产生费用、音色资源被盗用。密钥一旦进入 git 历史或镜像层即视为已泄露,只能吊销重建。 + +**修复建议**: +```gitignore +# Secrets +.env +.env.* +!.env.example +``` + +**验证**: 当前工作区无 `.env` 文件,仓库历史也未发现已提交的 `.env`(已核查 `git log` 提交列表无该文件),属"配置隐患"而非"已泄露"。 + +--- + +## VUL-001 🟠 中 — aac/flac 响应 Content-Type 与真实数据不一致 + +**位置**: controller/tts.go:196-212(`contentTypeFor`)、adapter/volcano/synthesis.go:59-63、118-119 + +**描述**: 客户端请求 `response_format: "aac"`(或 `flac`)时,调用链为: + +``` +resolveClientFormat("aac") → "aac"(白名单放行) +synthesis: opts.Format = "mp3"(上游降级,正确) +synthesis: finalFormat = clientFormat = "aac"(错误,保留客户端格式) +controller: Content-Type = contentTypeFor("aac") = "audio/aac"(错误) +``` + +实际响应字节是 **MP3**,但 `Content-Type` 是 `audio/aac`。 + +**影响**: 客户端(浏览器 `