fix(deps): 依赖下界回到实测能跑的 transformers 4.52.x,安全门禁改为逐条带理由的豁免 - #103
Merged
Merged
Conversation
A/B 实测(RTX 5070 Ti,2026-09-21):4.57.6 下 VoxCPM2 正常但 IndexTTS 2.5/2.0 的 infer_v2_5 / infer_v2 直接 ImportError;4.52.1 + tokenizers 0.21.0 下三引擎真推理全通 (2.5:214,040 B / RMS 6176;2.0:205,124 B / RMS 6926;VoxCPM2:230,148 B / RMS 4615)。 引擎发行元数据本身就写着 transformers==4.52.1 且 tokenizers==0.21.0,所以 >=4.57.0 那句 声明按它装出来的环境两个引擎起不来 —— 采信引擎侧,下界收回 <4.53。 代价是 pip-audit 与 Trivy 会扫到 4.52.4 的三条"4.53 已修"CVE。不整体关门禁,改成逐条豁免: - pip-audit:security.yml 里 5 个 --ignore-vuln PYSEC-*,号取自真实 CI 输出; - Trivy:新增 .trivyignore.yaml,3 条各自绑定 transformers 4.52.4 并带 expiration 2026-12-31(到期自动重新变红),docker-build / docker-publish 两处镜像扫描接上。 新增 tests/test_dependency_consistency.py 把三方钉在一起:锁集里每个 pin 必须满足 pyproject 声明(≥20 个包)、锁集必须仍是 transformers==4.52.1 + tokenizers==0.21.0 且声明带 <4.53、 豁免文件每条必须有 expiration 且每个 CVE/PYSEC 都要在分诊文档里出现 —— 防止以后再出现 "改了声明没人改锁集"或"豁免写了没人到期收"这类漂移。证据与可达性判定见 docs/SECURITY_DEPENDABOT_TRIAGE.md §1/§2。 GitHub 上那 20 条 Dependabot 告警的 dismissal 不在本 PR 内(属仓库所有者动作)。 Signed-off-by: ReSerendipity <zengyangc@outlook.com>
上一把提交里的豁免**实际只生效了一部分**,两处都是"看起来配好了、工具根本没读"的静默失效:
1. pip-audit 的 5 个 --ignore-vuln 里有 **4 个是假号**:PYSEC-2026-198 / 228 / 229 / 392 是从
CI 表格里目抄时被列宽截断的前缀,真号是 …1980 / …2288 / …2290 / …3929。pip-audit 按全号
精确匹配,所以 CI 只报了 "ignored 1"(run 35575129704 job 106255145288)。
现在按 OSV(api.osv.dev/v1/query,transformers 4.52.1 与 4.52.4 两个版本各查一次,返回
24 条记录、按 CVE 去重 16 个公告,两侧集合一致)登记全部 **16 个** PYSEC 号。
2. Trivy 的输入名写错了:trivy-action v0.36.0 **没有** `ignorefile`,合法名是 `trivyignores`;
写错只出一条 "Unexpected input(s)" 警告然后照常变红(run 35575129698 job 106255144801:
Total: 6 HIGH,仍是那 3 条 CVE)。同理 `.trivyignore.yaml` 的 schema 是
`package: {name, version}`(单数字符串),我原先写的 `versions: [...]` 不会被读取。
代价的口径随之更正(这条更要紧):4.52.x 不是"带 3 个 CVE",而是 **16 个公告** ——
A1–A4 要 4.53(被引擎 pin 挡住)、A5–A8 要 5.x、**A9–A16 这 8 条上游没有修复版本**。
Trivy 侧只剩 3 条纯粹是因为那两步带 severity:CRITICAL,HIGH + ignore-unfixed:true。
pip-audit 没有到期机制,所以 16 条靠分诊文档 §4 的 2026-12-31 复审约定 + 新守卫人守。
顺带两个新发现,都记进文档:
- **8 条 PYSEC-only 的公告 Dependabot 从不开单**(它只跟 GHSA),所以"关完 20 条告警"
≠ "4.52.x 的风险登记完";
- **镜像装的是 transformers 4.52.4,而锁钉 4.52.1**(Dockerfile:33/38 按 requirements.txt
声明装而非按 requirements-lock.txt)—— 同一份代码两条分发路径装出不同补丁号,
本轮只把 `.trivyignore.yaml` 的 package.version 绑在被扫产物的真实版本上,未动 Dockerfile。
守卫:D3 的豁免数下限从 5 抬到 16,新增 D4 三条 —— 输入名必须是 trivyignores(且不得出现
ignorefile)、schema 必须用 package.version、以及"security.yml 的 PYSEC 集合 == 分诊文档 §1
A 组表的集合"双向完全相等(多一个是未登记降级,少一个是登记了没豁免)。配一条截断变异自证:
把每个号各砍掉一位后必须全部对不上,否则这条断言在空转。
本机验证:ruff check/format 全绿、mypy 103 = 基线、check_pin_crossconflicts PASS(95 个包
0 冲突)、integrity PASS、check_spec_refs new=0、tests/test_dependency_consistency.py 11 passed、
全量 2089 passed / 0 failed(覆盖率 45% 门槛通过)。
Signed-off-by: ReSerendipity <zengyangc@outlook.com>
This was referenced Sep 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
这条 PR 解决什么
pyproject.toml/requirements.txt里的transformers>=4.57.0与引擎的真实约束互斥:按它装出来的环境两个引擎起不来。本 PR 采信引擎侧,把下界收回实测可跑的 4.52.x,并把因此变红的两道安全扫描改成逐条、带理由、带到期时间的已接受风险豁免,再加一条测试防三方漂移。它是 #101 留下的那个岔口的决策落地——#101 当时只并了"无争议部分"(锁集合法化 + 检查器接进 CI + 报错文案),把下界交回所有者;本轮已定出路①。
证据(本机 RTX 5070 Ti,2026-09-21 A/B 实测)
infer_v2_5ImportErrorinfer_v2ImportError每次卸载后显存回到 ~3.5 GB。另外
indextts 2.0.0的发行元数据本身写的就是transformers==4.52.1且tokenizers==0.21.0——不是我们挑的版本,是它钉的。改动
pyproject.toml/requirements.txt:transformers>=4.52.1,<4.53、tokenizers>=0.21.0,<0.22。注释里保留上面这张表,避免下次又被"顺手抬下界"。.github/workflows/security.yml:pip-audit 加 5 个--ignore-vuln PYSEC-*,号逐条取自真实 CI 输出(job 106215347173),不是猜的。.trivyignore.yaml(新)+docker-build.yml/docker-publish.yml:3 条 CVE 豁免,每条绑定package: transformers且versions: ["4.52.4"](不会放过别的版本),带expiration: 2026-12-31——到期即重新变红,不做永久静默。tests/test_dependency_consistency.py(新,8 条):把声明 / 锁集 / 豁免清单钉在一起。D1 锁集里每个 pin 必须满足 pyproject 声明(实际检查 ≥20 个包);D2 锁集必须仍是transformers==4.52.1+tokenizers==0.21.0且声明带<4.53;D3 豁免每条必须有expiration,且每个 CVE/PYSEC 号都要在分诊文档里出现。三条各配一条"去掉规则就会变红"的防空转断言。docs/SECURITY_DEPENDABOT_TRIAGE.md/docs/DOD.md:分诊表补 §1a 的 PYSEC↔CVE 真实映射、§2 的 A/B 证据与决策、并撤回两处我此前说过头的话(容器里根本没有 IndexTTS,"Docker 路径被下界弄坏"不成立;protobuf 上界未经证明,改标 unproven)。预期代价(不是回归,是换取门禁绿的定价)
按本声明装环境的人拿到的是 4.52.x,会带上 4.52.4 的 3 条已分诊 CVE。可达性判定:三条都需要加载不可信 tokenizer/模型权重才走得通,本服务不加载外部权重来源,故按已接受风险处理;复点条件写在分诊文档 §4。出路②(让 IndexTTS 侧适配 ≥4.53)需要上游放开精确 pin 或改 vendored 拷贝,那是另一条工程量。
验证
本机已跑:
ruff checkAll checks passed /ruff format --check360 files / mypy103 = 基线/check_pin_crossconflicts.pyexit 0 /check_integrity_manifest_sync.pyexit 0 /check_spec_refs.pynew=0 /sync_requirements.py可复现 requirements.txt / 新测试 8 passed / 全量 pytest 2086 passed, 35 skipped,覆盖率 52.17%。真机三引擎推理即上表 4.52.1 那一行。
不在本 PR 内
GitHub 上 20 条 Dependabot 告警的 dismissal(属所有者动作,逐条理由已在分诊文档 §1 备好);lock 的整体重算(B1,会连带验证 protobuf 上界那条未证明的推断)。