Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/docker-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ jobs:
exit-code: "1"
severity: "CRITICAL,HIGH"
ignore-unfixed: true
# 已接受风险清单(每条带理由与 expiration,到期自动重新变红):
# transformers 4.52.x 被引擎元数据钉死,见 .trivyignore.yaml 与
# docs/SECURITY_DEPENDABOT_TRIAGE.md
# 输入名是 trivyignores(trivy-action v0.36.0 没有 ignorefile —— 写错只会
# 出一条 "Unexpected input(s)" 警告然后照常变红,等于没豁免)
trivyignores: ".trivyignore.yaml"
# 只跑漏洞扫描:secret/misconfig 对 25GB 镜像是纯多余开销,会拖长导出与解包时间
scanners: vuln
# 本项目镜像约 25GB 展开,Trivy 默认 5m 内部超时会在分析阶段被
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ jobs:
severity: CRITICAL,HIGH
exit-code: '1'
ignore-unfixed: true
# 与 docker-build.yml 用同一份已接受风险清单(每条带理由与 expiration)
# 输入名 trivyignores:trivy-action v0.36.0 不认 ignorefile(只会警告后忽略)
trivyignores: ".trivyignore.yaml"
format: table
# 只跑漏洞扫描:secret/misconfig 扫描对 25GB 镜像是纯多余开销,会拖长导出与解包时间
scanners: vuln
Expand Down
36 changes: 35 additions & 1 deletion .github/workflows/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,41 @@ jobs:

- name: Scan dependencies for known vulnerabilities
run: |
pip-audit -r requirements.txt --desc
# 已接受风险:transformers 4.52.x 被引擎元数据钉死(4.57.6 实测让 IndexTTS
# 2.0/2.5 的 infer_v2 / infer_v2_5 直接 ImportError,回 4.52.1 三引擎才通,
# A/B 数字见 docs/SECURITY_DEPENDABOT_TRIAGE.md §2)。下面 16 个号 = OSV 对
# transformers 4.52.1 与 4.52.4 返回的**全部**公告(两边集合实测一致),
# 逐条理由与本仓可达性判定见 docs/SECURITY_DEPENDABOT_TRIAGE.md §1(A1–A16),
# 镜像侧同源豁免见 .trivyignore.yaml(那边只剩 3 条,因为带
# severity: CRITICAL,HIGH + ignore-unfixed: true 过滤,口径差异写在同一节)。
#
# 三条约束,别绕过:
# 1. 只豁免这 16 个号;**任何新出现的公告仍会让本步变红**;
# 2. 号必须绑定证据:取自 run 35575129704 job 106255145288 的真实表格
# (transformers 4.52.4),并与 api.osv.dev 的查询结果逐条对齐 ——
# 上一版这里写的是 5 个号,其中 4 个是把长号截断出来的假号
# (PYSEC-2026-198 / 228 / 229 / 392 其实是 …1980 / …2288 / …2290 / …3929
# 的前缀),pip-audit 按全号精确匹配,所以那次只豁免掉 1 条。
# 3. pip-audit 没有 expiration 机制,到期复审靠人:本批豁免的复审截止
# 2026-12-31,触发条件写在分诊文档 §4;D3/D4 测试保证"工作流里的号集合
# == 分诊文档表里的号集合",加一条豁免就必须同时在文档里加一行理由。
pip-audit -r requirements.txt --desc \
--ignore-vuln PYSEC-2025-211 \
--ignore-vuln PYSEC-2025-212 \
--ignore-vuln PYSEC-2025-213 \
--ignore-vuln PYSEC-2025-214 \
--ignore-vuln PYSEC-2025-215 \
--ignore-vuln PYSEC-2025-216 \
--ignore-vuln PYSEC-2025-217 \
--ignore-vuln PYSEC-2025-218 \
--ignore-vuln PYSEC-2026-1980 \
--ignore-vuln PYSEC-2026-1981 \
--ignore-vuln PYSEC-2026-1983 \
--ignore-vuln PYSEC-2026-1988 \
--ignore-vuln PYSEC-2026-2288 \
--ignore-vuln PYSEC-2026-2289 \
--ignore-vuln PYSEC-2026-2290 \
--ignore-vuln PYSEC-2026-3929
# 2026-08-16 本地评估 0 已知漏洞,解锁为门禁;依赖升级由 dependabot 自动跟进

bandit:
Expand Down
52 changes: 52 additions & 0 deletions .trivyignore.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# Trivy 忽略清单 —— 只用于"已接受风险"的镜像漏洞豁免。
#
# 为什么存在:本产品的运行环境被引擎真实约束钉在 transformers 4.52.x
# (IndexTTS 2.0/2.5 的发行元数据要求 transformers==4.52.1;实测 4.57.6 下
# indextts.infer_v2 / infer_v2_5 直接 ImportError,见 docs/SECURITY_DEPENDABOT_TRIAGE.md §2)。
#
# 为什么这里只有 3 条、而 pip-audit 那边有 16 条(不是漏了):
# 两个门禁的过滤口径不同。镜像扫描这两步带 `severity: CRITICAL,HIGH` +
# `ignore-unfixed: true`(docker-build.yml:65 / docker-publish.yml:99),于是 4.52.4 的
# 16 个公告里只有"HIGH 且有修复版本"的 3 条会进结果 —— 就是下面这 3 条,CI 实测
# `Total: 6 (HIGH: 6, CRITICAL: 0)`(同一镜像里 root 与 ttsuser 两处 site-packages 各算一次)。
# 其余 13 条(8 条无修复版本的本地向量 + 5 条 MODERATE)由 pip-audit 那一步逐条豁免,
# 因为 pip-audit 没有 severity / unfixed 过滤器。两边的 id 集合都在分诊文档 §1 的同一张表里。
#
# 规则(三条都要满足,tests/test_dependency_consistency.py 的 D3/D4 会核对):
# 1. 只允许登记分诊文档 §1 表里已有的 id,且逐条写"为什么本仓不可达"(写在条目上方注释);
# 2. 每条必须给 expiration —— 到期该条自动失效、门禁重新变红,逼一次复审;
# 3. 必须绑定 package.version。这里绑 4.52.4 是**镜像实际装的版本**(Dockerfile:33/38 装
# requirements.txt 的声明并解析到 4.52.4,而不是锁里的 4.52.1 —— 这两条分发路径解析
# 不同版本,已作为已知缺口记在分诊文档 §3b)。绑死版本号的好处是:哪天镜像里换成别的
# transformers 版本,这些豁免自动不生效、门禁变红,而不是悄悄继续放行。
#
# 输入名注意:trivy-action v0.36.0 的合法输入叫 `trivyignores`,**没有** `ignorefile`
# (写错只出一条 "Unexpected input(s) 'ignorefile'" 警告然后照常变红,等于没豁免 —— 本轮踩过)。
vulnerabilities:
# CVE-2026-4372(PYSEC-2026-2289 / GHSA-29pf-2h5f-8g72,HIGH,CVSS 3.0 AV:L,修复于 5.3.0):
# transformers 远程代码执行,触发前提是加载攻击者可控的仓库代码
# (trust_remote_code 或远程 model 指向)。本仓权重全部来自 model/ 本地目录,
# 经人工确认 + SHA-256 复验后才入库(LOCAL_RULES 禁区流程);镜像内无远程模型入口。
- id: CVE-2026-4372
package:
name: transformers
version: "4.52.4"
expiration: "2026-12-31T00:00:00Z"

# CVE-2026-5241(PYSEC-2026-2290 / GHSA-fgcw-684q-jj6r,HIGH,CVSS 3.1 AV:N,修复于 5.5.0):
# 模型初始化期的任意代码执行,载体是 LightGlue 一类视觉匹配模型。
# 本仓只加载 TTS 语音模型(voxcpm / indextts / funasr / zipenhancer),无该代码路径。
- id: CVE-2026-5241
package:
name: transformers
version: "4.52.4"
expiration: "2026-12-31T00:00:00Z"

# CVE-2026-9856(PYSEC-2026-3929 / GHSA-xrqw-3rrv-vx5w,HIGH,CVSS 3.0 AV:N,修复于 5.10.0):
# save_pretrained 经 chat template 造成任意文件写。
# 全仓无 save_pretrained 调用(grep 证据见分诊文档 §1 A8),音色保存走我们自己的目录写入。
- id: CVE-2026-9856
package:
name: transformers
version: "4.52.4"
expiration: "2026-12-31T00:00:00Z"
19 changes: 15 additions & 4 deletions docs/DOD.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,11 +127,22 @@
后三引擎真推理全通(2.5:214,040 B / RMS 6176;2.0:205,124 B / RMS 6926;VoxCPM2:230,148 B /
RMS 4615;每次卸载显存回到 ~3.5 GB)。故 `pyproject`/`requirements.txt` 里那句
`transformers>=4.57.0`(9-14 搭在一条只讲 gpu-smoke 的提交里进来的)站不住,但改回 4.52.x 会让
pip-audit 与 Trivy 两道 CI 安全门禁同时变红(扫到 4.52.4 的"4.53 已修"CVE)——**下界与引擎可用性
互斥**,本轮只落地无争议部分(锁集合法化 + 检查器接进 CI + 报错文案),下界原样保留并在
`pyproject.toml` 里写清两条出路,岔口交所有者;
pip-audit 与 Trivy 两道 CI 安全门禁同时变红(4.52.x 实带 **16 个**公告:4 条要 4.53、4 条要
5.x 大版本、8 条**上游根本没有修复版本**)——**下界与引擎可用性
互斥**,2026-09-21 定为**出路①并落地**:下界回到 `>=4.52.1,<4.53`(`tokenizers>=0.21.0,<0.22`),
两道扫描器改成**逐条带理由的已接受风险豁免**(号取自 CI 真实输出 + api.osv.dev 复核,见
`docs/SECURITY_DEPENDABOT_TRIAGE.md` §1/§1a;pip-audit 侧 16 个 PYSEC 号,Trivy 侧因那两步带
`severity:CRITICAL,HIGH` + `ignore-unfixed:true` 只剩 3 条 CVE,`.trivyignore.yaml` 于
2026-12-31 到期、到期自动重新变红;pip-audit 没有到期机制,靠文档 §4 的同一日期人守),
并新增 `tests/test_dependency_consistency.py`(11 条)核对"声明 ↔ 锁 ↔ 豁免清单"三者不互相漂移 —— 这正是原先缺位的那类"下界棘轮",也是这条错误下界能在 main 上
存活一周没人发现的原因;其中 D4 专门堵本轮自己踩出来的两个**静默失效**坑:
`--ignore-vuln` 的号从 CI 表格里目抄被列宽截断成前缀假号(5 条里只生效 1 条)、
Trivy 的输入名写成 `ignorefile`(v0.36.0 只认 `trivyignores`,写错仅警告、豁免等于没接);
同一步还暴露出**镜像装 4.52.4 而锁钉 4.52.1**(`Dockerfile:33/38` 按声明装而非按锁装),
已作为已知缺口记在分诊文档 §3b,本轮未动 Dockerfile。
引擎加载失败时的报错也不再断言"PyPI 无 indextts 包",改为带上底层 ImportError 与版本不匹配提示。
20 条 Dependabot 告警因此**没有一条能靠现在就升级消掉**,分诊见 `docs/SECURITY_DEPENDABOT_TRIAGE.md`。
20 条 Dependabot 告警因此**没有一条能靠现在就升级消掉**,分诊见 `docs/SECURITY_DEPENDABOT_TRIAGE.md`;
且那 20 条只覆盖有 GHSA 记录的 10 个公告,**8 条 PYSEC-only 的 Dependabot 从不开单**。
* **已知缺口**:CI 冒烟 `scripts/gpu_smoke_minimal.py` 只覆盖 voxcpm2 + indextts2(走 OpenAI 口,
而 `tts-1` / `tts-1-hd` 两个模型名里没有 IndexTTS **2.0** 的位置);2.0 的真推理今天人工验过,
要接进冒烟需改用 `/api/generate/indextts2` 形态并在 GPU runner 上复验,另案。
Expand Down
Loading
Loading