新聞稿拆解

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

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

30 秒看懂
  • 第一手是 Node.js 官方 10 月 21 日的安全公告與三份發布說明:22.23.4、24.22.1、26.12.1 同步修補 10 個 CVE,其中 4 個 HIGH;另外更新 c-ares、OpenSSL、SQLite、Undici 與內建根憑證(處理 eMudhra 中繼憑證私鑰外洩)。官方沒有回報野外利用。
  • 最重的是 CVE-2026-111497:內建 Brotli 解碼器的越界寫入,官方標題寫「可遠端執行程式碼」。Node 不會自己去解 Brotli;射程取決於你的程式或套件會不會解開攻擊者給的壓縮資料,包括 fetch 回來的回應。Vercel 的 WAF 擋得到流入的請求,擋不到你主動抓回來的內容。
  • Node 20 已在 2026-04-30 停止支援,這次不會修。在 package.json 寫 engines 只鎖住主版本,真正換上修補版的是那一次重建與部署;我們自己的站在 10 月 22 日鎖了 24.x,正式站實際跑到哪一個修補版,寫這篇時還沒核對完。

發生了什麼

10 月 21 日早上我們才寫完 PHP 核心雙 RCE 那篇,傍晚 6 點 38 分,Node.js 也一次發了三個版本。我們自己的站跑的是 Next.js,所以這次不是替別人拆,是先翻自己的設定:正式站到底跑哪一版 Node?誰決定的?要怎麼確認換上修補版了?翻到一半才發現,package.json 裡連 engines 都沒寫。這篇就從那張「我們自己也答不出來」的表開始,拆官方公告講了什麼、哪些伺服器真的在射程內,以及一套中小團隊今天就能照做的修補流程。

先講清楚第一手文件的性質。Node.js 的安全公告是專案自己發的修補通知,格式固定:漏洞標題、嚴重度、影響哪幾條版本線、誰回報、誰修。它不會附觸發細節,也不會給 PoC;這是刻意的,好讓大家先升級。這篇能補上的部分,來自發布說明裡的 commit 清單、Vercel 的公告,以及資安媒體的整理,那些我會另外標出來。

官方公告重點(Node.js,2026-10-21)READ-ONLY
修補版本:v22.23.4、v24.22.1、v26.12.1
最高嚴重度:三條線都是 HIGH

HIGH
CVE-2026-111497  Brotli 解碼器越界寫入,可遠端執行程式碼(22/24/26)
CVE-2026-105482  dns.resolve 遇到含 NUL 字元的名稱會截斷(22/24/26)
CVE-2026-105483  IP 以全形數字書寫時,TLS 憑證主機名稱驗證可被繞過(24/26)
CVE-2026-106069  主機名稱可寬鬆解析成 IP 時,TLS 憑證主機名稱驗證可被繞過(22/24/26)
MEDIUM
CVE-2026-105481  keep-alive 連線可能處理到請求送出前就寫入的回應
CVE-2026-106072  非標準 IPv4 主機名稱讓 DNS SAN 憑證可通過 IP 端點驗證
CVE-2026-106074  crypto.randomUUID()/randomInt() 的亂數快取被存進啟動快照與 SEA
LOW
CVE-2026-106070  ZipFile 驗證失敗後回傳攻擊者控制的前綴位元組(26)
CVE-2026-106071  Permission Model 萬用字元比對過度授權(26)
CVE-2026-106073  Permission Model 可經 fs.realpathSync 繞過

相依套件:c-ares、ca-cert(eMudhra 中繼憑證外洩)、OpenSSL(22/24)、SQLite(22)、Undici
停止支援的版本:每次安全更新都一定受影響

把能查到的時間排開。注意第一列:Node 這次修 Brotli 用的,是上游八個月前就提交的一個修正。

  1. 2026-02-27
    Google Brotli 上游提交 commit 0ed4268a,說明是「更早偵測並回報無效的資料流」
    GitHub 上的 commit 紀錄;Node 三份發布說明都寫 deps: brotli: cherry-pick 0ed4268a4401 對應 CVE-2026-111497
  2. 2026-04-30
    Node.js 20 停止支援(End-of-Life)
    Node.js Release 工作小組 schedule.json;官方公告寫停止支援的版本在每次安全更新都受影響
  3. 2026-10-17~10-18
    研究者通報 eMudhra 八把中繼憑證私鑰外洩,eMudhra 於 10-18 以 caCompromise 撤銷;Chrome 與 Firefox 當晚陸續封鎖
    The Hacker News、Scott Helme 等報導;本站未取得 eMudhra 的原始公告
  4. 2026-10-20
    Node.js 24 從 Active LTS 進入維護期 LTS(Maintenance)
    schedule.json;維護期仍會收到安全修補
  5. 2026-10-21 10:38 UTC(台灣 18:38)
    Node.js 22.23.4、24.22.1、26.12.1 在 GitHub 同時發布;同日官方公告列出 10 個 CVE 與相依套件更新
    nodejs/node GitHub Releases 時間戳;nodejs.org 安全公告與三份發布說明
  6. 2026-10-21
    Vercel 發布公告:當天已在 WAF 加規則擋流入的攻擊流量,並陸續替託管執行環境換上修補版;Node 20 專案必須自己改版本重新部署
    Vercel 公告(Vercel 自己的說法)
  7. 2026-10-22 09:41(台灣)
    本站在 package.json 加上 engines:node 24.x
    本站 git 紀錄
  8. 未公開
    Brotli 漏洞的觸發細節、經由哪些 API 路徑可以碰到、是否已有人利用
    官方公告沒有觸發細節,也沒有回報野外利用;SecurityOnline 整理時寫目前沒有已確認的公開 PoC

修補從發布到我們自己動手,隔了大約 15 個小時;而且動手的那一步,只是把主版本鎖住。後面會講為什麼這還不夠。

怎麼發現

官方公告沒有寫 CVE-2026-111497 是怎麼被發現的,只寫了回報者是 Node.js 核心維護者 mcollina、修補者是 aduh95。修補內容是 cherry-pick 上游 Brotli 的一個 commit,加上一個把「區塊切換格式錯誤」這種錯誤碼開放給 JavaScript 層的小改動。兩個 TLS 主機名稱繞過與 dns.resolve 的問題,回報者是外部研究者。

eMudhra 那一條則完全是另一條線:10 月 17 日(週六)有研究者通報 eMudhra 的八把中繼憑證私鑰外洩,瀏覽器在一兩天內封鎖。Node.js 預設的 TLS 不檢查憑證撤銷清單,所以 eMudhra 撤銷了憑證,對 Node 程式來說等於沒有;只有更新 Node 內建的根憑證與封鎖清單,才擋得住拿那幾把私鑰簽出來的假憑證。這次的發布說明裡就有「tls: reject chains containing blocked public keys」與「crypto: update root certificates to NSS 3.131.1」兩項。

攻擊者怎麼做到

到這裡,其實已經足夠理解整起事件。如果你關心的是該怎麼避免,可以直接往「如何避免」繼續閱讀。如果你想知道公開資料能還原到哪一步,下面開始進入技術拆解。

白話結論:Node 不會自己去解壓縮 Brotli,所以光是「跑 Node」不等於中招。要在射程內,你的程式或某個套件必須會解開一段攻擊者能控制的 Brotli 資料;而現代的 fetch 遇到伺服器回 Content-Encoding: br,會自動替你解壓縮。

為什麼「替使用者抓網址」的服務最危險?

因為 Brotli 資料有兩個方向可以進來,而 WAF 只看得到其中一個。

  • 流入:攻擊者把 Brotli 壓縮過的內容放在請求裡送給你,而你的伺服器或某個中介套件會解開它。這個方向走得過 WAF,Vercel 說它當天就在 WAF 加了規則。
  • 流出再流入:你的伺服器主動去 fetch 一個網址,對方回一段 Brotli 壓縮的回應,fetch 自動解壓縮。這個方向是你自己發起的連線,WAF 看不到;Vercel 的原話是「只有執行環境的修補涵蓋抓回來的回應」。

所以會替使用者抓任意網址的功能,像是連結預覽、webhook 測試按鈕、圖片代理、RSS 爬蟲、AI 代理的網頁抓取工具,都應該排在升級清單的最前面。Vercel 另外點名:自架的 Next.js 圖片最佳化不會擋 Brotli 回應。

深入閱讀對照 MITRE ATT&CK:入口兩格有官方文字,後面三格空白野外利用、橫向移動與損失皆未公開
發生了什麼 · MITRE ATT&CK T1190
攻擊者送出 Brotli 壓縮的請求內容給對外的 Node 服務,若服務或中介套件會解壓縮,就碰到 CVE-2026-111497。官方標題寫可遠端執行程式碼。
當時留下的訊號
WAF 或反向代理上,Content-Encoding: br 的請求內容在你的服務本來不該收到的地方出現。
能擋下它的控制
升級到修補版;不需要的話,不要在伺服器端解壓縮請求內容。

五格裡只有前兩格有官方或廠商的文字,後三格是取得執行權之後的一般形狀,不是本次事件的紀錄。

這次外洩了什麼

這是一次修補更新,不是外洩事件,目前沒有任何公開的受害案例。下表列的是「如果被利用,哪些憑證會在射程內」,全部是推論或空白。

leaked credentials這次外洩了什麼:服務、用途、存在形式
服務憑證類型用途存在形式放在哪權限範圍狀態
跑在未修補 Node 上的任何服務環境變數裡的 API 金鑰、資料庫連線字串、session 密鑰、雲端存取金鑰服務本身的對外整合與身分驗證程序環境變數與記憶體Node 程序的記憶體前提是服務會解開攻擊者控制的 Brotli 資料;Vercel 說已有研究者示範記憶體洩漏無公開濫用
以 IP 位址發起 TLS 連線的 Node 用戶端連線時送出的 API 權杖、Basic 認證密碼、Cookie呼叫內部服務或第三方 APIHTTP 標頭網路傳輸中前提是攻擊者站在網路路徑中間,並利用 CVE-2026-105483/106069/106072 冒充對方無公開濫用
使用啟動快照或單一執行檔(SEA)的 Node 程式用 crypto.randomUUID()/randomInt() 產生的識別碼或權杖請求 ID、一次性權杖、邀請碼等字串每次啟動都重複的亂數快取CVE-2026-106074:每個程序重複同樣的值;一般 node 指令啟動不受影響無公開濫用
未更新根憑證的 Node 用戶端對外 HTTPS 連線的內容(含權杖)所有對外 API 呼叫TLS 連線網路傳輸中攻擊者若拿 eMudhra 外洩私鑰簽出假憑證;Node 預設不檢查撤銷,只有更新根憑證與封鎖清單才擋得住無公開濫用
實際被偷的憑證未公開———目前沒有任何公開的利用案例或外洩報告無公開資訊
憑證本身已遮蔽或失效;這裡只說明它是哪個服務、拿來做什麼、以什麼形式存放,讓你能對照自己的環境。

如果你的服務在射程內又來不及升級,第三欄那幾種東西就是你要預先準備輪替的清單。

證據等級

能證明的三件事是:修了什麼、哪幾版修了(含 eMudhra 的處理)、Node 20 不會修。只能推的是射程與可利用性。沒人講的有三件。

他們怎麼處理

照官方公告排一次。Node.js 專案先在公告頁預告發布日期,10 月 21 日同時發布三條版本線,公告逐條列出 CVE、嚴重度、影響版本、回報者與修補者,並附三份發布說明的連結;沒有觸發細節,也沒有替停止支援的 Node 20 出修補。同一批更新順手處理了 eMudhra 的憑證問題,以及 c-ares、OpenSSL、SQLite、Undici 這些內附套件的已知漏洞。

平台端的處理以 Vercel 最完整:當天在 WAF 加規則擋流入的攻擊流量,逐步替託管的 22.x、24.x 執行環境換上修補版,使用者不用改設定;Node 20 專案則必須自己改版本重新部署。公告也明講 WAF 擋不到函式主動抓回來的回應,以及自架 Next.js、自建容器、CI runner、本機開發環境都要自己升級。

哪裡做對,哪裡做錯

Node.js 專案做對的地方是節奏:三條線同一分鐘發布,公告格式固定,每一條都寫清楚影響哪幾條線,維護期的 24 也照樣修。eMudhra 的處理很快,從瀏覽器封鎖到 Node 內建根憑證更新只隔了三天。該改的地方是那八個月:上游 Brotli 二月就有修正,Node 十月才帶進來;就算當時沒人知道它是安全問題,這也說明「內附的第三方函式庫跟上游差多少」是一個需要被追蹤的數字。

使用者這一端,最常見的錯是把「設定了版本」當成「已經修好」。engines 寫 24.x、Dockerfile 寫 FROM node:24、PaaS 選 Node 24,三者都只保證主版本;真正換上修補版的是那一次重建。我們自己就是這樣:鎖了主版本,修補版還沒核對。

如何避免

這一節寫給有好幾個 Node 服務、但沒有專職維運的團隊。

當天就能做的,是把清單做出來。每一台主機、每一個容器映像、每一條 CI、每一台開發機,各跑一次 node -v,列成一張表:服務名稱、Node 版本、怎麼裝的(官方二進位、發行版套件、Docker 基底映像、PaaS 託管)、會不會替使用者抓外部網址。版本低於 22.23.4/24.22.1/26.12.1 的標黃,20.x 以下的標紅。

升級順序照風險排,不是照方便排:

  • 第一批:會替使用者抓外部網址的服務(連結預覽、webhook、圖片代理、爬蟲、AI 代理的抓取工具),以及還在 Node 20 以下的對外服務。
  • 第二批:其他對外服務、以 IP 呼叫內部 TLS 服務的元件、用啟動快照或 SEA 打包的程式。
  • 第三批:CI runner、內部工具、開發機。

每一批的動作都是三拍:改版本,重建(Docker 用修補後的基底映像、PaaS 觸發重新部署、SEA 重新打包),再到執行環境裡印出 process.version 確認。第三拍最常被省略,也是我們自己還沒做完的那一拍。

一個月內,把「鎖主版本」變成「鎖修補版本」。Dockerfile 寫到 node:24.22.1 或固定 digest;.nvmrc 或 .node-version 寫完整版本號;PaaS 若支援指定完整版本就指定。好處是下一次安全更新出來時,升級是一個看得到的 commit,而不是一次碰運氣的重新部署。

這一季要建的是流程:訂閱 nodejs-sec 郵件列表;每次安全更新出來,48 小時內完成第一批;每季盤點一次停止支援的版本,Node 22 的停止支援日是 2027 年 4 月 30 日,現在就該排進明年第一季。

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

Node.js 本身免費,這次的成本幾乎都是人力與重建。下表除了官方與廠商公開的價格,其餘都是本站估算。

cost升級一次要花多少,跟不升級比
項目用量單價期間US$NT$舉證
Node.js 22.23.4/24.22.1/26.12.1所有環境開源,US$0持續0.000nodejs.org 免費下載
盤點所有環境的 Node 版本(主機、映像、CI、開發機)
估:環境越分散越久;做過一次之後,下次只要更新表格
假設 1 人 × 半天估 NT$5,000/人日一次78.002,496本站估算
升級、重建、確認(約 5 個服務)
估:已經鎖修補版本、有 CI 的團隊會快很多
假設 1 人 × 1 天估 NT$5,000/人日每次安全更新156.004,992本站估算
從 Node 20 遷移到 22 或 24
主版本跳躍可能碰到原生模組重編、API 移除,無法通用估算
依相依套件與原生模組數量人力一次——無法通用估算
Vercel WAF 對本漏洞的規則
只擋流入的請求,不擋函式抓回來的回應
Vercel 上的所有專案US$0,自動套用持續0.000Vercel 公告
停止支援版本的商業延長支援
Node.js 官網列有 OpenJS Ecosystem Sustainability Program 合作廠商;價格未公開
Node 20 以下依合作廠商報價年約——nodejs.org 頁首說明
對照:資料外洩的平均總成本
對照用,不是本次事件的金額
全球受訪組織平均US$4.44M/起2025 年度報告——IBM Cost of a Data Breach Report 2025
合計(僅可證明列)0.000
匯率假設 1 USD ≈ NT$32。單價為公開牌價或帳單實付,來源:Node.js 官方、Vercel 公告、IBM 2025 報告、本站估算(2026-10)。「舉證」欄標明每筆損失的證據來源與等級( 可證明 推論 缺口)。

第二、三列加起來大約 NT$7,500,就是一個小團隊把這次更新做完整的成本;把版本鎖到修補號之後,下一次會更便宜。

你可以學到什麼

站在攻擊者那一側看,執行環境的漏洞是最好的投資:不用研究你的程式,只要你的版本號落後。修補一公開,差異就是一份說明書;而大部分團隊的版本號是「上次部署那天平台剛好給的那一版」,沒有人知道是哪一版。對他來說,最好的目標是一個會替使用者抓網址、又跑在舊版 Node 上的服務,因為那條路連 WAF 都看不到。

跟我們的防暴筆記對照

最直接的對照是同一天的〈PHP 核心兩個 RCE 在修補前外洩〉。兩個執行環境同一天出緊急修補,共同的問題都不是漏洞本身,而是「停止支援的版本不會修」:PHP 那邊是六成對外主機跑 8.1 以下,Node 這邊是 20 已經停止支援半年。兩篇的第一步一樣:先知道自己每一台跑哪一版。

第二個對照是我們自己的 INC-2026-0915(「關機前套用更新」這支程式,跑了 17,613 分鐘)。那一次是網頁程式被打穿之後,攻擊者在主機上潛伏了 356 天,靠的是沒人看網頁程序底下多了什麼。如果 Brotli 這個洞被利用,取得的就是 Node 程序的權限,之後的形狀會很像:異常子程序、陌生排程、CPU 長時間滿載。修補是第一道,主機層的偵測是第二道。

第三個對照是早上剛寫的〈替你保管所有 AI 金鑰的那一層,被換成了竊密程式〉。那篇的教訓是「固定版本與雜湊,不追浮動標籤」;這篇是同一句話的另一面:固定版本不只是為了不被換成壞的,也是為了確定自己已經換成好的。

攻擊者這次的盤算
  • 找會替使用者抓網址的 Node 服務,架一台回 Brotli 壓縮內容的伺服器等它來抓;這條路 WAF 看不到。
  • 比對修補前後的原始碼差異,還原觸發條件;修補公開之後,這只是時間問題。
  • 鎖定還在 Node 20 以下的服務,那些永遠不會有官方修補。
  • 取得執行權之後,先拿 Node 程序環境變數裡的金鑰。
lessons本案的 4 個教訓
  1. 01
    設定了版本不等於已經修好。engines、FROM node:24、PaaS 的版本選單都只鎖主版本,真正換上修補版的是那一次重建,而確認它的唯一方式是在執行環境裡印出版本。
  2. 02
    WAF 擋得到別人送進來的東西,擋不到你自己抓回來的東西。會替使用者抓網址的功能,是執行環境漏洞最直接的入口,應該放在隔離的服務裡並優先升級。
  3. 03
    停止支援的版本,每一次安全更新都受影響,而且永遠不會修。Node 20 在今年 4 月就停止支援,Node 22 是 2027 年 4 月;停止支援日要排進年度計畫,不是等出事。
  4. 04
    內附的第三方函式庫會落後上游。這次 Brotli 的修正上游二月就有,Node 十月才帶進來;你用的執行環境、映像、套件,都有同樣的落差。
keywords重點學習:最需要學習的 10 個關鍵字10 個
  1. 01
    Brotli
    Google 開發的壓縮格式,HTTP 回應常用 Content-Encoding: br;這次的漏洞在 Node 內附的 Brotli 解碼器。
  2. 02
    越界寫入(out-of-bounds write)
    程式把資料寫到配置範圍以外的記憶體;CVE-2026-111497 就是這一類,官方標題寫可遠端執行程式碼。
  3. 03
    Content-Encoding
    HTTP 標頭,告訴對方內容用什麼壓縮;fetch 看到 br 會自動解壓縮,這是抓回來的回應也在射程內的原因。
  4. 04
    SSRF 型功能
    伺服器替使用者去抓一個網址的功能,例如連結預覽、webhook 測試;這次它們是最直接的入口。
  5. 05
    EOL(End-of-Life)
    停止支援的版本不再收到任何修補;Node 20 已於 2026-04-30 停止支援。
  6. 06
    LTS 維護期(Maintenance LTS)
    Node 偶數版本的最後階段,只修安全與重大問題;Node 24 在 10 月 20 日進入這個階段。
  7. 07
    engines 欄位
    package.json 裡宣告需要哪個 Node 版本;寫 24.x 只鎖主版本,不保證是修補版。
  8. 08
    SEA(Single Executable Application)
    把 Node 程式打包成單一執行檔;CVE-2026-106074 讓這類程式每次啟動重複同樣的亂數,要重新打包。
  9. 09
    憑證撤銷檢查
    確認憑證有沒有被發行者撤銷;Node 預設不做,所以 eMudhra 的撤銷要靠更新內建根憑證才有效。
  10. 10
    cherry-pick
    把上游的某一個 commit 單獨搬進自己的程式碼;這次 Node 用它把 Brotli 的修正帶進來。
try today今天就可以來試試約 15 分鐘

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

  1. 把每個環境的 Node 版本列成一張表(唯讀)
    node -p "process.version + ' ' + (process.release.lts || 'non-LTS')"
    看到什麼代表什麼:在每一台主機、每一個容器(docker run --rm 你的映像 node -v)、每一條 CI 各跑一次,結果記進 node-roster-w3j.csv:服務、版本、安裝方式、會不會抓外部網址。低於 v22.23.4、v24.22.1、v26.12.1 的標黃,v20 以下的標紅。
  2. 找出版本是在哪裡決定的(唯讀)
    grep -rnE '^FROM node|"node":|node-version|nodejs' Dockerfile* package.json .nvmrc .node-version .github zbpack.json 2>/dev/null
    看到什麼代表什麼:看到 FROM node:24、"node": "24.x" 這種只有主版本的寫法,代表實際版本取決於建置那天;改成 node:24.22.1 或固定 digest,下一次升級才會是一個看得到的 commit。什麼都沒找到,代表版本完全交給平台預設。
  3. 找出程式裡會替使用者抓外部網址的地方(唯讀)
    grep -rnE 'fetch\(|axios\.(get|post)|got\(' --include='*.js' --include='*.ts' --include='*.mjs' src app lib 2>/dev/null
    看到什麼代表什麼:逐行看網址是寫死的固定網域(LINE、Google、自己的 S3),還是來自使用者輸入或資料庫。後者就是第一批要升級的服務,也該限制目的網域。
  4. 用發行版套件裝 Node 的主機,看套件版本(唯讀)
    dpkg -l nodejs libbrotli1 2>/dev/null || rpm -q nodejs brotli 2>/dev/null
    看到什麼代表什麼:有輸出代表這台的 Node 是發行版打包的,node -v 的版本號可能看不出 Brotli 有沒有修;以 Debian、Ubuntu、RHEL 的安全公告為準。
  5. 確認有沒有用啟動快照或單一執行檔打包(唯讀)
    grep -rnE 'build-snapshot|experimental-sea-config|postject|sea-config' package.json scripts .github 2>/dev/null
    看到什麼代表什麼:有輸出代表 CVE-2026-106074 跟你有關:升級 Node 之後要重新打包,否則每個程序仍會重複同樣的 randomUUID。沒有輸出就跳過。
  6. 部署後到正式環境確認實際版本(唯讀)
    看平台的建置紀錄裡 Node 的版本行,或在服務的健康檢查端點回傳 process.version
    看到什麼代表什麼:看到 v24.22.1(或 v22.23.4、v26.12.1)才算修好。看到更舊的 24.x,代表平台用了舊的建置快取,要清快取重新部署。這一步是我們自己還沒做完的那一步。

回到那張表

這篇最有用的東西,不是 10 個 CVE 的清單,是那張「每個環境跑哪一版 Node」的表。有了它,下一次安全更新出來,你知道要升哪幾台、先升哪一台、升完怎麼確認;沒有它,每一次都是從「我們有用 Node 嗎」開始問起。

我們自己的表還沒填完:正式站鎖了 24.x、修補版待核對,本機開發機還停在已經停止支援的 23。寫這篇的目的之一,就是逼自己把它填完。

來源

分享
精選拆解直送信箱

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

延伸閱讀

新聞稿拆解

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 解碼器副本,每個都必須各自更新。

  • 2026/10/24
  • 每日拆解
新聞稿拆解

PHP 核心兩個 RCE 在修補前外洩,六成對外主機沒有官方修補版可裝

PHP 官方 10 月 21 日釋出 8.5.12、8.4.27、8.3.36、8.2.35,修補兩個 CVSS v4.0 9.2、不需登入就能遠端執行程式碼的漏洞。編號與「RCE」先在禁運期結束前外洩,官方隔天才正式確認;資安公司也回報修補釋出前後已有野外攻擊。真正麻煩的是另一個數字:依 Shodan 統計,回報版本的對外 PHP 主機有 59% 跑 8.1 以下,沒有官方修補版可裝。(2026-10-22 更新)

  • 2026/10/21
  • 每日拆解