漏洞影響範圍與攻擊向量
CVE-2026-111497 是一個存在於 Google Brotli 解碼器中的越界寫入(out-of-bounds write)缺陷,影響版本為 1.0.3 至 1.2.0。攻擊者無需身份驗證即可透過發送特製的 Brotli 壓縮資料流,導致記憶體損壞、敏感資料洩漏、程序崩潰或潛在的任意程式碼執行。
該漏洞具有雙向攻擊特性:惡意客戶端可接管未修補的伺服器,而惡意伺服器也可接管接受壓縮回應的未修補客戶端。這意味著應用程式即使僅作為 HTTP 客戶端發起請求,若目標伺服器回傳惡意的 Brotli 壓縮內容,也可能遭受攻擊。
受影響的環境不僅限於 Node.js,還擴展至 Python、C++、Bun、Envoy 等使用 HTTP 協議的語言與服務應用。只要環境中安裝了受影響版本的 Brotli 或 brotlicffi 套件,且該套件被 HTTP 客戶端自動載入,即構成暴露風險。
Python 生態系的特定風險與檢測限制
在 Python 環境中,Brotli 和 brotlicffi 是兩個主要的 PyPI 套件,它們編譯了相同的易受攻擊解碼器。Popular HTTP 客戶端如 urllib3(requests 的底層庫)、httpx 和 aiohttp 在偵測到這些套件存在時,會自動啟用 Brotli 解壓縮功能,無需開發者在程式碼中顯式匯入。
Scrapy 等框架會自動將 Brotli 作為依賴安裝,而其他客戶端可能需要明確指定 extras(如 httpx[brotli])。攻擊者可透過兩種路徑觸發漏洞:一是應用程式向受攻擊者控制的伺服器發起請求並接收惡意壓縮回應;二是應用程式的框架或中介軟體解碼帶有 Content-Encoding: br 標頭的請求主體。
截至 10 月 23 日,官方建議升級至 Brotli 1.2.1 或 brotlicffi 1.2.1.0。然而,pip-audit、Dependabot 和 Safety 等依賴掃描工具尚未將此 CVE 對應至 PyPI 套件資料庫,因此不會自動標記受影響的版本。開發者需手動使用 pip show 檢查安裝版本,或透過 pipdeptree 追蹤依賴來源。
技術成因與修復狀態
漏洞位於 DecodeBlockTypeAndLength() 函數中,該函數處理 Brotli 資料流中的區塊切換點。在易受攻擊的版本中,該函數僅回傳布林值,無法區分「資料格式錯誤」與「需要更多輸入」兩種情況,導致解碼器在快速路徑上忽略返回值並繼續處理,最終引發越界寫入。
上游修復(google/brotli commit 0ed4268)修改了函數的回傳類型為錯誤代碼,並新增了 BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (-17) 錯誤。這使得解碼器在遇到格式錯誤時會正確停止處理。OSM 的測試顯示,Brotli 1.2.0 會持續要求更多輸入而不報錯,而 1.2.1 則能正確拒絕惡意資料流。
OpenAI 於 2026 年 2 月發現此問題並修復了原始碼,但當時未將其識別為安全漏洞,因此未發布包含修復的正式版本。這導致所有內嵌 Brotli 庫的專案必須各自發布更新以包含該修復。目前 Node.js、Bun、Envoy、Istio 等已發布修補版本,Apache 和 Nginx 預設不解碼 Brotli,因此不受影響。
臨時緩解措施與升級建議
若無法立即升級,Python 應用程式可考慮暫時移除 Brotli 和 brotlicffi 套件。HTTP 客戶端如 HTTPX、Requests 和 urllib3 在缺少這些選定套件時會回退至 gzip 和 deflate 壓縮支援。但需注意,若伺服器仍發送 Brotli 壓縮回應,可能會導致應用程式錯誤或無法讀取回應,因為自動回退並非保證行為。
對於入站請求,可在反向代理、負載平衡器或應用中介軟體層拒絕 Content-Encoding 包含 br 的請求。對於出站請求,應從 Accept-Encoding 標頭中移除 br,並在解碼前檢查回應標頭。僅修改 Accept-Encoding 是不夠的,因為惡意伺服器可能無視客戶端宣告而發送 Brotli 回應,且 urllib3 會根據回應標頭選擇解碼器。
升級步驟包括更新受影響的執行環境或庫版本(如 Node.js 22.23.4+、Bun 1.4.4+、Envoy 1.40.0+ 等),重建包含這些組件的容器映像,並重新部署服務。開發者應優先升級那些呼叫外部伺服器或接受壓縮請求主體的服務,並確認執行中的工作負載已使用修補後的組件。




