示意圖:工作台被迫中途清空,只收拾了一半,下一位接手的人拿起了上一位留下的零件

成因概念

只講概念與影響範圍:為什麼只能更新 PHP。不寫觸發方式或可重現的流程。

一句話

PHP 處理網頁請求時,若在記憶體不足或致命錯誤的當下被迫立刻中斷(研究者稱為 bailout),可能留下只初始化一半或已經過期的內部狀態。之後的清理或下一個請求,可能把這份殘留當成有效資料。

兩個 CVE 是同一類失敗:

註:CVE
CVE
這次是 CVE-2026-109618 與 CVE-2026-109619。外洩貼文曾把分數寫成 10.0,官方 CVSS v4.0 是 9.2。
CVE 官方名稱 官方在說什麼
CVE-2026-109618 RCE via OOM corruption 記憶體不足的處理可能在內部請求資料只初始化一半時中斷 PHP,請求清理可能把無效資料當成有效
CVE-2026-109619 RCE via stale global state 請求擁有的內部狀態可能在記憶體釋放後仍存活,同一 worker 的後續請求可能在正常初始化重設前使用它

Imperva 把兩者都歸為 CWE-824(存取未初始化的指標),並提醒:能從遠端觸發,和能穩定變成 RCE,難度不是同一件事。這不降低「必須更新」的結論。

註:CWE-824、RCE
CWE-824(CWE)
Imperva 把這次歸成 CWE-824,意思是程式去用了一個還沒準備好、不能當真的內部指標。
RCE
Remote code execution,遠端程式碼執行。未登入的呼叫者有機會讓伺服器執行他指定的指令。這次兩個 CVE 的官方後果都包含未授權 RCE;名稱裡的 shell 不代表每一個請求都必然走到那一步。

為什麼應用程式擋不住

問題可以發生在應用程式碼開始執行之前。Wiz 與 Imperva 都用「一行 echo 的網頁」說明這點:自家程式再乾淨,也會曝險。所以 WordPress、Drupal、Magento 的應用更新不是這次的修補,應用層的防護也擋不住這個時機。

會反覆處理許多請求的 worker 是關鍵:下一個請求可能在正常初始化把狀態清掉之前,就碰到上一個請求留下的殘留。這也是修補之後一定要重啟所有 worker 的原因。

註:worker
worker
處理網頁請求的 PHP 行程。同一支 worker 接下一個請求時,可能在正常初始化把殘留狀態清掉之前就用到它。修補後要重啟所有 worker。

三個被點名的面向

下面只說明「在哪裡、官方如何對應、擋得住什麼」。

1. session upload-progress

PHP 預設會記錄上傳進度,對應設定 session.upload_progress.enabled,出廠為開。這是已展示路徑裡常見的遠端入口,但不是唯一入口。Wiz 指出後果分兩類:記憶體破壞以致 RCE,以及經回應裡的 session cookie 讀到行程記憶體;後者在應用程式從未啟用 session 時仍成立,讀到的可能包含密碼、token 與 API 金鑰。

註:上傳進度、session
上傳進度(session upload-progress)
對應設定 session.upload_progress.enabled,出廠為開,是這次已被確認的遠端入口之一,但不是唯一入口。暫時措施是在請求開始解析前生效的設定裡關掉它,並重啟所有 worker;ini_set() 與 .user.ini 來不及。它擋不了 OPcache 與 backtrace 那些變體。
session
伺服器端狀態,用來把一連串請求認成同一位訪客。這次與上傳進度、PHPSESSID 有關;應用程式沒有呼叫 session_start() 時,讀到行程記憶體這件事仍可能成立。

官方暫時措施是在請求解析前就生效的設定裡關掉它並重啟所有 worker。它擋不了下面兩個面向。

2. OPcache

OPcache 把編譯結果放在可重複使用的共享快取。請求若在錯誤時刻中斷,快取裡可能留下已配置卻沒正確完成的項目,後續請求可能誤用。因為狀態在共享快取裡,影響不限於「剛好打到同一支 worker 的下一個請求」。JFrog 寫明:關掉上傳進度不會蓋住這一條。

註:OPcache
OPcache
把已編譯的程式放進可重複使用的快取。請求若在錯誤時刻中斷,快取槽可能處於已配置卻未正確發布的狀態,後續請求可能誤用。關掉上傳進度不會蓋住這條路。

3. 致命錯誤 backtrace

致命錯誤留下的回溯資訊,可能在所屬記憶體釋放後仍被當成有效狀態。PHP 8.5 的官方暫時措施是 fatal_error_backtraces=0 並重啟所有 worker,只擋這條已確認的路徑。

註:回溯
回溯(backtrace)
致命錯誤留下的回溯資訊,可能在所屬記憶體釋放後仍被當成有效狀態。PHP 8.5 的暫時措施是 fatal_error_backtraces=0 並重啟所有 worker。官方說這只擋已確認的 backtrace 路徑。

影響面

兩類後果:未驗證的遠端執行程式,以及讀取 PHP 行程記憶體。記憶體裡可能有其他請求或伺服器的密碼、驗證 token、API 金鑰、憑證。讀取記憶體不需要先達成 RCE。不需要應用程式帳號。不限 WordPress、Drupal、Joomla,連 Hello World 也算。WAF、CDN 與主機商規則不能取代更新。判斷步驟見我受影響嗎?。

註:WAF、CDN
WAF
Web Application Firewall。Cloudflare 自 2026-10-21 03:02 UTC 對免費與付費客戶預設上線規則,仍必須更新 PHP。已看到有人變造請求試圖避開規則。研究團隊寫,WAF、CDN 或主機商規則不能取代更新。
CDN
Content Delivery Network。研究團隊寫,CDN、WAF 或主機商的規則視廠商與路徑而定,不能取代更新 PHP。Vercel、Cloudflare、Akamai 都有自己的規則,直接打到源站的請求可能不在涵蓋範圍。

Calif 經 Sansec 列出曾展示未授權 RCE 的應用:Magento、WordPress、Drupal、Joomla、MediaWiki、Roundcube、phpMyAdmin、Nextcloud、Laravel、Symfony、WHMCS。這份清單說明影響面,不是說其他應用就沒事。

程式碼被認為可回溯到 PHP 5.4.0(2012),但並非每一個歷史版號都經過逐一驗證;Wiz 稱過去十年發布的每個版本至少受其中一個漏洞影響。兩句是研究者的結論,不是官方的完整版本矩陣。

來源

查詢日期:。官方公告優先列出;內容如與 PHP 官方公告不一致,以官方公告為準。