新聞稿拆解

Brotli 解碼器記憶體損壞:Node.js RCE 只是冰山一角

Google Brotli 解碼器的記憶體損壞漏洞 CVE-2026-111497 影響所有使用這段 C 程式碼的軟體,包括 Node.js、Bun、Python Brotli 與 brotlicffi 套件、Envoy 與 Istio 代理。精心設計的 Brotli 壓縮資料能覆寫緩衝區邊界外的記憶體,造成崩潰、記憶體洩漏或執行攻擊者控制的程式碼。Imperva 已展示在 Node.js 上執行程式碼的利用,但其他軟體尚未被證實可利用。這個漏洞在 2 月已修正但未被標記為安全問題,直到 10 月 21 日才統一發布修補。因為每個軟體都內嵌自己的 Brotli 解碼器副本,每個都必須各自更新。

30 秒看懂
  • Google Brotli 解碼器的記憶體損壞漏洞 CVE-2026-111497(CVSS 4.0 評分 9.2/10,critical)影響版本 1.0.3 到 1.2.0。精心設計的 Brotli 壓縮資料能覆寫緩衝區邊界外的記憶體,造成崩潰、記憶體洩漏或程式碼執行。因為 Brotli 是 C 程式碼且每個軟體內嵌自己的副本,影響範圍橫跨多個生態系統。
  • 受影響軟體包括 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 日評估「無利用證據」與「無自動化」。

發生了什麼

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.01.0.10、1.1.1、1.2.1解碼不受信任的 Brotli 資料
Node.js22.x、24.x、26.x(修補前);20.x 與更舊(已停止維護)22.23.4、24.22.1、26.12.1fetch() 取得 br 回應,或 Express/body-parser 解碼 br 請求 body
Bun1.4.3 與更早1.4.4fetch() 取得 br 回應,或使用 node:zlib
Envoy1.39.2、1.38.5、1.37.7、1.36.111.40.0、1.39.3、1.38.6、1.37.8、1.36.12只有在啟用 Brotli 解壓縮時
Istio1.31.0 到 1.31.1、1.30.0 到 1.30.5、1.29.0 到 1.29.81.31.2、1.30.6、1.29.9只有在啟用 Brotli 解壓縮時
Python Brotli1.2.0 與更早1.2.1只要安裝,HTTP 客戶端(requests、urllib3、httpx、aiohttp)就會自動解碼 br 回應
Python brotlicffi1.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 上的利用是可行的,但需要多次嘗試。

lessons本案的 9 個教訓
  1. 01
    內嵌相依性的漏洞需要每個軟體各自修補:Brotli 解碼器是 C 程式碼,每個軟體內嵌自己的副本,所以 Google 修補 Brotli 不會自動修補 Node.js、Bun、Python 套件。
  2. 02
    修正提交不等於安全修補發布:Brotli 的修正在 2 月提交但未被標記為安全問題,直到 10 月才統一發布修補版本,中間有 8 個月的窗口。
  3. 03
    Python 套件的隱性暴露:只要安裝 Brotli 或 brotlicffi,HTTP 客戶端就會自動解碼 br 回應,應用程式不需要明確 import 就會暴露。
  4. 04
    重新啟動服務與重建容器映像檔是修補的必要步驟:更新套件後,執行中的程序仍使用舊的解碼器,必須重新啟動。
  5. 05
    單純拒絕 Accept-Encoding 無效:伺服器可以傳送 Brotli 而不管客戶端要求什麼,必須在解碼前主動拒絕或關閉解碼功能。
  6. 06
    Web 應用防火牆無法涵蓋所有路徑:Vercel 的規則無法涵蓋 function 從其他伺服器 fetch 的回應,只有更新執行環境或程式庫才能關閉這個路徑。
  7. 07
    相依性掃描器可能有延遲:GitHub Advisory 尚未列出受影響的 Python 套件,Dependabot 可能無法標記,要手動檢查版本。
  8. 08
    雙向利用:未修補的伺服器接受壓縮上傳時可能被惡意客戶端控制,未修補的客戶端接受壓縮回應時可能被惡意伺服器控制。
  9. 09
    利用難度影響實際風險:Imperva 展示的利用需要多次嘗試且未公開,目前無實際攻擊報告,但這不代表未來不會出現可靠的利用。
keywords重點學習:最需要學習的 10 個關鍵字10 個
  1. 01
    CVE-2026-111497
    Google Brotli 解碼器記憶體損壞漏洞,CVSS 4.0 評分 9.2(critical)。
  2. 02
    Brotli
    Google 開發的壓縮格式,廣泛用於網頁與網路流量,這次漏洞在解碼 Brotli 串流的 C 程式碼中。
  3. 03
    記憶體損壞(Memory Corruption)
    精心設計的 Brotli 資料能覆寫緩衝區邊界外的記憶體,造成崩潰、記憶體洩漏或程式碼執行。
  4. 04
    Node2Shell
    Imperva 展示的 Node.js 利用程式碼,在 ARM64 Linux 上執行攻擊者控制的程式碼,但需要多次嘗試且未公開。
  5. 05
    Content-Encoding: br
    HTTP header 表示內容使用 Brotli 壓縮,這是漏洞的觸發路徑之一。
  6. 06
    內嵌相依性(Embedded Dependency)
    每個軟體內嵌自己的 Brotli 解碼器副本,所以每個都必須各自更新,不能依賴 Google 修補。
  7. 07
    Python 隱性暴露
    只要安裝 Brotli 或 brotlicffi 套件,HTTP 客戶端就會自動解碼 br 回應,應用程式不需要明確 import。
  8. 08
    OpenAI Codex Security
    回報此漏洞的團隊,描述這是雙向的未經認證遠端程式碼執行。
  9. 09
    雙向利用
    未修補的伺服器可能被惡意客戶端控制,未修補的客戶端可能被惡意伺服器控制,取決於誰解碼不受信任的 Brotli 資料。
  10. 10
    修正與修補的時間差
    Brotli 的修正在 2 月提交但未被標記為安全問題,直到 10 月才統一發布修補版本,中間有 8 個月窗口。

下面的步驟全部唯讀,做完你會知道你的系統是否受影響、是否已修補、是否需要重新啟動。

try today今天就可以來試試約 20 分鐘

全部唯讀,不改任何設定;做完你會知道自己有沒有同樣的破口。

  1. 檢查 Node.js 版本
    node --version
    看到什麼代表什麼:修補版本:22.23.4、24.22.1、26.12.1 或更新。若版本較舊且在受影響範圍(22.x、24.x、26.x),需要更新。20.x 與更舊版本已停止維護。
  2. 檢查 Bun 版本
    bun --version
    看到什麼代表什麼:修補版本:1.4.4 或更新。若版本是 1.4.3 或更早,需要更新。
  3. 檢查 Python Brotli 套件版本
    pip show Brotli | grep Version
    pip show brotlicffi | grep Version
    看到什麼代表什麼:修補版本:Brotli 1.2.1 或 brotlicffi 1.2.1.0。若版本較舊或未安裝,檢查 HTTP 客戶端是否會自動解碼 br 回應。
  4. 檢查 Envoy 版本
    envoy --version
    看到什麼代表什麼:修補版本:1.40.0、1.39.3、1.38.6、1.37.8、1.36.12。只有在啟用 Brotli 解壓縮時才受影響。
  5. 檢查 Istio 版本
    istioctl version
    看到什麼代表什麼:修補版本:1.31.2、1.30.6、1.29.9。只有在啟用 Brotli 解壓縮時才受影響。
  6. 確認服務是否已重新啟動
    systemctl status <服務名稱>
    ps aux | grep node
    看到什麼代表什麼:更新套件後必須重新啟動服務與重建容器映像檔,因為執行中的程序保留舊的解碼器。檢查程序啟動時間是否在更新之後。
  7. 若無法立即更新,在 Python 移除 Brotli 套件
    pip uninstall Brotli brotlicffi
    看到什麼代表什麼:移除後 HTTP 客戶端會回退到 gzip 與 deflate。這是暫時解法,仍需儘快更新。

如果你使用 Node.js、Bun、Python Brotli 套件或 Envoy/Istio,今天就檢查版本並更新。更新後記得重新啟動服務與重建容器映像檔。

這篇提到的項目要花多少錢

更新與重新啟動的成本主要是人力時間與服務中斷。

costBrotli 漏洞修補成本
項目用量單價期間US$NT$舉證
更新 Node.js 到修補版本
估:包含測試與部署;Node.js 更新本身免費
約 0.5 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性429.6913,750本站假設值
更新 Bun 到修補版本
估:包含測試與部署;Bun 更新本身免費
約 0.25 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性214.846,875本站假設值
更新 Python Brotli 套件
估:pip install --upgrade Brotli brotlicffi 並測試
約 0.25 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性214.846,875本站假設值
更新 Envoy/Istio 與重建容器映像檔
估:包含重建映像檔、測試與部署
約 1 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性859.3827,500本站假設值
重新啟動生產服務與監控
估:協調重新啟動時間、執行重啟、監控服務恢復
約 0.5 人日內部工時或顧問日費 NT$20,000–35,000(估)一次性429.6913,750本站假設值
服務中斷成本
若需要停機維護,服務中斷的成本取決於業務規模與 SLA
——————
合計(僅可證明列)0.000
匯率假設 1 USD ≈ NT$32。單價為公開牌價或帳單實付,來源:本站人力工時假設。「舉證」欄標明每筆損失的證據來源與等級( 可證明 推論 缺口)。

總計約 2.5 人日,主要成本在協調更新與重新啟動。服務中斷成本取決於業務規模與是否能做到零停機更新。


來源:本文整理自 The Hacker News 於 2026 年 10 月 24 日發布的報導,依據 Imperva 研究與 OpenAI Codex Security 披露。原文連結

來源

分享
精選拆解直送信箱

每篇新文章一封:三點摘要、關鍵字定義、今天能做的一件事。

延伸閱讀

新聞稿拆解

Node.js 一次修了 10 個漏洞,升級的關鍵不是版本號,是重新部署

2026 年 10 月 21 日,Node.js 同時發布 22.23.4、24.22.1、26.12.1,最重的是 Brotli 解壓縮器的越界寫入,官方標題直接寫「可遠端執行程式碼」。三條線都有修,Node 20 已經停止支援、不會修。這篇拆開哪些伺服器真的在射程內、為什麼在 package.json 寫了 24.x 還不等於已經修好,以及我們自己做了什麼、還沒做什麼。

  • 2026/10/22
  • 每日拆解
研究報告拆解

Langflow 兩個關鍵漏洞:未認證 RCE 與 MCP 端點認證繞過

IBM 揭露 Langflow 1.0.0 至 1.12.8 版存在兩個 CVSS 9.8 關鍵漏洞,允許遠端未認證攻擊者繞過認證或執行任意程式碼。其中 CVE-2026-93680 為 MCP 工具列舉端點的認證繞過,CVE-2026-110186 為程式碼生成控制不當的 RCE。漏洞源自預設開啟的自動登入(LANGFLOW_AUTO_LOGIN)與不完整的修補。唯一修補版本為 1.13.0。

  • 2026/11/03
  • 每日拆解