fix(deps): nanoid 顶到 3.3.x 补丁线,清掉 GHSA-2v37-7h3g-55p8 (#6506) - #6538
Merged
Conversation
OSV 门在锁文件上变红,因此对每一个 open PR 都生效,与各 PR 的改动内容无关。 本地以 osv-scanner v2.3.8(与 CI action 同版本)、同样的 `--lockfile=pnpm-lock.yaml` 参数复现:1387 个包,1 条 High(8.2)—— nanoid 3.3.16 命中 GHSA-2v37-7h3g-55p8 / CVE-2026-67213(自定义字母表在 size 为零时无限循环, 即拒绝服务),退出码 1。 公告带**两条**受影响区间:introduced:0 → fixed:3.3.17,以及 introduced:4.0.0 → fixed:5.1.6。此处只有第一条是活的:3.3.16 唯一由 postcss@8.5.25 间接引入(全锁文件仅一条 `nanoid:` 边),而四个 driver 直接声明的 nanoid ^6.0.0 高于第二条的修复线,本就不受影响。 上界按 AGENTS.md 与本块头部规则落在 target 之上的 **major 边界**(4.0.0), ⛔ 不写成 `<3.3.17` —— 那个形状会在 3.3.17 自己出公告那天当场失配 (undici 7.28.0 / brace-expansion 5.0.8 的活体标本,#4961 / #5032)。 `<4.0.0` 同时把 6.x 挡在选择器之外,正是它该待的地方。 ^3.3.17 落在 postcss 自己声明的 ^3.3.16 区间内,所以这是往补丁线上的一次 dedupe,而不是把 postcss 顶过它支持的范围。 解析版本位移实测:1387 个 packages 键 + 1387 个 snapshots 键 + 746 条 importer 边,逐一比对,**只有 nanoid 3.3.16 → 3.3.18 一处**(^3.3.17 在 3.x 内浮到最新,即 npm 的 legacy dist-tag),其余零位移。改后复跑同一扫描: No issues found,退出码 0,且 osv-scanner.toml 一字未动(仍是零豁免)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BDmDsu2575gDxeMCxXhDE3
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
hotlong
marked this pull request as ready for review
August 8, 2026 04:03
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.
Fixes #6506
OSV 门红在锁文件上,所以它对每一个 open PR 都生效,与各 PR 的改动内容无关。处置照 #6427(dompurify)的先例:在
pnpm-workspace.yaml加一条 override 把 nanoid 顶到补丁线,⛔ 不用osv-scanner.toml加豁免消红(该文件一字未动,仍是零豁免)。一、公告复核(不采信单据里的数字,自己重测)
本地用 osv-scanner v2.3.8 —— 与
.github/workflows/validate-deps.yml里 pin 的 action 同一版本 —— 加同样的--lockfile=pnpm-lock.yaml参数,在当前origin/main(61478b9)上复现:包数(1387)、CVSS(8.2)、版本、修复版本、退出码与单据里的 CI 读数逐项一致,且
osv-scanner.toml的过滤器确实被加载而没有豁免这条。前提成立。公告本体(取自 OSV 官方数据集):
GHSA-2v37-7h3g-55p8/CVE-2026-67213,nanoid: custom generators can loop indefinitely when size is zero —— 自定义字母表生成器在size为零时无限循环,即攻击者可影响 size 时的拒绝服务。它带两条受影响区间,这一点值得写明:
03.3.174.0.05.1.6此处只有第一条是活的:
postcss@8.5.25间接引入 —— 全锁文件只有一条nanoid:边(postcss@8.5.25的 dependencies),没有第二个消费者;nanoid: ^6.0.0(driver-mongodb / driver-sql / driver-sqlite-wasm / driver-turso)高于第二条区间的修复线 5.1.6,本就不受影响 —— 这也正是扫描只点名 3.3.16、没点名 6.0.0 的原因。二、加的 override 行,以及上界为什么是这个形状
introduced: 0,即包的地板,所以只需要写上界 —— 与 fix(deps): dompurify 顶到 3.4.13,清掉 GHSA-55q2-fjhq-7xh7 (#6407) #6427 的dompurify@<4.0.0同一情形、同一写法。Validate Package Dependencies在 main 上全仓变红:nanoid 3.3.16 命中 GHSA-2v37-7h3g-55p8(有 fix,缺 override) #6506 正文那行示意写法(带空 floor 的nanoid@>= <4.0.0)不可照抄,立单人也已注明「floor 请按通告里的 affected range 填」—— 按通告,floor 就是包的地板,因此整个下界省略。<3.3.17。这是 AGENTS.md 与本块头部规则的硬条款:把排他上界写成 target 自己的版本,会在 3.3.17 自己出公告那天当场失配 ——undici@>=7.23.0 <7.28.0在 7.28.0 被点名那天就是这么死的(ci(deps): pin brace-expansion to 5.0.9 for GHSA-rgw5-rvv9-x895 (#4945) #4961 /Validate Package Dependenciesis red onmain— 8 FIXABLE OSV advisories (undici / hono / fast-uri), so every PR inherits a red required-ish check #5032),brace-expansion 5.0.8 同理。上界放在 major 边界之后,以后只有 target 会动。<4.0.0顺带把 6.x 挡在选择器之外,这是有意的:6.0.0 不受影响,若上界写到包的天花板会把整个 major 拖回 3.x 线。^3.3.17落在 postcss 自己声明的^3.3.16区间内,所以这是往补丁线上的一次 dedupe,而不是把 postcss 顶过它支持的范围。check:override-consistency的两份普查是这个形状的机器佐证:自失效选择器普查列出 30 条里的 14 条,nanoid@<4.0.0不在其中;零消费者普查列出 4 条,nanoid@<4.0.0也不在其中(它有 postcss 这个真实消费者)。三、解析版本位移 —— 实测,并写明比较集大小
pnpm-lock.yaml,逐键比对三个互相独立的面:packages键(解析出的name@version)nanoid@3.3.16→nanoid@3.3.18snapshots键(含 peer 上下文的解析实例)即 nanoid 之外零位移,合计 3520 个受比对的键/边。比较集非空这一点本身也可交叉验证:
packages的 1387 与 osv-scanner 自己报的found 1387 packages相同,说明比对的正是扫描器扫的那个集合。^3.3.17在 3.x 内浮到最新,落到 3.3.18(npm 的legacydist-tag),高于修复线,同样清掉公告。nanoid@6.0.0原样保留,已单独复核。锁文件真实 diff 只有 9 行(5 增 4 删):overrides 块加一行、
packages条目与 integrity、snapshots键、以及 postcss 的那条边。四、改后复跑扫描(⛔ 不是靠豁免)
同一个 v2.3.8 二进制、同一份漏洞库、同样的
--lockfile=pnpm-lock.yaml:git status --porcelain osv-scanner.toml无输出 —— 该文件一字未动,check-osv-exemptions.mjs仍报「零豁免(the intended steady state)」。这正是osv-scanner.toml头部与 #6506 都引到的那条规矩:advisory 有 fixed version 时走「取修复」,不进豁免账本。五、正反向验证(先声明,再运行)
声明写在任何一次扫描与任何一次改锁之前:
No issues found,EXIT=0,toml 未动四项全部与声明一致,无需改写声明。
六、锁文件独占面复核
git diff --name-only origin/main...origin/[分支] -- pnpm-lock.yaml pnpm-workspace.yaml:18 个分支全部无输出,含 release PR #6208(
changeset-release/main)。无竞争,可推。七、门禁
全部在
git add -A之后跑:pnpm install --frozen-lockfilegit status --porcelain只剩我这两个已暂存改动,无未暂存漂移 —— 锁文件与 workspace 文件自洽pnpm check:override-consistencypnpm lintpnpm check:nul-bytesnode scripts/check-osv-exemptions.mjs --self-test+ 本体node scripts/check-changeset-fixed.mjsgrep -naP无命中八、changeset
不加 changeset,改用
skip-changeset标签 —— 与 #6427 完全同形:同样两个文件(pnpm-workspace.yaml+pnpm-lock.yaml)、同样 9 行锁文件 diff、同样是纯间接依赖,没有任何可发布包的声明区间发生变化(importer 边位移实测为 0),因此对下游安装没有可发布的行为改变。#6427 落的标签是dependencies/size/s/skip-changeset,无 changeset。九、#6506 那条 postcss 提醒的实测(立单人自注「没有实测」)
#6506 提醒:「
overrides里已有'postcss@<9.0.0': '^8.5.10',而 postcss 8.5.25 已经在这条 pin 之上,所以抬 postcss 未必能解决,直接 pin nanoid 更直接」,并注明该点未经实测。既然要求自测,结论如实写在这里:处置结论对,但给出的理由只对一半。latestdist-tag 亦是它),而 8.5.26 声明的正是nanoid: ^3.3.17(8.5.22–8.5.25 都还是^3.3.16)。所以抬 postcss 确实也能清掉这条公告 —— 「未必能解决」这半句不成立,不宜作为下一位的依据。^8.5.10,pnpm 不会主动重解一个已锁定且仍满足区间的版本。^3.3.17正被现在解析出的 3.3.18 满足。传入路径与 #6506 的记录一致并已独立复核:
postcss@8.5.25→nanoid: 3.3.16,改前在pnpm-lock.yaml:14408(改后该边成为nanoid: 3.3.18,行号 14409);改前overrides里确实没有任何 nanoid 条目。