跳至主要內容

PHP 兩支 9.2 漏洞在補丁發布前外洩:PHP2Shell 事件始末、AI 挖洞衝擊與應變全紀錄

2026 年 10 月底,PHP 爆發兩支 CVSS 9.2 的重大 RCE 漏洞(CVE-2026-109618 與 CVE-2026-109619),波及全球近七成網站。因協調發布機制破裂,修補尚未推出便遭提前外洩,引發全球工程師關站避險。本文完整梳理底層記憶體成因、秒級外洩時間軸、AI Agent 挖洞帶來的負七天利用衝擊,以及實戰防禦與緩解全指南。

The Walking Fish 步行魚
The Walking Fish 步行魚 ·
9538 字 · 閱讀時間: 22 分鐘 · ...
PHP 兩支 9.2 漏洞在補丁發布前外洩:PHP2Shell 事件始末、AI 挖洞衝擊與應變全紀錄
Fig. 01 — PHP 兩支 9.2 漏洞在補丁發布前外洩:PHP2Shell 事件始末、AI … FEATURED IMAGE

TL;DR 快速摘要
2026 年 10 月底爆發的「PHP2Shell」事件,源於 PHP 底層在記憶體不足(OOM)與中斷處理時的狀態收尾缺陷(CVE-2026-109618 與 CVE-2026-109619,CVSS 4.0 9.2)。本事件最致命之處不在於存在 14 年的漏洞本身,而在於保密協調機制(Embargo)全面破裂,導致修補程式發布前 6 小時攻擊代碼已流竄全網,全球近七成網站被迫關站乾等。更深遠的警訊在於:頂尖前沿 AI 模型大幅降低了複雜利用鏈的組合門檻,漏洞利用窗口已從過往的 63 天縮減至「負七天」,象徵自動化攻防正式進入無人區。

十月即將結束,但全球的工程師與資安團隊幾乎都被同一場驚心動魄的資安危機給綁架了——這就是被社群稱為「PHP2Shell」的 PHP 遠端程式碼執行(RCE)重大漏洞。

這件事情最讓人崩潰的核心問題,其實不在於漏洞本身有多刁鑽,而是官方補丁根本還沒封裝完成,漏洞細節與利用資訊就已經被各方提前外洩。面對鋪天蓋地的攻擊探測,全球無數團隊只能紛紛切斷服務、掛出維護公告,在完全沒有補丁可打的黑暗中苦等官方釋出更新。

相信這幾天大家多多少少都被這則新聞洗版了。雖然平時大家常開玩笑說 PHP 是個效率低下的老古董,但事實上全球至今依然有近七成(約 69.3%)的網站跑在 PHP 之上,影響層面可謂極度廣泛。

我也算是這波風暴中的小小受害者之一。雖然我目前主要維護的核心系統並未使用 PHP,但公司裡一些前人留下來的 遺產 依然有在使用。專案數量雖然不多,但在沒有官方補丁的真空期,也只能硬著頭皮逐一清查、手動應變,最後一路折騰到凌晨一點多才得以入睡。


影響範圍:為什麼連 Hello World 也逃不過?

這次事件核心牽涉兩支編號相連的重大漏洞:CVE-2026-109618 與 CVE-2026-109619。

兩者的 CVSS v4.0 官方評分皆高達 9.2(Critical),波及範圍橫跨從 2012 年發布的 PHP 5.4 起、直到當前最新版的全部 PHP 系列。

因為這屬於 PHP 直譯器本身的底層漏洞,所以無論上層使用的是當紅的現代框架(如 Laravel、Symfony),抑或是以 PHP 為基底的龐大開源生態(如 WordPress、Drupal、Joomla、Nextcloud),通通都在潛在受影響範圍內。

資安廠商 Imperva 在其分析報告中給出了一個非常直觀且震撼的範例:哪怕你的後端端點極其單純,裡面只寫了一行回傳 echo "OK"; 或 echo "Hello World!";,依然有機會中招被奪取控制權。

Imperva 報告指出:即使端點僅有 echo OK 依然能被觸發攻擊

為什麼在應用層外面套上再多層商業邏輯防護都無濟於事?

關鍵在於觸發點位於 HTTP 請求的底層解析階段。當請求送達時,PHP 核心在尚未跑進你的任何業務程式碼之前就已經崩潰了。根據官方資安公告原文指出,未經身分驗證的惡意請求(Unauthenticated Request)能在任何應用層程式碼執行前便觸發記憶體破壞。

官方點名受影響的五大執行介面(SAPI)包含:PHP-FPM、Apache mod_php、php-cgi、FrankenPHP 以及 LiteSpeed。修補版本則為 10 月 21 日緊急發布的 8.5.12、8.4.27、8.3.36 與 8.2.35。

關於評分口徑,目前社群流傳著三種版本:官方給出的 CVSS v4.0 基準為 9.2,NVD 後續自行評定的 CVSS 3.1 為 9.8,而早期社群爆料聲稱的 10.0 滿分則是未經核實的錯誤數值。

NVD 官方存檔:顯示官方 CVSS 4.0 9.2 與 NVD 自評 3.1 9.8 並列

另外說明「PHP2Shell」這個稱號的由來:這個名稱並非 PHP 官方所取,而是源於資安情報團隊 Hadrian 在通報中捕捉到的一款外洩自動化攻擊工具名稱,隨後被各大科技媒體廣泛採用為整起事件的代稱。

Hadrian 通報指出:PHP2Shell 暱稱源自外洩的自動化攻擊腳本


核心機制剖析:官方的兩種失效模式

這次漏洞的利用機制整體而言相當繁複,各家資安機構在細節上的描述也略有差異。PHP 官方在公告中將這兩支漏洞精準劃分為兩種不同的失效模式:

  1. CVE-2026-109618:透過 OOM Corruption(記憶體耗盡破壞)導致的遠端指令執行。
  2. CVE-2026-109619:透過 過時全域狀態(Stale Global State) 導致的遠端指令執行。

這兩者密切相關但不能劃上等號,本質上皆屬於記憶體管理錯誤:PHP 在伺服器記憶體不足或異常中斷的特定條件下,存取了不該再存取、甚至已經被釋放的記憶體位址。

生活化比喻:Google 地圖上的幽靈店家
這種記憶體失效就像 Google 地圖上一間早在一年前就已停業倒閉的店家,但地圖上的地標與導航標記卻從未被刪除。
隨後不知情的顧客順著舊標記尋訪到該位址,才發現現場早已換成新開的店家,或者門口早已貼滿招租紅紙。若此時有心人士刻意偽造這間店家的身分,就能誘使不知情的訪客踏入陷阱。

圖解:CVE-2026-109618 / 109619 記憶體損毀與收尾劫持執行流程
flowchart TD A["惡意 HTTP 請求
(Multipart / Upload Progress)"] --> B["PHP 核心請求解析階段
(尚未執行使用者應用程式碼)"] B --> C{"記憶體耗盡 (OOM)
或請求異常中斷"} C -->|longjmp 暴力跳出| D["跳過正規收尾程序
(Cleanup Skipped)"] D --> E["留下未初始化結構 或 懸空指標
(Stale State / Dangling Pointer)"] E --> F{"不同 SAPI 的收尾處置"} F -->|Apache mod_php| G["無條件執行 php_request_shutdown
遍歷髒記憶體 ➔ 劫持執行流 (RCE)"] F -->|PHP-FPM| H["觸發 FPM_EXIT_SOFTWARE
整隻 Worker 程序丟棄重啟"]

CVE-2026-109618:記憶體耗盡(OOM Corruption)之路

第一條路徑是記憶體耗盡(Out of Memory, OOM)。

當 PHP 在記憶體不足的當下被迫中斷時,請求內部的資料結構往往只初始化到一半;然而隨後的清理流程卻誤把這些半拉子、尚未初始化的資料當成合法物件進行遍歷與釋放。

造成這個致命問題的根源,在於 PHP 核心處理 OOM 時採用了 C 語言的 longjmp() 機制。這種長跳躍會直接跳過堆疊展開(Stack Unwinding)與局部變數收尾,一路狂飆回最外層 setjmp 標記的進入點,導致做到一半的記憶體狀態無人清理。

資安團隊 Calif 在長篇分析中貼出了這段位於 _zend_hash_str_add_or_update_i 的致命程式碼:

1
2
3
nNumUsed++;                            // 1. 已使用計數搶先遞增
nNumOfElements++;                      // 2. 元素總數搶先遞增
bucket->key = zend_string_init(...);   // 3. 若此處發生 OOM,直接透過 longjmp 脫逃!

注意這三行程式碼的先後順序:計數器已經往前推進了,但該筆 bucket 裡面的指標依然是一片混沌。

當請求結束進入資源回收階段時,PHP 直譯器老老實實地依照 nNumUsed 的數字一路向後迭代釋放,將那些根本未初始化的野指標當成正常資料處理,引發嚴重的記憶體毀損。

官方公告中特別附帶了一句值得深思的定性:

The failed allocation does not need to be related to the invalid memory.
(觸發分配失敗的那次記憶體操作,與後來被非法讀取的那塊記憶體,完全不需要是同一個物件。)

攻擊者如何用極低成本逼出 OOM?

許多人直覺認為要撐爆伺服器記憶體,攻擊者必須上傳幾十 MB 甚至上百 MB 的龐大檔案。但在實戰中完全不需要傳大檔!

攻擊者只需要發送一個帶有大量深層巢狀欄位的 multipart/form-data 請求。例如在表單中狂塞數百筆空檔案欄位,欄位名稱故意寫成 files[a][b][c][d][] 這類四、五層深的維度。

因為 PHP 核心即使沒有真的儲存檔案、僅接收到空字串的 filename,在解析 Multipart 表單時依舊會替每個層級老老實實地建立完整的 $_FILES 關聯陣列條目。

更關鍵的是:這種空檔名字段完全不計入 max_file_uploads 的上限防護!

Calif 的測試數據指出:只需要發送數百筆這類空檔案欄位,整個 HTTP 請求封包體積甚至低於預設的 post_max_size(8 MB),就能輕易將伺服器預設的 128 MiB Heap 空間徹底撐爆,引爆 OOM 漏洞。

Calif 研究指出:WordPress、Laravel、Nextcloud 等 11 種知名系統皆可被打通

Calif 在受控環境下,確認能成功實現未驗證身分 RCE 的主流系統高達十一種,包含 WordPress、Laravel、Drupal、Nextcloud、phpMyAdmin 與 Symfony 等。


CVE-2026-109619:過時全域狀態與懸空指標

第二條路徑是 109619,其本質是 PHP 行程在中途中斷後,遺留在 Worker 行程中的過時全域狀態(Stale Global State)。

無論是 Apache 的 mod_php 還是現代主流的 PHP-FPM,為了效能考量,背後的 Worker 行程本來就會重複調度,持續接收並處理一個接一個的 HTTP 請求。

目前全網研究最透徹的一條利用鏈,與 PHP 一項內建的友善功能密切相關——Session Upload Progress(上傳進度回報)。

上傳大檔案時,前端網頁常會顯示即時進度條,好讓使用者確認進度、緩解焦慮。這項出於體貼的實用功能,自 PHP 5.4 起在官方預設設定中就是預設開啟的(session.upload_progress.enabled = On)。

在上傳開始時,哪怕開發者的業務程式碼從頭到尾沒寫過 session_start(),PHP 核心也會主動在全域建立 Session 資料以記錄已接收的位元組。

問題在於:如果這時剛好發生 OOM,請求在解析途中被迫中斷,無法走完正規的收尾程序。於是 Session 的內部全域指標依然懸空指向那塊已經被釋放掉的記憶體位址,形成危險的懸空指標(Dangling Pointer)。

當下一個 HTTP 請求被同一個 Worker 行程接手時,在 PHP 重新初始化這些狀態之前,直譯器就搶先讀取了這份過期髒資料。

1
2
3
4
5
6
[請求 A:Producer] 
上傳觸發 Session 紀錄 ──> 遭遇 OOM 異常中斷 ──> 留下懸空指標 (Dangling Pointer)
                                                        │
                                                        ▼
[請求 B:Consumer] 
被同一個 Worker 接手 ──> 堆積噴灑覆寫該記憶體 ──> 劫持執行流程 ──> 伺服器權限 RCE

攻擊者只要精密規劃兩次請求(一個 Producer 製造懸空指標、一個 Consumer 進行利用),透過 Heap Grooming 在釋放位置填入惡意建構的資料結構,就能劫持程式執行流,以 Web 伺服器權限執行任意系統指令。

GHSA-109619 官方公告:揭示過時全域狀態與雙請求利用鏈

需要鄭重澄清的是:Session Upload Progress 僅僅是已被證實的攻擊路徑之一。官方修補實際上覆蓋了更多未被清理乾淨的全域狀態,因此單純在設定檔關閉上傳進度,並不能保證百分之百高枕無憂。


命運大不同:Apache mod_php 的必死清理 vs PHP-FPM 的丟棄重生

同樣一發精心構造的惡意請求,打在兩種不同的伺服器架構上,結果卻可能天差地遠。決定系統是否當場淪陷的關鍵,往往不是你的商業代碼,而是你所選用的 SAPI(Server API)。

比較項目 Apache mod_php PHP-FPM
架構特性 PHP 直譯器作為模組嵌入 Apache 行程 獨立的 FastCGI 行程池管理
中斷處理 強制執行 php_request_shutdown(NULL) 觸發 FPM_EXIT_SOFTWARE 機制
後續行為 堅持遍歷並清理畸形的 $_POST 與 $_FILES 直接終止並丟棄整個 Worker 行程
漏洞威脅 髒資料被主動讀取,直接觸發 RCE 壞狀態隨 Worker 一併被銷毀
官方風險定性 最高風險(已具備未驗證 RCE 示範) 具理論風險,但完整 Exploit 極難實現

Apache mod_php 的處理策略極其固執:即使請求在啟動初期就因 OOM 崩潰,它依然會無條件呼叫收尾函式,這意味著它一定會去動手清理那團毀損的陣列,正中攻擊者下懷。

相反地,PHP-FPM 在遇到這類異常時會觸發 FPM_EXIT_SOFTWARE,直接把出事的 Worker 整個殺掉重啟,壞死狀態連同 Worker 一起灰飛煙滅,後續程式碼根本沒有機會去觸碰那塊髒記憶體。

官方在公告中的措辭極為嚴謹:FPM 並非天生免疫,而是目前在原始碼分析上確認具備風險,但針對 FPM 的端到端穩定利用鏈尚未被公開證實。

GHSA-109618 原文揭露:說明不同架構下的狀態殘留風險


為什麼這次風波鬧得這麼大?三大關鍵推手

回顧整起事件,之所以會在全球資訊圈引爆前所未有的恐慌與震撼,主要來自三大推手:

核心原因一:龐大無比的網站基數與高層關切

如前所述,全球有接近七成的網站後端仍仰賴 PHP(W3Techs 統計為 69.3%)。從 2012 年的 PHP 5.4 一路涵蓋到最新的 8.5 版本,長達 14 年的代碼跨度無一倖免。

事態嚴重到連日本首相高市早苗都在個人 X 帳號上於深夜緊急發文呼籲全國警戒:

這則貼文發布於臺北時間 10 月 21 日晚上 8 點 55 分(日本時間 9 點 55 分),瀏覽量迅速逼近一億次。一國元首公開呼籲「若無法及時套用補丁,請考慮暫時停止網站服務」,足見威脅之嚴峻。

日本首相高市早苗於 X 平台發布緊急呼籲,瀏覽量突破九千萬

核心原因二:保密協調機制(Embargo)全面崩塌與外洩骨牌

整起事件最讓一線工程師與資安人員痛苦萬分的,莫過於保密條款(Embargo)的徹底失控。

在負責任的漏洞揭露流程中,保密期的核心價值在於給予各 Linux 發行版(Debian、Ubuntu、Red Hat)以及雲端主機商足夠的時間完成封裝與測試,好讓補丁在解禁那一刻能同步推送到用戶手中。

然而在這次事件中,骨牌一張接著一張倒下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[10/20 23:20] Hacker News 用戶爆料 2 支 CVSS 10.0 漏洞編號
     │
     ▼
[10/21 03:30] PHP 官方緊急應變,宣布發布時間提前 24 小時
     │
     ▼
[10/21 04:00] 資安團隊 Calif 誤觸發布 PoC 實機影片(引爆社群備份)
     │
     ▼
[10/21 15:41] Chainguard 單方面打破保密條款,公開修復映像檔!
     │
     ▼
[10/21 15:43] 僅 2 分鐘後,Cloudflare 觀測到首波大規模在野攻擊嘗試
     │
     ▼
[10/21 22:00] 官方修補版本陸續推出,全球工程師在黑暗中煎熬了整整 6 小時

1. 爆料開端(10 月 20 日 23:20)
一名名為 petecooper 的使用者在 Hacker News 發表貼文,預告 PHP 即將公布兩支滿分 10.0 的神級漏洞並直接附上 CVE 編號。雖然貼文並未透露技術細節(且版本與分數有誤),但早已引發第一波社群騷動。

Hacker News 早期爆料貼文,引爆社群高度關注

2. 提前解禁與誤發影片(10 月 21 日 03:30~04:00)
PHP 基金會緊急發出通告,決定將原本預定於 22 日的發布時間提前到 21 日晚上 10 點。屋漏偏逢連夜雨,清晨 4 點資安團隊 Calif 意外在社群發布了 PoC 實機示範影片。儘管他們秒刪貼文,但影片早已被社群鏡像備份,大幅加速了攻擊代碼的研發。

PHP Foundation 官方公告記錄:Calif 團隊誤發影片加速了在野研究進程

3. 社群 PoC 點燃烈火(10 月 21 日 10:12)
上午 10 點 12 分,X 帳號用戶 J4ck3LSyN 發布了一則宣稱已具備可用 PoC 的推文,直指利用核心為 session.upload_progress 的 UAF 漏洞。儘管該條路徑後續被證實無法完整兌現 RCE,但已徹底引爆全球白帽與黑帽社群的鑽研狂潮。

J4ck3LSyN 於 X 平台發布 session.upload_progress UAF PoC 貼文截圖

4. Chainguard 的迷之操作與全面失守(10 月 21 日 15:41)
下午 3 點 41 分,距離官方表定解禁還有 6 個多小時,主打供應鏈安全的資安公司 Chainguard 突然做出了一項極具爭議的舉動:他們單方面打破保密協議,公開推送了基於 Wolfi Linux、內建修補的容器映像檔。

這項舉動的災難在於:其他發行版還在趕工打包,黑客卻已經可以透過對比 Chainguard 的映像檔二進位代碼,在半小時內逆向還原出漏洞修補點!

僅僅兩分鐘後的 15 點 43 分,Cloudflare 的全網 WAF 防護網便監測到野外攻擊流量瞬間暴增。全球的開發者在一無所有的狀態下,只能被迫關閉服務、掛上維護頁面,乾等晚上 10 點官方補丁降臨。

PHP Foundation 官方公告直指:Chainguard 單方面打破協議無視數週協調努力

核心原因三:前沿 AI 帶來的「負七天」攻防轉折點

第三個原因也是我個人認為最關鍵、對整個軟體產業影響最深遠的推手——前沿大型語言模型(LLM)在資安攻防上的實戰跨越。

這兩支漏洞並不是全新寫出來的程式錯誤。事實上,相關的 Bug 在 PHP 原始碼中已經靜靜沉睡了長達 14 年之久。

在過往的十幾年間,人類資安專家老早就發現過這些異常中斷,但要將這些分散在各處的瑣碎缺陷串接成一條穩定、可跨記憶體空間並取得系統 Shell 的攻擊鏈,複雜度高到了極限。在人力成本與優先級權衡下,這項問題便被擱置了十餘年。

然而,隨著以 GPT-4、Claude 3.5 Sonnet、Gemini 1.5 Pro 為首的前沿模型普及,這道橫亙在人類研究員面前的高牆被瞬間踏平了。

Chainguard 執行長 Dan Lorenc 在接受科技媒體《The Register》專訪時便透露了他們提前動作的根本原因:他們向頂尖語言模型下達了類似「在 PHP 原始碼中尋找重大未知漏洞」的任務指令,AI 在短短幾小時內便自行分析、挖出了這組陳年架構缺陷,並成功輸出了攻擊路徑實現概念。

AI 不是萬能神祇,但它具備「無限嘗試」的恐怖耐力
相較於頂尖的人類白帽專家,語言模型在單點判斷上可能顯得笨拙,會有無數的幻覺與誤報。
但 AI 的核心優勢在於:它可以不知疲倦地一直試、一直試、一直試。
它極其擅長長文本特徵關聯,能將人類根本無暇逐一驗證的幾百種記憶體排列組合在一夕之間跑完,在浩瀚的代碼荒漠中將微小的缺陷串成致命的利刃。

Wiz 深入分析:前沿 AI 模型大幅降低了人類研究者的利用門檻

Linux 核心資深維護者 Greg Kroah-Hartman 曾在 Mandiant 的演講中分享過一組極度震撼的數據:

  • 在 2018 年,一個漏洞從補丁發布到被武器化攻擊,平均有 +63 天 的緩衝期。
  • 到了 2026 年,這個數字變成了恐怖的 −7 天。

「負七天」意味著:補丁甚至還在封裝排程中,針對未公開細節的在野利用就已經悄然展開。攻守雙方的時間槓桿在 AI 介入後徹底傾斜。

Greg Kroah-Hartman 於演講中指出:漏洞利用已從 63 天演變為負 7 天

在科技圈,AI Agent 自動化工具的取得門檻已經趨近於零,繞過大模型安全限制(越獄與破甲)的手法更在暗網四處流傳。我自己平時為了防禦研究而開發的簡易紅隊專案「探驪」,在接上本地模型後,也確實掃描出了某些專案中真實存在的高危弱點。


攻防實錄:從「Steal My Bitcoin」靶機到記憶體外洩

在漏洞公布後的數天內,社群圍繞著這兩支 CVE 展開了一連串極具戲劇性的攻防攻防實測。

靶機實測:偷走比特幣挑戰的 3 小時真相

10 月 25 日,一名開發者在 Hacker News 上發起了一場名為「Steal My Bitcoin」的公開懸賞挑戰,在伺服器上放了一組約 0.025 枚比特幣(價值約 2,000 美元)的錢包私密金鑰,公開挑戰全球黑客:「這幾天大家都在為 PHP RCE 恐慌,我很好奇到底有沒有人能在現實中打通它。」

Hacker News 上的 Steal My Bitcoin 挑戰首頁

這場挑戰在開跑後不到 20 小時宣告失守,獲勝者「KillaBoi」隨後公開了完整的攻擊鏈細節:

  1. OOM 狀態殘留:發送約 250 KB 的深層 Multipart 請求,逼出 128 MB 記憶體上限中斷。
  2. 記憶體洩漏與 ASLR 繞過:向殘留狀態的 Worker 發送後續請求,藉由回傳的異常長度 PHPSESSID 讀出 Zend Heap 基底與 zval_ptr_dtor 位址。
  3. 偽造 HashTable 取得 RCE:發送偽造的雜湊表結構,在垃圾回收時將執行流程引導至 zif_system,全程僅花費約 20 次 HTTP 請求。

HKEPC 報導 Steal my Bitcoin 挑戰不到 20 小時失守之推文截圖

然而這場挑戰隨後引發了巨大的反轉爭議:知名資安研究員 LiveOverflow 與 HKEPC 先後踢爆,該網站前 15 個小時根本沒有任何 PHP 檔案,單純只用內建伺服器傳送靜態 index.html,底層根本沒載入 Zend 執行引擎,攻擊者當然無從下手。

直到發起者補上了兩個動態檔案後,伺服器實際上在短短 3 小時內就被徹底打穿。這項實驗證實了整條利用鏈在真實網路環境中確實具備毀滅性的穿透力。

HKEPC 報導揭露:靶機前 15 小時僅為靜態 HTML,動態檔案上線 3 小時即失守

記憶體讀取副作用:幽靈般的憑證外洩

除了奪取伺服器權限,Sansec 與 Wiz 也展示了這項漏洞的另一項可怕衍生威脅:未經授權的跨請求記憶體傾印。

由於 Use-After-Free 缺陷,直譯器會把已經釋放的記憶體片段當作 PHPSESSID 的 Cookie 回傳給客戶端。攻擊者能直接從中讀取同一個 Worker 先前處理過的其他訪客機密,包含登入 Token、資料庫連線密碼、API 金鑰,甚至是伺服器的 TLS 私密金鑰。這讓許多研究團隊將其影響層面與當年的 Heartbleed 及 Log4Shell 相提並論。

Wiz 將 PHP2Shell 視為如同 Heartbleed 與 Log4Shell 般的時代轉折點

澄清 10 月 23 日的第三支漏洞:CVE-2026-115560

在緊急發布兩天後,社群再次盛傳 PHP 又爆出一支高達 9.2 分的第三支漏洞(CVE-2026-115560)。

然而經過仔細查證,這則訊息存在嚴重的媒體誇大:

  1. 查無 9.2 分數:官方 10/23 通告屬於「資訊性諮詢」(Informational Advisory),從未給出 9.2 的評分,NVD 甚至未列出分數。
  2. 條件極端苛刻:該問題要求伺服器必須將 session.serialize_handler 設為非預設值,且應用程式必須在執行中用 ini_set() 動態切換回預設值。官方明確定性這屬於「極不可能發生的利用向量」(Unlikely Vector)。
  3. 無須重複驚慌:若你已經在 10 月 21 日依照建議禁用了 session.upload_progress,該問題就已經完全處於防禦狀態之下。

HKEPC 轉述聲稱出現第三支 9.2 重大漏洞之推文截圖

PHP 官方 10/23 Informational Advisory 原文:定性為極罕見向量,維持既有緩解即可


開發者實戰自救:升級路徑與危險防禦地雷

面對這場全球性的資安考驗,身為網站管理者與開發者,究竟該採取哪些行動?

第一優先:唯一的治本之道是升級直譯器

請永遠牢記官方公告最核心的結論:Only an update is a complete solution(只有升級才是完整解答)。

官方公告原話強調:唯有安裝更新才是唯一的完整解決方案

  • 官方支援版本:請立刻升級至 8.5.12、8.4.27、8.3.36 或 8.2.35。
  • 已過保版本(EOL):PHP 7.4、8.0、8.1 官方早已停止維護,僅有社群提供的原始碼修補檔(Backport Patch),無官方二進位更新,強烈建議評估架構遷移。
  • Remi 套件庫地雷:許多 Red Hat / CentOS / Rocky Linux 用戶習慣使用的 Remi 套件庫,在事件爆發當日並未同步釋出更新。若主機依賴第三方儲存庫,必須格外留意上游維護時差。

php.net 特別公告提醒:Remi 第三方套件庫在揭露當日並無更新

臨時緩解措施的「做與不做」對照表

如果你因為商業系統限制,當下無論如何都無法立刻重新啟動或編譯升級 PHP,請務必遵循以下規範:

措施類型 具體手段 實施評估與副作用
強烈建議 在 Web Server (Nginx/Apache/WAF) 直接阻擋 multipart/form-data 有效。目前已知的端到端利用鏈皆走 Multipart 途徑;缺點是檔案上傳與部分複雜表單會暫時失效。
強烈建議 關閉上傳進度:session.upload_progress.enabled = Off 有效且無痛。從 PHP 5.4 起預設開啟,關閉後務必重啟全數 Worker 行程。
強烈建議 調整記憶體上限:在 php.ini 壓低 post_max_size(如 2MB~8MB) 有效。大幅增加攻擊者用小流量灌爆 Heap 空間的難度。
絕對禁止 啟用作業系統級的 RLIMIT_AS 或 RLIMIT_DATA 極度危險! 會直接導致底層 mmap() 失敗,正好觸發 longjmp 記憶體破壞,形同替攻擊者按開關!
完全無效 在程式碼內呼叫 ini_set() 或依賴 .user.ini 緩解 完全無效! 漏洞在請求剛到達、應用層尚未載入時便已觸發,程式內部的動態開關根本來不及生效。
完全無效 開啟 CMS 內建的「維護模式」(Maintenance Mode) 完全無效! WordPress 等系統的維護外掛都在業務層,PHP 核心在檢查維護標記前就已經中招。

php.net 官方公告:明令警告勿依賴 RLIMIT_AS 避免反向引爆漏洞

php.net 官方公告:強調 ini_set 與 user.ini 在解析階段完全無效


常見問題快速解答(FAQ)

Q1:我的網站完全沒有寫檔案上傳功能,也有中招風險嗎?

是的,風險完全相同。
這兩支漏洞發生在 PHP 核心解析 HTTP 請求封包的階段。只要攻擊者主動向伺服器發送帶有畸形 Multipart 或 Session Upload Progress 標頭的 POST 請求,直譯器便會在執行任何業務代碼前主動觸發解析流程,與你的應用程式是否有檔案上傳介面毫無關係。

Q2:我使用的是現代化的 PHP-FPM,是否代表可以不急著更新?

絕對不可以。
雖然 PHP-FPM 在發生異常時會透過丟棄 Worker 行程降低被直接打下 Shell 的機率,但原始碼層面已確認存在嚴重的髒資料狀態;此外跨請求的記憶體洩漏威脅(如 Session 與 API 金鑰外洩)依然存在。升級直譯器依然是唯一安全的解答。

Q3:如果我已經在伺服器關閉了 session.upload_progress,還需要打補丁嗎?

依然必須打補丁。
官方與資安研究機構皆已證實,Session Upload Progress 僅僅是目前被證實的其中一種利用途徑,直譯器內部還有其他全域結構在中斷時未被妥善重設。關閉該選項僅能作為爭取時間的止血措施。


結語與社群省思

回顧這場「PHP2Shell」事件,它不僅僅是一場關乎全球七成網站的技術大修補,更是整個軟體供應鏈在 AI 時代下的一記響亮警鐘。

過去我們仰賴的協調揭露協議、數週的緩衝測試期,在 AI Agent 能不知疲倦地遍歷代碼特徵、在野利用窗口被急遽壓縮到「負七天」的今日,正顯得前所未有的脆弱與不堪一擊。

身為第一線的架構師與工程師,未來我們勢必得面對更頻繁、更突如其來的「零日風暴」。除了保持最快速度的補丁跟進習慣,收窄對外暴露面、深化 SAPI 與反向代理層的防禦深度,或許才是我們在這個時代活下去的唯一生存法則。