记录Node.js安全漏洞及其内置Brotli解码器问题

背景:

前端环境所使用的 Node.js 版本存在安全问题。

请协助排查 node.js 安全漏洞 de1 影响范围,具体排查信息如下:

一、CVE-2026-111497

受影响版本中,Node.js 存在安全漏洞 ,该漏洞源于 Node.js 内置 的 Brotli 解码器 存在 缓冲区溢出 ,攻击者可通过构造恶意 Brotli 压缩流 ,触发 Node.js 内置 Brotli 解码器 的 越界写入 。

影响版本:

Node.js:

22.0.0 <= version < 22.23.4

24.0.0 <= version < 24.22.1

26.0.0 <= version < 26.12.1

Google Brotli 库:

1.0.3 <= version < 1.0.10

1.1.0 <= version < 1.1.1

1.2.0 <= version < 1.2.1

二、CVE-2026-106069

受影响版本中,Node.js 存在安全漏洞,攻击者可构造包含前导零的非规范 IPv4 地址 (如0127.0.0.1),利用 Node.js 对主机名规范化规则 与 操作系统解析器 不一致的缺陷,绕过 TLS 证书校验 ,伪装为合法服务器实施中间人攻击 。

影响版本:

22.0.0 <= version < 22.23.4

24.0.0 <= version < 24.22.1

26.0.0 <= version < 26.12.1

三、CVE-2026-105483

受影响版本中,Node.js 存在安全漏洞 ,攻击者可通过构造非 ASCII 字符 的主机名绕过TLS ,利用包含通配符的证书 在非法 IP 端点进行中间人攻击 和 数据窃取 。

影响版本:

Node.js:

24.0.0 <= version < 24.22.1

26.0.0 <= version < 26.12.1

四、CVE-2026-105482

受影响版本中,Node.js 存在安全漏洞 ,该漏洞源于 Node.js DNS 模块的边界处理缺陷 ,攻击者可构造包含 NULL 字节的恶意域名 ,利用 Node.js DNS 解析模块 的缺陷,绕过域名白名单验证机制。

影响版本:

Node.js:

22.0.0 <= version < 22.23.4

24.0.0 <= version < 24.22.1

26.0.0 <= version < 26.12.1


@所有人 排查下

当前项目 node 使用的 22.14.0 版本

验证一下能否复现问题


这个有用到没

有用到:node 22.14.0 内置的 Brotli 版本是 1.1.0


询问 Gemini:

这个问题前端能复现吗?然后我该如何自测我项目里使用的 node 版本有没有其中的问题呢?以及最后应该如何解决呢?假如要升级node版本,对已经上线的版本包重新打包替换会有影响啥的吗?帮我看一下,综合整理解决方案。


针对您提到的四个 Node.js 安全漏洞(CVE-2026-111497、CVE-2026-106069、CVE-2026-105483、CVE-2026-105482),结合您提供的截图和当前使用的 Node.js 版本(如截图中提到的 22.14.0,落在了 22.0.0 <= version < 22.23.4 的受影响范围内),以下为您进行全面的排查解答与综合解决方案:

一、 这个问题前端能复现吗?

结论:纯前端代码(运行在浏览器中的 SPA、Vue / React 页面)通常无法直接在浏览器沙箱环境中复现 或 触发这些底层漏洞,但如果在特定的工程化 或 服务端渲染(SSR)场景下,则存在间接风险。

  • 为什么浏览器端难以直接复现:

    • 这些漏洞(如 Brotli 缓冲区溢出、IPv4 前导零证书校验绕过、非 ASCII 主机名 TLS 绕过、DNS 模块 NULL 字节注入)全部存在于 Node.js 运行时底层(Runtime) 的 C++ 模块 、网络模块(net / tls / dns)或 内置解压模块中。浏览器有自己独立的网络栈 和 解析引擎,不直接执行 Node.js 的底层代码。
  • 在什么情况下会受影响 / 可被利用:

    1. 服务端渲染(SSR)与 API 网关: 如果您的项目使用了 Node.js 做 SSR(如 Nuxt.js、Next.js)或 充当后端 BFF 网关,当它在 服务端 去 请求外部接口、解析恶意的 DNS 记录、或者 解压恶意的 Brotli 响应流时,就会触发漏洞。

    2. 前端工程化与本地构建 / 打包工具: 如果本地开发环境 或 CI / CD 构建流水线使用的 Node.js 版本处于受影响区间,在执行某些依赖下载 、网络请求 或 本地构建插件 时,如果遭遇恶意依赖投毒 或 恶意中间人攻击 ,可能会在 打包 / 构建阶段被攻击。

二、 如何自测项目里使用的 Node 版本有没有问题?

您可以采用以下几种方法快速自测:

1. 检查当前环境的 Node.js 版本

在终端(Terminal)中运行以下命令查看当前使用的 Node 版本:

bash 复制代码
node -v
  • 对照排查:

    • 如果输出在 22.0.0 至 22.23.4 之间(例如截图中的 v22.14.0),则命中 CVE-2026-111497 、CVE-2026-106069 和 CVE-2026-105482 的 受影响范围。

    • 如果输出在 24.0.0 至 24.22.1 或 26.0.0 至 26.12.1 之间,则四个漏洞均受影响。

2. 在项目工程中锁定与检查版本

为了防止团队成员本地环境 或 CI 编译环境版本不一致,建议在 package.json 中明确指定引擎版本:

java 复制代码
"engines": {
  "node": ">=22.23.4"
}

同时,可以通过编写简单的脚本 或 直接在 Node 交互式环境(REPL)中验证内置库的表现(例如检查 Brotli 或 解析行为)。

三、 发现问题后该如何解决?

1. 升级 Node.js 版本(首选、最根本的修复方案)

官方已经针对这些漏洞发布了修复版本。您需要将 Node.js 升级到安全版本以上:

  • Node.js 22 系列 :升级至 >= 22.23.4

  • Node.js 24 系列 :升级至 >= 24.22.1

  • Node.js 26 系列 :升级至 >= 26.12.1

升级方式推荐:

  • 使用 NVM (Node Version Manager) 进行版本管理 和 切换:

    bash 复制代码
    nvm install 22.23.4
    nvm use 22.23.4
2. 临时应急缓解措施(如果暂时无法升级 Node)
  • 针对 Brotli 漏洞(CVE-2026-111497): 在应用层限制 或 禁用对不受信任来源的 Brotli 压缩流解压,或者在网关层 进行流量过滤。

  • 针对网络和 DNS 漏洞(CVE-2026-106069 / CVE-2026-105482): 严格校验输入的主机名格式 ,过滤包含前导零的 IPv4 地址 和 带有 NULL 字节的恶意域名。

四、 升级 Node 版本后,对已上线版本包重新打包替换会有影响吗?

对于 前端 / BFF 项目,升级 Node.js 版本并重新打包上线,通常需要注意以下几点,评估潜在影响:

  1. V8 引擎与语法兼容性:

    • 如果跨越了较大的 Node 版本(例如从 Node 16 / 18 跨到 Node 22),V8 引擎升级可能会带来某些底层 JavaScript 语法 、内置 API 或 属性特性 的微小变化。但如果是 同主版本内的小版本升级 (例如从 22.14.0 升级到 22.23.4),API 兼容性极高,一般 不会导致语法报错 或 代码不兼容。
  2. 原生依赖(Native Modules)编译:

    • 项目中如果包含依赖 C++ 插件的 npm 包(如 node-sass、bcrypt、某些 canvas 库等),升级 Node 版本后,它们的 ABI(应用程序二进制接口)版本可能会发生变化。

    • 建议: 在升级 Node 版本后,务必 删除 node_modules 和 package-lock.json(或 pnpm-lock.yaml),然后重新执行安装 和 打包:

      bash 复制代码
      rm -rf node_modules package-lock.json
      npm install
      npm run build
  3. 流水线与生产环境一致性:

    • 确保 CI / CD 构建服务器 (如 Jenkins、GitLab CI、GitHub Actions、Docker 镜像基础镜像)中的 Node.js 运行环境也同步升级到了安全版本。如果本地升级了但 CI 镜像没升级,构建出来的产物仍然可能带有隐患 或 由于版本差异 导致构建失败。
  4. 回归测试建议:

    • 重新打包替换上线前,建议在测试环境 (Staging)对核心业务流程 进行冒烟测试 ,重点关注:页面路由 跳转、网络请求(API 代理 与 数据交互)、文件上传下载、以及依赖构建的稳定性。
相关推荐
tommyjiatong1 小时前
资安底座连环雷:从 PHP2Shell 到 Node2Shell
node.js·php
SEO_juper5 小时前
Bash 交叉验证 robots.txt 和 sitemap:两个文件自相矛盾,页面永远收录不了
开发语言·python·node.js·json·bash
SEO_juper6 小时前
Go 站点地图生成器:从首页爬全站,一键生成 sitemap.xml
xml·开发语言·人工智能·golang·node.js·seo·外贸独立站
Moshow郑锴18 小时前
Ansible 批量部署 Node.js 服务:ZIP 直解与共享目录分发两种方案对比
node.js·ansible
少年的范儿1 天前
Windows 安装 Node.js 教程:nvm 版本管理 + pnpm 安装配置
windows·npm·node.js
peach1 天前
同样是装依赖,为什么 npm 长成 node_modules,Maven 长成 .m2
npm·node.js·maven
FungLeo1 天前
成为全栈·Go 后端篇·重写之前先锁基线:契约、Node 版本与行为清单
golang·node.js·go·openapi·契约测试·成为全栈
FungLeo2 天前
成为全栈·Go 后端篇·契约一致性与差分测试:两套实现如何互相校验
golang·node.js·go·合约测试·差分测试·成为全栈·api兼容
TomEval2 天前
【测AI】第20篇:大模型安全测试 —— 越狱攻击与防护
人工智能·python·功能测试·ai·aigc·测试用例·安全性测试