Skip to content

[tech-debt] Security Audit 闸门长红:multer 需 overrides(升级修不掉)+ lockfile 混源让本地 audit 成为坏掉的量具 + Trivy 未产出 sarif #338

Description

@jhfnetboy

登记项,B6 冻结期不动工。 解冻条件:DSR 发布 B6 evidence frozen。
发现于 dependabot #333–#337 的 review(pr-daemon-60),本 issue 收敛其中不属于任何一个 PR 的仓库级欠账。

1. npm audit 的 4 个 high:单一根因 multer,但升级修不掉

Security Audit 闸门当前为红,high=4 critical=0。四条 advisory 的根因是同一个生产依赖 multer@2.2.0;三个 @nestjs/* 条目只是经 @nestjs/platform-express 的传递效应,不是三个独立问题。

GHSA-wc9g-mqfw-jrwm  crafted multipart field names          → DoS
GHSA-qfvm-cv95-jqjf  aborted uploads 的 file descriptor 泄漏 → DoS
GHSA-qvfw-j98x-7q72  async fileFilter 竞态                   → 绕过文件大小限制
GHSA-535w-7cp7-47q4  field name 中超大数组下标                → DoS

为什么不是紧急项(评估于 2026-09-09,用于判断是否够 B6 冻结的安全例外「可外部触发 且 不可逆/涉资金密钥」):

  • 不可逆?否 —— 全为可用性影响,无状态损坏。
  • 涉资金/密钥?否 —— 不触及签名路径,不触及 node_state.json。
  • 可外部触发?在本服务中否 —— 全部 32 条 HTTP 路由中,FileInterceptor / FilesInterceptor / AnyFilesInterceptor / @UploadedFile / multipart 命中数均为 0,main.ts 亦无上传中间件。multer 由 @nestjs/platform-express 传递引入,但从未挂载到任何路由;四条 advisory 均要求攻击者发送一个 multer 会实际解析的 multipart 请求。

为什么 npm audit fix 解决不了(接手前请先看这段,可省一轮试错):

multer@latest                    = 2.3.0     ← 修复版存在
@nestjs/platform-express@latest  = 12.0.1    ← 本仓已是最新
  └─ dependencies.multer         = "2.2.0"   ← 仍钉在有洞版本

上游未跟进,靠版本升级无解。可行路径是 package.json 加 overrides 强推 multer@2.3.0,并验证 platform-express 在 2.3.0 上无行为回归。这是需要判断的改动,不是 dependabot 能代劳的。

2. lockfile 混源,且它让 npm audit 在本地成为坏掉的量具

base lockfile 混用两个 registry:16 条 registry.npmmirror.com vs 659 条 registry.npmjs.org。

比"不整洁"严重的是:本机默认 registry 即 npmmirror,而它没有实现 audit 接口——

$ npm audit
npm warn audit 404 Not Found - POST https://registry.npmmirror.com/-/npm/v1/security/audits/quick
  - [NOT_IMPLEMENTED] /-/npm/v1/security/* not implemented yet
{ error: '[NOT_IMPLEMENTED] /-/npm/v1/security/* not implemented yet' }
npm error audit endpoint returned an error

必须 npm audit --registry=https://registry.npmjs.org 才能拿到真实报告。

这把混源从整洁问题变成量具问题:本地跑 audit 会得到一个长得像"没发现问题"的错误输出,而**「量具坏了」与「没有发现」在输出上无法区分**。建议与第 1 项并入同一个 PR 收敛。

(dependabot #334 已顺手把 prettier-plugin-solidity / @nomicfoundation/slang / @bytecodealliance/preview2-shim 三条换回 npmjs——方向正确,但不应依赖"碰到哪条换哪条"。)

3. CI:Trivy 步骤未产出 sarif 文件

同一 job 内的独立失败,先于上述 PR 即存在:

Path does not exist: trivy-results.sarif

与依赖无关,属 workflow 缺陷。

验收标准

  • npm audit --registry=https://registry.npmjs.org → high=0 critical=0(经 overrides,且 platform-express 回归已验)
  • lockfile 中 registry.npmmirror.com 计数为 0
  • 不带 --registry 直接 npm audit 能返回真实报告,而非 NOT_IMPLEMENTED
  • Security Audit job 全绿,含 Trivy 步骤真实产出 trivy-results.sarif

关联

dependabot #333 #334 #335 #336 #337(均已 approve,因 B6 冻结暂不合并;五者 lockfile 同基于 blob 4c6d8bb 互相冲突,谁先合,其余四个 rebase 后的 lockfile 需重新 review)。

Activity

  1. jhfnetboy commented on Sep 27, 2026

    @jhfnetboy
    MemberAuthor

    更正(2026-09-27):本 issue 第 1 节的前提已失效,修复其实是一行

    我 2026-09-09 写的「上游未跟进,靠版本升级无解,只能加 overrides 强推」是错的,现在重新导出的读数如下。功劳归 pr-daemon,它在 PR #364 的 review 里追到了真正的原因。

    ① 上游已经跟进了(与原文相反):

    multer@latest                            = 2.4.0
    @nestjs/platform-express@12.0.3 → multer = 2.4.0   ← 已经不是 2.2.0
    npm audit fixAvailable                   = true(两项都是)
    

    高危数也从 4 降到 2(@nestjs/core 与 @nestjs/swagger 两条随区间解析退出,根因仍是同一个 multer)。

    ② 真正的阻塞物是本仓自己的一行 pin,而且它是为修安全加的:package.json 里早就有 overrides 块,其中

    "multer": "2.2.0"

    它把 multer 强行钉回有洞版本,不管 platform-express 要求什么。所以 #364 单独合并并不会清掉审计债 —— 这也是 pr-daemon 给 #364 打 CHANGES_REQUESTED 的正确理由。

    该 pin 来自 78495bf,commit message 是 chore(security): clear all high/critical npm audit findings (Security Audit CI) (#135)。当时 2.2.0 确实是安全版;之后 advisory 的范围扩展到 <=2.2.0,而这行 pin 把它永久锚在那里。一个为消除安全告警而写的固定值,如今是唯一让该告警无法消除的东西,且它不报错——只是安静地答错。这与本 issue 第 2 节的「量具问题」是同一个病的两种形态。

    ③ 因此正确的修复是一行,不是原文写的「加 overrides + 验回归」:

    -  "multer": "2.2.0",
    +  "multer": "2.4.0",

    配合 #364(platform-express 12.0.1→12.0.3)一起进,然后 npm install 重生成 lockfile。pr-daemon 已在一份临时副本里验过该改动可清掉告警(未提交)。

    紧急度不变,仍不构成冻结例外:四条 advisory 依旧全是 DoS / 上传限额绕过 —— 不可逆否、涉资金密钥否;且本仓 32 条 HTTP 路由中 multer 相关命中仍为 0(无任何 multipart 入口、main.ts 无上传中间件),不可外部触发。所以继续登记不动工,等合并边界裁定(已在 CC-122 请 repo:dsr 裁)。

    ④ 顺带一条需要一并审的:overrides 块里还有 7 个同批 pin(handlebars lodash path-to-regexp form-data fast-uri flatted picomatch),全部来自同一个 78495bf。npm audit 当前没有标它们,所以没有已知漏洞;但它们与 multer 是同一种结构——每一个都把依赖永久封顶在一个「当时正确」的版本上,且失效时不会报错。解冻后收这笔账时,建议整块重新评估,而不是只改 multer 那一行;并考虑给每条 pin 写上「为什么钉」和「何时可以摘」,否则下一轮还会重复。

    验收标准更新

    • 加 overrides 强推 multer → 改为:把已有的 overrides.multer 从 2.2.0 改到 2.4.0,与 chore(deps): bump @nestjs/platform-express from 12.0.1 to 12.0.3 #364 同时进
    • npm audit --registry=https://registry.npmjs.org → high=0 critical=0
    • 其余 7 条 overrides pin 逐条复核(有无更新版本、能否摘除、为何钉)
    • lockfile 中 registry.npmmirror.com 计数为 0
    • 不带 --registry 直接 npm audit 能返回真实报告
    • Security Audit job 全绿,含 Trivy 真实产出 trivy-results.sarif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions