Node2Shell 來了:Node.js Brotli 解碼器藏遠端執行漏洞 CVE-2026-111497,概念驗證已公開
Node.js 在 10 月 21 日緊急修補 10 個漏洞,其中 Brotli 解碼器的越界寫入(CVE-2026-111497)可能導致遠端程式碼執行。研究員已在 10 月 22 日公開概念驗證,目前尚無在野利用紀錄。
PHP2Shell 的煙硝還沒散,Node.js 也跟著拉警報。Node.js 專案在 10 月 21 日推出 10 月安全更新,一口氣修掉 10 個漏洞,其中 4 個被評為高嚴重性(High),而最受矚目的就是藏在 Brotli 解碼器裡的越界寫入漏洞 CVE-2026-111497——研究圈給它取了個名字:「Node2Shell」。
漏洞藏在哪裡
Brotli 是 Google 開發的壓縮函式庫,Node.js 自己內建了一份。當程式用 node:zlib 解壓縮資料,或用內建 fetch() 收到以 Brotli 壓縮的回應時,解碼器就會啟動。攻擊者只要餵給它精心打造的惡意壓縮資料,就能誘使解碼器把資料寫到記憶體緩衝區之外——這類越界寫入(out-of-bounds write)是通往當機與程式碼執行的經典路徑。Node.js 官方把它的影響定調為「可能允許遠端程式碼執行」。
修補程式其實來自上游 Brotli 專案今年 2 月的一筆提交(0ed4268a),Node.js 把它挑回來用;同樣的修正也包含在 Brotli 1.2.1、1.1.1 與 1.0.10 版。換句話說,凡是內建 Brotli 的軟體都該檢查一次。
誰最危險
不是每台 Node.js 伺服器都同等暴露。真正該優先處理的,是會解壓縮別人控制的 Brotli 資料的應用:
- 接收請求內文:Express 5 搭配 body-parser 2.x(例如
express.json()、express.raw())時,會自動解壓縮 Brotli 請求內文。 - 對外呼叫:內建
fetch()會自動解 Brotli 回應,打向惡意或被入侵的伺服器就可能中招。 - 直接呼叫:把不可信資料丟進
node:zlib的 Brotli 函式。
只壓縮自己回應的應用不會觸發這條路徑,但同一批更新還修了兩個 TLS 憑證主機名驗證繞過(CVE-2026-106069、CVE-2026-105483)和 dns.resolve 的 NUL 字元截斷(CVE-2026-105482),所以不管有沒有碰 Brotli,都建議升上去。
概念驗證已經出現
10 月 22 日,第一個概念驗證公開。研究員回報,針對未經修改的 Node.js 24.22.0(Linux arm64 官方映像)已能達成程式碼執行,只是成功率不是百分之百;升級到 24.22.1 之後,同樣的輸入直接被拒絕。截至 10 月 22 日,The Hacker News 引述的消息是尚無在野利用紀錄,但公開 PoC 的存在讓「先 patch 再說」成為唯一理性的選項。
修正版本是 22.23.4、24.22.1(目前的 LTS 線)與 26.12.1。這批更新還順手升級了內建元件:c-ares、CA 憑證庫(因為 eMudhra 中繼 CA 遭入侵)、Undici,以及 24 與 22 線的 OpenSSL。
實務提醒:裝了新版不等於就修好了——執行中的行程還在跑舊二進位,服務一定要重啟,容器映像也要重建重部署。先升級、再重啟、最後確認服務回報的版本號。
資料來源
- Aikido Security〈Node2Shell: Node.js Brotli vulnerability allows remote code execution (CVE-2026-111497)〉
- Node.js 官方 2026 年 10 月安全更新公告