Brotli 解碼器缺陷導致 Node.js 遠端執行,亦波及 Bun、Python 等主流軟體
Brotli Decoder Flaw Behind Node.js RCE Also Affects Bun, Python and Other Widely Used Software
Brotli 解碼器的記憶體破壞缺陷已被發現,能讓攻擊者透過精心製作的壓縮資料在 Node.js、Bun、Python 等軟體中執行任意程式碼。
- CVE:CVE‑2026‑111497,Google Brotli C 程式碼在 2026‑10‑21 之後已修復,其他軟體須自行更新。
此漏洞跨多平臺,需即時更新以防止潛在遠端執行攻擊,影響 Node.js、Bun、Python 等主流軟體,同時須關閉未受信任的 Brotli 解碼以降低風險。
Google 的 Brotli 解碼器存在一個記憶體破壞缺陷,許多解壓縮 Brotli 壓縮資料的程式都包含此缺陷,包括 Bun、Python Brotli 與 brotlicffi 套件,以及設定為解壓縮 Brotli 的 Envoy 代理。
追蹤編號為 CVE-2026-111497,此缺陷允許精心設計的壓縮資料覆寫緩衝區結尾之外的記憶體並破壞程式記憶體,可能導致崩潰、記憶體洩漏或執行攻擊者控制的程式碼。
Imperva 研究人員已證明 程式碼可在一個未修補的 Node.js 版本上執行。同樣的情況尚未在其他軟體上被證實,也未報告實際攻擊案例。
此缺陷於 10 月 21 日首次披露,當時 Node.js 和 Google 發布了修復程式,之後各產品也陸續跟進。由於錯誤位於 Google 的解碼器,且每個程式都自帶其複本,所有程式必須自行更新該複本。
Brotli 是 Google 推出的壓縮格式,廣泛用於網路上縮小網頁與其他流量。此錯誤位於解壓縮 Brotli 內容的 C 程式碼中,因而會傳遞到任何重複使用該程式碼的地方,從語言執行環境、代理到 Python 套件。
受影響的軟體
| 產品 | 受影響 | 已修復於 | 暴露時機 |
|---|---|---|---|
| Google Brotli (C library) | 1.0.3 to 1.2.0 | 1.0.10, 1.1.1, 1.2.1 | 程式碼解碼未受信任的 Brotli |
| Node.js | 22.x, 24.x, 26.x before the fix; 20.x and older (end of life) | 22.23.4, 24.22.1, 26.12.1 |
fetch() of a br response, or Express or body-parser br bodies
|
| Bun | 1.4.3 and earlier | 1.4.4 |
fetch() of a br response, or 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 to 1.31.1, 1.30.0 to 1.30.5, 1.29.0 to 1.29.8 | 1.31.2, 1.30.6, 1.29.9 | 僅在啟用 Brotli 解壓縮時 |
Python Brotli
|
1.2.0 and earlier | 1.2.1 |
已安裝,且 HTTP 客戶端會解碼 br |
Python brotlicffi
|
1.2.0.x and earlier | 1.2.1.0 |
已安裝,且 HTTP 客戶端會解碼 br |
| cdxgen | 獨立二進位檔與映像檔,13.4.0 及 12.8.8 及之前版本 | 13.5.0, 12.8.9 | 獨立二進位或映像掃描未受信任輸入 |
程式僅在解碼他人控制的 Brotli 資料時才會被暴露。對於 Node.js 與 Bun,這發生於內建 fetch() 讀取帶 Content-Encoding: br 的回應,或當 Express 5、body-parser 2 等請求體程式碼解壓縮 Brotli 上傳時。純 Node.js HTTP 伺服器不會自行解碼請求體。
Envoy 與 Istio 僅在啟用 Brotli 解壓縮時受影響,例如透過 Envoy 過濾器。若未啟用,則無法觸發此缺陷。
在 Python 中,風險來自於 Brotli 或 brotlicffi 套件被安裝。只要其中任何一個存在,HTTP 客戶端如 requests、urllib3、httpx、aiohttp 等會自行解碼 Brotli 回應,因此即使應用程式未在自己的程式碼中匯入 Brotli,也可能被暴露。
網頁應用防火牆只能協助到這一步。Vercel 在披露當日 新增防火牆規則,並表示這些規則不涵蓋「您的功能從其他伺服器抓取的回應」。對於此路徑…
漏洞能被推到多遠取決於軟體。Imperva 的 Red Team(稱其工作為 Node2Shell)在未修改的 Node.js 24.22.0 Linux ARM64 版本上執行攻擊者提供的程式碼,並以抓取回應與 Express 請求主體兩種方式交付。此利用需多次嘗試,尚未公開,亦未在其他版本上測試。
OpenAI(其 Codex Security 團隊報告此漏洞)將其描述為在 Brotli 中允許未經身份驗證的遠端程式碼執行,並列舉 Node.js、Bun 及 Envoy 為受影響軟體。在其說明中,漏洞雙向生效:
一個未修補且接受壓縮輸入的伺服器可能被惡意客戶端接管,而一個未修補且接受壓縮輸入(如 "curl --compressed")的客戶端則可能被惡意伺服器接管。
尚未報告實際使用情況。CISA 在 10 月 23 日的評估中將利用記錄為 "none",自動化為 "no",且 Red Hat 表示沒有可靠的公開實作範例可執行程式碼。
嚴重性評分因評分者而異。Google(負責分配 CVE)在 CVSS 4.0 標準上將其評為 9.2,亦即嚴重;Node.js 將其評為高;Red Hat 評為 8.1,亦即重要。
修補程式有一段不尋常的歷史。關閉此漏洞的變更於 2 月 27 日加入 Brotli 原始碼,但直到 10 月 21 日才有新版本釋出。OpenAI 表示根本原因「實際上已於二月在 Brotli 原始碼中修復,但當時並未發現會產生安全漏洞,且當時沒有更新的 Brotli 版本。」
Node.js 對報告此漏洞的 OpenAI Codex Security 團隊成員 Khai Tran 與 Sylvie Mayer 表示感謝,並對維護者 Matteo Collina 與 Antoine du Hamel 的修復工作致以讚賞。
現在該怎麼做
從上表更新至已修補的版本,然後重新啟動服務並重建任何容器映像,因為正在執行的程式會持續使用舊的解碼器直到重新啟動。
若尚無法更新,請停止解碼不受信任的 Brotli。OpenAI 的披露頁面與安全公司 Aikido 均建議:
- 在任何代理或解析器解碼主體之前,拒絕帶有 Content-Encoding: br 的傳入請求。
- 停用 HTTP 客戶端的自動 Brotli 解碼,並在解碼前拒絕 Brotli 響應。
- 在 Python 中,解除安裝 Brotli 與 brotlicffi 套件,使客戶端回退至 gzip 與 deflate。
從 Accept-Encoding 標頭中移除 br 本身並無幫助,因為伺服器可以根據客戶端要求送出任何 Brotli。對於 Node.js,尚未公佈任何變通方案,故更新執行環境是唯一解決方式。
系統套件的修補時間各不相同。Debian 已於 10 月 23 日在 1.1.0-2+deb13u1 版本為 Debian 13(trixie)修復其 brotli 套件。Amazon Linux 2023 截至 10 月 22 日仍將其 brotli 與 Node.js 24 套件列為待修補。
依賴掃描工具可能尚未標示 Python 套件。CVE 記錄命名為 Google 的 Brotli 倉庫,而非 PyPI 套件,且 GitHub 的安全通告仍未列出受影響的套件,這是 Dependabot 所讀取的內容。兩個 Python 套件的安全通告條目(PYSEC-2026-4322 與 PYSEC-2026-4323)於 10 月 23 日新增,請亦手動檢查已安裝版本。
覺得這篇文章有趣嗎? 追蹤我們的 Google News、Twitter 和 LinkedIn,閱讀更多我們發布的獨家內容。
