Node.js 三條發行線同步修補多個高風險漏洞

Node.js 專案於 2026 年 11 月 11 日推出安全更新,26.x、24.x 與 22.x 三條發行線分別發布 26.13.1、24.22.3 及 22.23.5 [1]。三個分支的最高嚴重程度同為高,多數問題集中在 HTTP/2 與 TLS 的記憶體管理,官方同時更新 llhttp、undici 與 sqlite 等依賴 [1]。

HTTP/2 成為重災區

多個高風險問題與 HTTP/2 有關。CVE-2026-123863 涉及工作階段拆除時的可達斷言:任何未認證客戶端只要令帶有 nghttp2 標頭緩衝的串流存活得比工作階段更久,便會在解構時觸發斷言並終止行程;官方指這是 CVE-2024-27983 的變種,早前修正只覆蓋仍被工作階段追蹤的串流 [1]。CVE-2026-123865 則是另一種資源耗盡:對端在連線關閉期間觸發協定錯誤,nghttp2 內部已終止工作階段,但 Node.js 未察覺,socket 停留在等待關閉狀態,記憶體與檔案描述符永久洩漏 [1]。

CVE-2026-123866 與 CVE-2026-123874 均屬釋放後使用(use-after-free)。前者在串流仍有背壓寫入時被重置,已釋放的回應緩衝仍被引用,可能把其他連線的記憶體寫回對端;後者則在應用使用 respondWithFile() 或 respondWithFD() 供應檔案時,讓客戶端於寫入排隊期間釋放串流物件,之後代碼經已釋放物件作虛擬呼叫 [1]。另有一個中等風險的 CVE-2026-123828,在 Http2Session.altsvc() 處理過長來源時造成單字節堆積緩衝區溢位 [1]。

TLS 與 HTTPS 同樣受影響

CVE-2026-123864 屬 HTTPS 的重入缺陷:TLSWrap::DoWrite() 在寫入零字節時直接呼叫內部清除函式,若該寫入由 HTTP 解析器主體回呼中的 JavaScript 觸發,便會在解析器仍處理主體時解密下一筆 TLS 記錄,重入 llhttp_execute() 並造成釋放後使用與越界讀取。伺服器繼而把已釋放或無關的堆積記憶體複製到回應之中,可能洩漏 TLS 私鑰 [1]。明文 node:http 不受影響 [1]。

CVE-2026-126051 則讓未認證攻擊者終止行程:TLS 伺服器若使用 SNICallback、OCSPRequest、newSession、resumeSession 等回呼或 server.addContext(),相關 OpenSSL 回呼會被延後執行,而延後代碼未處理 socket 在排程與執行之間被銷毀的情況,最終拋出未捕捉例外 [1]。CVE-2026-123872 是另一類問題:在按主機名稱套用不同客戶端憑證政策的伺服器上,客戶端可於 TLS 1.2 重新協商時單方面更改伺服器名稱,把原有認證帶到受保護的主機,繞過較嚴格的政策 [1]。

升級與檢查重點

三條發行線的修補均已隨新版釋出,官方列明受影響範圍涵蓋 22.x、24.x 與 26.x 的使用者;已終止支援的版本同樣受影響,官方建議盡快轉用受支援版本 [1]。另有一個低風險的 CVE-2026-106071 涉及權限模型的檔案系統授權過寬:當萬用字元授權位於權限樹根層,較短路徑可能在 radix 樹比對時被誤判為符合,例如以 /etc/passwd.* 授權讀取時,亦同時允許讀取 /etc/passwd [1]。

實務上,凡以 Node.js 直接面向互聯網提供 HTTP/2 或 TLS 服務的部署,均應優先升級;使用 respondWithFile() 供應靜態檔案的應用,以及啟用客戶端憑證分主機政策的服務,屬高風險組合 [1]。升級後亦應檢查依賴是否同步更新,尤其是自行編譯或釘死依賴版本的專案 [1]。

參考資料

[1] Wednesday, November 11, 2026 Security Releases(2026-11-11)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*