Node.js 十月安全性更新:修補 10 個漏洞,含 Brotli 解碼器遠端程式碼執行漏洞 CVE-2026-111497

資安研究

2026-11-04 by 高田鑑識

本文整理自 Checkmarx Zero 研究團隊發表的〈After PHP and eMudhra, Here Comes Node.js〉,說明 Node.js 於 10 月 21 日發佈的安全性更新內容與建議作法。

重點摘要

  • 更新內容:Node.js 於 10 月 21 日發佈安全性更新,修補 22.x、24.x、26.x 三條版本線上的 10 個漏洞,其中 4 個為 High、3 個為 Medium、3 個為 Low(嚴重程度為 Node.js 評定,尚未經美國國家弱點資料庫 NVD 等機構審查)。
  • 最需優先處理:CVE-2026-111497,Node.js 內建 Brotli 解碼器的越界寫入漏洞,可能導致遠端程式碼執行。
  • 最快的處置方式:無論是哪一個漏洞,都直接升級到修補後的版本。
  • 其他修正:同一次更新也升級了多個有漏洞的第三方相依套件,包含處理 eMudhra 憑證機構(CA)遭入侵事件的修正。
Node.js 版本線 請升級至
22.x 22.23.4
24.x 24.22.1
26.x 26.12.1

舊版本已不再維護,仍在使用這些版本的團隊,建議遷移到仍受支援的版本線。

背景:同一天的三起資安事件

原文提到,10 月 21 日當天,php2shell 議題主導了討論,吸引全球開發者與資安團隊的關注;同時 eMudhra 中繼 CA 憑證事件也引發警覺。隨後 Node.js 發佈了這次包含 10 個漏洞修正的安全性更新,其中就有可能導致 RCE 的重大漏洞。

最需優先處理:CVE-2026-111497(Brotli 解碼器)

Node.js 將 CVE-2026-111497 描述為 Brotli 解碼器中的越界寫入(out-of-bounds write),可能導致遠端程式碼執行,讓攻擊者取得與受影響 node 程序相同的權限。問題出在 Node.js 內附的 Brotli(一種壓縮演算法)實作,而 Brotli 可透過 node:zlib 模組或內建的 fetch() 使用。

哪些應用程式可能受影響:

  • 使用 node:zlib 模組解壓縮使用者可控制資料的應用程式。
  • 透過 fetch() 取得不可信的 Brotli 資料,不論來自請求本文或回應內容的應用程式。

此漏洞由 mcollina 回報、aduh95 修正。

嚴重程度評估:Node.js 將它評為 High,但 Checkmarx 依自身的 CVSS 評估,考量其高度影響與特定觸發條件,將它歸類為 Critical。作者提醒,實際風險會依各組織的使用方式而有高低,建議在做最終風險判斷前,先進行 CVSS 環境評分(Environmental scoring)或類似的優先順序評估。另外,作者對其中兩個漏洞的嚴重程度評估,也與 Node.js 的評定不同。

其他三個 High 等級漏洞

  • CVE-2026-105482:dns.resolve() 會截斷含 NUL 字元的名稱,讓「應用程式驗證的名稱」與「實際被解析的名稱」之間出現落差。由 hasanfleyah 回報、jasnell 修正。
  • CVE-2026-105483:TLS 主機名稱驗證可能遭繞過,潛在影響可能相當嚴重。由 hasanfleyah 回報、jasnell 修正。
  • CVE-2026-106069:修正後的 tls.checkServerIdentity() 會拒絕那些經 IDNA 正規化後才變成 IP 位址的主機。修正前,Node 是拿正規化後的位址去比對憑證,但作業系統的解析器可能把原始字串解讀成另一個位址。由 anagnorisis2peripeteia 回報、mcollina 修正。

完整漏洞清單

原文建議,不論嚴重程度為何,這 10 個漏洞都應一併處理,因為它們都能透過同樣的升級路徑解決。

CVE 編號 Node.js 評定嚴重程度 問題說明
CVE-2026-111497 High(Checkmarx 評估為 Critical) Brotli 解碼器越界寫入,可能導致遠端程式碼執行(RCE)
CVE-2026-105482 High dns.resolve() 會截斷含 NUL 字元的名稱,導致應用程式驗證的內容與實際解析的內容不一致
CVE-2026-105483 High TLS 主機名稱驗證可能被繞過
CVE-2026-106069 High tls.checkServerIdentity() 對經 IDNA 正規化後才變成 IP 位址的主機處理不當
CVE-2026-105481 Medium HTTP keep-alive 連線可能接受前一個請求的回應
CVE-2026-106072 Medium 非標準寫法的 IPv4 主機名稱,憑證驗證不當
CVE-2026-106074 Medium 啟動快照中的熵快取導致隨機值可預測
CVE-2026-106070 Low ZIP 解析驗證失敗後,仍可能暴露攻擊者控制的位元組
CVE-2026-106071 Low 萬用字元比對導致檔案系統權限過度授予
CVE-2026-106073 Low 可透過 fs.realpathSync() 繞過權限模型(Permission Model)

原文對其中 6 個 Medium 與 Low 的漏洞沒有進一步說明,僅列出簡要說明與回報者;它們影響同樣的版本線,建議一併升級。

建議處置

1. 確認目前版本

node --version

2. 升級到對應版本線的修補版本(22.23.4、24.22.1 或 26.12.1)。容器化部署的團隊,請同步更新基礎映像檔(base image)並重新建置、重新部署;CI/CD 與開發機上的 Node.js 也要一併升級。

3. 檢視程式碼中的曝險點:搜尋是否使用 zlib.brotliDecompress、zlib.createBrotliDecompress 或對不可信來源呼叫 fetch(),確認是否會處理使用者可控制的壓縮資料,作為優先順序判斷的依據。

grep -rnE "brotliDecompress|createBrotliDecompress|BrotliDecompress" --include=*.js --include=*.ts --include=*.mjs --exclude-dir=node_modules .

4. 若仍在使用已停止維護的版本,應盡快規劃遷移到受支援的版本線,這些版本不會再收到此次修正。

結論:嚴重程度分數值得二次檢視

CVE-2026-111497 說明了為什麼嚴重程度評分需要再看一眼:Node.js 評為 High,Checkmarx 的 CVSS 評估卻是 Critical——攻擊者若能觸發越界寫入,可能以與你的 Node.js 程序相同的權限執行程式碼。真正重要的是對自身組織的影響,凡是會解壓縮不可信 Brotli 資料的應用程式都可能暴露。不必等待嚴重程度的爭論塵埃落定,直接升級到 22.23.4、24.22.1 或 26.12.1。

高田觀點

對事件調查而言,runtime 本身的漏洞比應用程式漏洞更難被察覺:入侵後行為看起來就是正常的 node 程序在運作。建議在升級的同時,保留升級前的日誌與程序行為紀錄,並檢視是否有對外部不可信來源的壓縮資料處理,以便日後需要時能夠回溯。