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 程序在運作。建議在升級的同時,保留升級前的日誌與程序行為紀錄,並檢視是否有對外部不可信來源的壓縮資料處理,以便日後需要時能夠回溯。


