Brotli 解碼器記憶體損壞:
Node.js RCE 只是冰山一角
為什麼現在很紅:一個壓縮格式的解碼器漏洞,因為每個軟體都內嵌自己的副本,影響範圍從 Node.js 到 Python 到代理伺服器,每個都要各自修補。
- 一句話結論
- Google Brotli 解碼器的記憶體損壞漏洞 CVE-2026-111497(CVSS 4.0 評分 9.2/10,critical)影響版本 1.0.3 到 1.2.0。精心設計的 Brotli 壓縮資料能覆寫緩衝區邊界外的記憶體,造成崩潰、記憶體洩漏或程式碼執行。因為 Brotli 是 C 程式碼且每個軟體內嵌自己的副本,影響範圍橫跨多個生態系統。
- 他要的是什麼
- 攻擊者傳送精心設計的 Brotli 壓縮資料(作為 HTTP 回應或上傳的請求 body),觸發記憶體損壞,在特定條件下可能執行程式碼。Imperva 已展示 Node.js 上的可靠利用,但需要多次嘗試且未公開。
- 你今天做一件事
- 今天檢查你的 Node.js、Bun、Envoy、Istio、Python Brotli 套件的版本,確認是否已更新到修補版本,並重新啟動服務與重建容器映像檔。若無法立即更新,拒絕 Content-Encoding: br 的請求與回應。 直接去做 →
- 哪些能信
- 9 可證明3 推論2 缺口 每個主張都標了等級,缺口是誠實寫出來的。
- 破口速查
- 受害端一律去識別化;寫「未公開」代表公開資料查不到。
- 伺服器服務商
- 執行 Node.js、Bun、Envoy、Istio,或安裝 Python Brotli/brotlicffi 套件的系統
- 網路服務商
- 網際網路
- 漏洞出現的地方
- 解碼不受信任的 Brotli 壓縮資料時(HTTP 回應、上傳的請求 body、代理轉發的流量)
- 馬上自我檢測
檢查 Node.js、Bun、Envoy、Istio、Python Brotli 套件的版本 確認是否有解碼不受信任的 Brotli 資料的路徑 檢視日誌中是否有異常崩潰或記憶體錯誤- 漏洞修補方式
- 更新到修補版本(Node.js 22.23.4/24.22.1/26.12.1、Bun 1.4.4、Envoy 1.40.0 等、Python Brotli 1.2.1) 若無法立即更新,拒絕 Content-Encoding: br 的請求與回應,或在 Python 移除 Brotli 套件
有 15 分鐘再看:其餘 2 點
- 受影響軟體包括 Node.js(22.x、24.x、26.x)、Bun、Envoy、Istio、Python Brotli 與 brotlicffi 套件、cdxgen。Imperva 已在 Node.js 24.22.0 ARM64 Linux 上展示程式碼執行(Node2Shell),但其他軟體尚未被證實可利用,且無實際攻擊報告。
- 這個漏洞在 2026 年 2 月 27 日已被修正並提交到 Brotli 原始碼,但當時未被標記為安全問題且未發布新版本,直到 10 月 21 日才統一發布修補。CISA 於 10 月 23 日評估「無利用證據」與「無自動化」。
Google Brotli 解碼器的記憶體損壞漏洞 CVE-2026-111497 影響所有使用這段 C 程式碼的軟體,包括 Node.js、Bun、Python Brotli 與 brotlicffi 套件、Envoy 與 Istio 代理。精心設計的 Brotli 壓縮資料能覆寫緩衝區邊界外的記憶體,造成崩潰、記憶體洩漏或執行攻擊者控制的程式碼。Imperva 已展示在 Node.js 上執行程式碼的利用,但其他軟體尚未被證實可利用。這個漏洞在 2 月已修正但未被標記為安全問題,直到 10 月 21 日才統一發布修補。因為每個軟體都內嵌自己的 Brotli 解碼器副本,每個都必須各自更新。
本篇目錄
發生了什麼
2026 年 10 月 24 日,The Hacker News 報導一個影響多個熱門軟體的記憶體損壞漏洞,源自 Google Brotli 解碼器的 C 程式碼。
Brotli 是 Google 開發的壓縮格式,廣泛用於網頁與網路流量的壓縮。這個漏洞(CVE-2026-111497)在解壓縮 Brotli 串流的 C 程式碼中,讓精心設計的壓縮資料能覆寫緩衝區邊界外的記憶體,導致程式崩潰、記憶體洩漏,或在特定條件下執行攻擊者控制的程式碼。
因為這是 C 程式碼的漏洞,且許多軟體都內嵌 Brotli 解碼器的副本,影響範圍橫跨多個生態系統:從 JavaScript 執行環境(Node.js、Bun)到代理伺服器(Envoy、Istio)到 Python 套件(Brotli、brotlicffi)。每個軟體都必須各自更新內嵌的 Brotli 解碼器副本。
哪些軟體受影響
只有在軟體解碼不受信任的 Brotli 資料時才會暴露。以下是受影響軟體與修補版本:
| 軟體 | 受影響版本 | 修補版本 | 暴露條件 |
|---|---|---|---|
| Google Brotli(C 程式庫) | 1.0.3 到 1.2.0 | 1.0.10、1.1.1、1.2.1 | 解碼不受信任的 Brotli 資料 |
| Node.js | 22.x、24.x、26.x(修補前);20.x 與更舊(已停止維護) | 22.23.4、24.22.1、26.12.1 | fetch() 取得 br 回應,或 Express/body-parser 解碼 br 請求 body |
| Bun | 1.4.3 與更早 | 1.4.4 | fetch() 取得 br 回應,或使用 node:zlib |
| Envoy | 1.39.2、1.38.5、1.37.7、1.36.11 | 1.40.0、1.39.3、1.38.6、1.37.8、1.36.12 | 只有在啟用 Brotli 解壓縮時 |
| Istio | 1.31.0 到 1.31.1、1.30.0 到 1.30.5、1.29.0 到 1.29.8 | 1.31.2、1.30.6、1.29.9 | 只有在啟用 Brotli 解壓縮時 |
Python Brotli | 1.2.0 與更早 | 1.2.1 | 只要安裝,HTTP 客戶端(requests、urllib3、httpx、aiohttp)就會自動解碼 br 回應 |
Python brotlicffi | 1.2.0.x 與更早 | 1.2.1.0 | 同上 |
| cdxgen | 獨立二進位檔與映像檔 13.4.0、12.8.8 與更早 | 13.5.0、12.8.9 | 獨立二進位檔或映像檔掃描不受信任的輸入 |
Node.js 與 Bun:只有在內建的 fetch() 讀取 Content-Encoding: br 的回應時,或請求 body 處理程式碼(Express 5、body-parser 2)解壓縮 Brotli 上傳時才會暴露。一般的 Node.js HTTP 伺服器不會自動解碼請求 body。
Envoy 與 Istio:只有在啟用 Brotli 解壓縮時才會暴露(例如透過 Envoy filter)。若未啟用,漏洞無法被觸發。
Python:風險來自只要安裝 Brotli 或 brotlicffi 套件。一旦安裝,HTTP 客戶端(requests、urllib3、httpx、aiohttp)會自動解碼 Brotli 回應,應用程式不需要在自己的程式碼中 import Brotli 就會暴露。
利用難度與實際風險
Imperva 的 Red Team 已展示可靠的利用程式碼(命名為 Node2Shell),在未修改的 Node.js 24.22.0 ARM64 Linux 上執行攻擊者控制的程式碼,傳送方式包括 fetch() 取得的回應與 Express 請求 body。這個利用需要多次嘗試,尚未公開,且未在其他建置版本上測試。
OpenAI Codex Security 團隊(回報此漏洞的團隊)描述這是「未經認證的遠端程式碼執行」,並列出 Node.js、Bun、Envoy 為受影響軟體。他們的描述指出漏洞雙向作用:
未修補的伺服器接受壓縮輸入時可能被惡意客戶端控制,未修補的客戶端接受壓縮輸入時(例如 "curl --compressed")可能被惡意伺服器控制。
目前無實際攻擊報告。 CISA 於 10 月 23 日評估「無利用證據」與「無自動化」。Red Hat 表示沒有可靠的公開 PoC 能執行程式碼。
為什麼修正在 2 月但修補在 10 月
這個漏洞有不尋常的歷史:關閉漏洞的修正在 2026 年 2 月 27 日已提交到 Brotli 原始碼,但直到 10 月 21 日才有新的 Brotli 版本包含這個修正。
OpenAI 說:「根本原因實際上在 2 月已在 Brotli 原始碼中修正,但當時不知道這會引發安全漏洞,且沒有更新的 Brotli 版本發布。」
這解釋了為什麼修補統一在 10 月 21 日發布:Node.js、Google、以及其他專案在那天同步發布修補版本。
Node.js 感謝 OpenAI Codex Security 的 Khai Tran 與 Sylvie Mayer 回報漏洞,以及維護者 Matteo Collina 與 Antoine du Hamel 的修補。
緩解措施與暫時解法
最佳做法:更新到修補版本並重新啟動服務與重建容器映像檔。 執行中的程序會保留舊的解碼器直到重新啟動。
若無法立即更新,OpenAI 的披露頁面與 Aikido 資安公司建議:
- 拒絕
Content-Encoding: br的請求,在任何代理或解析器解碼 body 之前。 - 關閉 HTTP 客戶端的自動 Brotli 解碼,並在解碼前拒絕 Brotli 回應。
- 在 Python 移除
Brotli與brotlicffi套件,讓客戶端回退到 gzip 與 deflate。
單純從 Accept-Encoding header 移除 br 沒有幫助,因為伺服器可以傳送 Brotli 而不管客戶端要求什麼。對 Node.js 來說,沒有公開的暫時解法,只能更新執行環境。
系統套件與相依性掃描器
系統套件的修補時間各異。Debian 於 10 月 23 日修補 Debian 13(trixie)的 brotli 套件(版本 1.1.0-2+deb13u1)。Amazon Linux 2023 截至 10 月 22 日仍列出 brotli 與 Node.js 24 套件為待修補。
相依性掃描器可能尚未標記 Python 套件。CVE 記錄指向 Google Brotli 儲存庫而非 PyPI 套件,且 GitHub Advisory 仍未列出受影響套件(這是 Dependabot 讀取的來源)。PYSEC-2026-4322 與 PYSEC-2026-4323 的 Advisory 條目在 10 月 23 日才新增,所以也要手動檢查安裝的版本。
你可以學到什麼
站在攻擊者的角度:一個壓縮格式的解碼器漏洞,只要能讓目標解碼你控制的 Brotli 資料,就有機會觸發。傳送方式可以是 HTTP 回應(如果目標是客戶端)或上傳的請求 body(如果目標是伺服器)。Imperva 已證明 Node.js 上的利用是可行的,但需要多次嘗試。
- 01內嵌相依性的漏洞需要每個軟體各自修補:Brotli 解碼器是 C 程式碼,每個軟體內嵌自己的副本,所以 Google 修補 Brotli 不會自動修補 Node.js、Bun、Python 套件。
- 02修正提交不等於安全修補發布:Brotli 的修正在 2 月提交但未被標記為安全問題,直到 10 月才統一發布修補版本,中間有 8 個月的窗口。
- 03Python 套件的隱性暴露:只要安裝 Brotli 或 brotlicffi,HTTP 客戶端就會自動解碼 br 回應,應用程式不需要明確 import 就會暴露。
- 04重新啟動服務與重建容器映像檔是修補的必要步驟:更新套件後,執行中的程序仍使用舊的解碼器,必須重新啟動。
- 05單純拒絕 Accept-Encoding 無效:伺服器可以傳送 Brotli 而不管客戶端要求什麼,必須在解碼前主動拒絕或關閉解碼功能。
- 06Web 應用防火牆無法涵蓋所有路徑:Vercel 的規則無法涵蓋 function 從其他伺服器 fetch 的回應,只有更新執行環境或程式庫才能關閉這個路徑。
- 07相依性掃描器可能有延遲:GitHub Advisory 尚未列出受影響的 Python 套件,Dependabot 可能無法標記,要手動檢查版本。
- 08雙向利用:未修補的伺服器接受壓縮上傳時可能被惡意客戶端控制,未修補的客戶端接受壓縮回應時可能被惡意伺服器控制。
- 09利用難度影響實際風險:Imperva 展示的利用需要多次嘗試且未公開,目前無實際攻擊報告,但這不代表未來不會出現可靠的利用。
- 01CVE-2026-111497Google Brotli 解碼器記憶體損壞漏洞,CVSS 4.0 評分 9.2(critical)。
- 02BrotliGoogle 開發的壓縮格式,廣泛用於網頁與網路流量,這次漏洞在解碼 Brotli 串流的 C 程式碼中。
- 03記憶體損壞(Memory Corruption)精心設計的 Brotli 資料能覆寫緩衝區邊界外的記憶體,造成崩潰、記憶體洩漏或程式碼執行。
- 04Node2ShellImperva 展示的 Node.js 利用程式碼,在 ARM64 Linux 上執行攻擊者控制的程式碼,但需要多次嘗試且未公開。
- 05Content-Encoding: brHTTP header 表示內容使用 Brotli 壓縮,這是漏洞的觸發路徑之一。
- 06內嵌相依性(Embedded Dependency)每個軟體內嵌自己的 Brotli 解碼器副本,所以每個都必須各自更新,不能依賴 Google 修補。
- 07Python 隱性暴露只要安裝 Brotli 或 brotlicffi 套件,HTTP 客戶端就會自動解碼 br 回應,應用程式不需要明確 import。
- 08OpenAI Codex Security回報此漏洞的團隊,描述這是雙向的未經認證遠端程式碼執行。
- 09雙向利用未修補的伺服器可能被惡意客戶端控制,未修補的客戶端可能被惡意伺服器控制,取決於誰解碼不受信任的 Brotli 資料。
- 10修正與修補的時間差Brotli 的修正在 2 月提交但未被標記為安全問題,直到 10 月才統一發布修補版本,中間有 8 個月窗口。
下面的步驟全部唯讀,做完你會知道你的系統是否受影響、是否已修補、是否需要重新啟動。
全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。
- 檢查 Node.js 版本
node --version看到什麼代表什麼:修補版本:22.23.4、24.22.1、26.12.1 或更新。若版本較舊且在受影響範圍(22.x、24.x、26.x),需要更新。20.x 與更舊版本已停止維護。 - 檢查 Bun 版本
bun --version看到什麼代表什麼:修補版本:1.4.4 或更新。若版本是 1.4.3 或更早,需要更新。 - 檢查 Python Brotli 套件版本
pip show Brotli | grep Version pip show brotlicffi | grep Version看到什麼代表什麼:修補版本:Brotli 1.2.1 或 brotlicffi 1.2.1.0。若版本較舊或未安裝,檢查 HTTP 客戶端是否會自動解碼 br 回應。 - 檢查 Envoy 版本
envoy --version看到什麼代表什麼:修補版本:1.40.0、1.39.3、1.38.6、1.37.8、1.36.12。只有在啟用 Brotli 解壓縮時才受影響。 - 檢查 Istio 版本
istioctl version看到什麼代表什麼:修補版本:1.31.2、1.30.6、1.29.9。只有在啟用 Brotli 解壓縮時才受影響。 - 確認服務是否已重新啟動
systemctl status <服務名稱> ps aux | grep node看到什麼代表什麼:更新套件後必須重新啟動服務與重建容器映像檔,因為執行中的程序保留舊的解碼器。檢查程序啟動時間是否在更新之後。 - 若無法立即更新,在 Python 移除 Brotli 套件
pip uninstall Brotli brotlicffi看到什麼代表什麼:移除後 HTTP 客戶端會回退到 gzip 與 deflate。這是暫時解法,仍需儘快更新。
如果你使用 Node.js、Bun、Python Brotli 套件或 Envoy/Istio,今天就檢查版本並更新。更新後記得重新啟動服務與重建容器映像檔。
這篇提到的項目要花多少錢
更新與重新啟動的成本主要是人力時間與服務中斷。
| 項目 | 用量 | 單價 | 期間 | US$ | NT$ | 舉證 |
|---|---|---|---|---|---|---|
| 更新 Node.js 到修補版本 估:包含測試與部署;Node.js 更新本身免費 | 約 0.5 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 429.69 | 13,750 | 本站假設值 |
| 更新 Bun 到修補版本 估:包含測試與部署;Bun 更新本身免費 | 約 0.25 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 214.84 | 6,875 | 本站假設值 |
| 更新 Python Brotli 套件 估:pip install --upgrade Brotli brotlicffi 並測試 | 約 0.25 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 214.84 | 6,875 | 本站假設值 |
| 更新 Envoy/Istio 與重建容器映像檔 估:包含重建映像檔、測試與部署 | 約 1 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 859.38 | 27,500 | 本站假設值 |
| 重新啟動生產服務與監控 估:協調重新啟動時間、執行重啟、監控服務恢復 | 約 0.5 人日 | 內部工時或顧問日費 NT$20,000–35,000(估) | 一次性 | 429.69 | 13,750 | 本站假設值 |
| 服務中斷成本 若需要停機維護,服務中斷的成本取決於業務規模與 SLA | — | — | — | — | — | — |
| 合計(僅可證明列) | 0.00 | 0 | ||||
總計約 2.5 人日,主要成本在協調更新與重新啟動。服務中斷成本取決於業務規模與是否能做到零停機更新。
來源:本文整理自 The Hacker News 於 2026 年 10 月 24 日發布的報導,依據 Imperva 研究與 OpenAI Codex Security 披露。原文連結
環境背景、時間線、攻擊鏈對照 ATT&CK、關鍵證據、根因、處置與檢討都在完整版,約 10 分鐘。
來源
本文為公開報導與官方公告的整理與拆解,非第一手鑑識;證據等級依來源可信度標註。
本文由 AI 團隊協助研究與撰寫,經隱私與事實檢查後發布;證據等級依來源可信度標註。
複製下面這段,貼給你在用的 AI 工具(Claude Code、Cursor、Copilot、ChatGPT 都可以)。它會用本篇的破口位置、自我檢測與學習重點,對你的專案或環境做一次資安掃描,列出潛在問題與建議的調整或加強方式。
預設是唯讀:只發現問題、提出建議,不會改你任何檔案或設定。
M2 Web 應用安全 · 想在自己的環境做一次同樣的盤點,從 自我盤點 開始。
每篇新文章一封:三點摘要、關鍵字定義、今天能做的一件事。或先 加入會員 記錄你完成的任務。