PHP2Shell 是 2026 年 10 月 21 日公布的兩個 PHP 遠端執行漏洞(CVE-2026-109618、CVE-2026-109619),嚴重程度 9.2 分,而且已經有人拿來實際攻擊;修正版本是 PHP 8.5.12、8.4.27、8.3.36、8.2.35。放在瑪尼國際虛擬主機上的網站已經全部完成修補,客戶不需要做任何事。這篇文章把漏洞是什麼、我們怎麼處理、處理過程踩到的坑,照主機上的更新紀錄寫下來;如果您的網站放在別的地方,最後一節有自己檢查的方法。
PHP2Shell 是什麼?影響哪些版本?
PHP2Shell 是 PHP 本身(不是某個外掛或框架)的記憶體處理漏洞,攻擊者不必登入,就有機會在主機上執行任意程式。兩個編號的成因不同:CVE-2026-109618 是記憶體不足時,清理程式把只初始化一半的資料當成有效資料處理;CVE-2026-109619 是上一個請求留下的狀態指向已釋放的記憶體,被同一個 PHP 行程的下一個請求拿來利用。PHP 官方說明,只要是對外提供網頁的安裝方式都在影響範圍內,包含 PHP-FPM、Apache mod_php、php-cgi 與 LiteSpeed。
| PHP 版本 | 受影響 | 修正版本 |
|---|---|---|
| 8.5 | 8.5.12 以前 | 8.5.12 |
| 8.4 | 8.4.27 以前 | 8.4.27 |
| 8.3 | 8.3.36 以前 | 8.3.36 |
| 8.2 | 8.2.35 以前 | 8.2.35 |
| 7.4、8.0、8.1 | 全部 | 官方不出正式版,只有最小幅度原始碼修補 |
| 7.3 以前(含 PHP 5) | 全部 | 官方已停止支援,沒有修補 |
這次值得特別注意的是兩件事:第一,正式公布前幾天就已經觀察到攻擊嘗試,公布當天就有誘捕主機被打;第二,官方明講沒有任何設定能完全擋住,唯一完整的解法是更新,更新後還要重新啟動 PHP 行程,已經在執行的行程不會自己換成新版本。
重大漏洞,我們比客戶先知道
瑪尼國際團隊 24 小時關注國家資通安全研究院(NICS)的資安新聞與 PHP 官方安全公告,漏洞一揭曉就評估影響範圍、全員待命;修正一釋出,第一時間更新主機。這次 PHP2Shell 就是這樣處理的。
應變時間軸:漏洞揭曉後,工程師即全員待命
漏洞揭曉後,瑪尼國際的工程師即全員待命,等待 PHP 官方回應與釋出修正補丁;官方釋出當晚 8 點起全員在線,修正一釋出就開始更新主機。以下是我們最主要一台虛擬主機的更新紀錄(時間皆為台灣時間):
| 時間 | 做了什麼 |
|---|---|
| 10/20 | 漏洞揭曉(CVE 編號曝光,PHP 官方公告將於 10/21 晚上 10 點釋出修正);工程師即全員待命,等待 PHP 官方回應與釋出修正補丁 |
| 10/21 20:00 | 工程師全員在線,準備第一時間更新 |
| 10/21 22:00 | PHP 官方釋出修正版本與安全公告 |
| 10/21 22:24 起 | 開始調整主機上的 PHP 設定;22:48、22:57 完成當晚第一批 PHP 套件更新 |
| 10/22 凌晨 02:17~04:32 | 主機套件廠商陸續發布修補套件,連續數輪更新 |
| 10/22 | 對主機上所有 PHP 版本套用官方建議的暫時緩解設定(關閉 session 上傳進度功能),作為更新完成前的雙重保險 |
| 10/22 08:06 | 啟用舊版 PHP 延伸支援來源,一次升級 478 個 PHP 套件,包含 PHP 5.6、7.4 等舊版本的修補 |
| 10/23 | PHP 8.3.36 上線 |
| 11/06 | PHP 7.4 修補版(7.4.34)上線,所有 PHP 行程重新啟動 |
| 11/10 | 最後一批:仍使用 PHP 5.6、7.0、7.2 且套件廠商沒有修補的 21 個網站,逐站切換到含修補的同版本執行環境;沒有網站使用的 PHP 4.4、5.1 從版本選單移除 |
大部分網站在官方釋出後的隔天早上就已經跑在修補後的版本上;花最多時間的,是下一節那一群官方早就不管的舊版本。
最難處理的是沒有官方修補的舊版 PHP
官方不修的版本,修補只能靠第三方的延伸支援套件;同樣是「PHP 5.6」,換一個來源就可能一個有修、一個沒修。主機上同一個版本常常有兩套執行環境:cPanel 內建的一套,和 CloudLinux 提供的一套。這次我們逐一查了每個套件的變更紀錄,結果是:
- CloudLinux 提供的 PHP 5.6~8.5 全部已加入這次的修補。
- cPanel 內建的 PHP 7.4、8.3 等版本也都有修補版。
- cPanel 內建的 PHP 5.6、7.0、7.2 最後一次更新停在 2024 年,沒有、也不會有這次的修補。
還在用這三個版本的 21 個網站,多半是十年前開發、客戶仍在使用的系統。叫客戶重寫不實際,所以我們的做法是:把網站換到「同一個大版本、但有修補」的執行環境,例如從 cPanel 的 PHP 5.6 換到 CloudLinux 的 PHP 5.6,程式一行都不用改。每一站切換前先記錄首頁狀態與頁面大小,切換後再比一次,並確認實際執行的版本;任何一項不一致就立刻切回原版本。
為什麼不直接幫客戶升到 PHP 8?
因為十年前的程式升到 PHP 8 幾乎一定會壞——each()、create_function() 這類寫法在 PHP 8 已經不存在。資安修補的第一原則是「先止血、不出事」,升級改版是另一件需要排時間做的事。PHP 版本跨大版本時哪些寫法會壞,我們在WordPress 該用哪個 PHP 版本有七個版本的實測對照;老網站要整個翻新,可以看老網站免費升級。
切換舊版 PHP 時踩到的兩個坑
同版本切換聽起來沒有風險,實際上第一個測試的網站就出現「can't connect to db server」。我們當下切回原版本,查完原因才繼續。這兩個坑,自己在處理舊站的人很可能也會遇到:
- 資料庫連線寫成
localhost:3306就連不上:舊程式常把主機與連接埠寫在一起。原本的 PHP 用的是 mysqlnd 驅動,接受這種寫法;另一套 PHP 預設用的是 libmysqlclient 驅動,會把整串當成主機名稱去查,結果找不到主機。改法是把那套 PHP 的 MySQL 模組換成 mysqlnd 版本(nd_mysqli、nd_mysql、nd_pdo_mysql)。因為這是整台主機的設定,改之前我們先記錄了原本就在用這套 PHP 的 26 個網站,改完逐一比對,全部沒有變化。 - 設定寫不進網站目錄:有兩個網站切換時系統回報權限錯誤。原因是網站根目錄的 .htaccess 群組被設成伺服器帳號,cPanel 以客戶帳號身分寫入時沒有權限改回原群組。把 .htaccess 的擁有者改回客戶帳號後就順利切換;同時發現這個帳號底下累積了五百多個以前寫入失敗留下的空白暫存檔。
這兩件事都不是漏洞本身,而是「多年累積下來的環境差異」。換主機、換版本時沒有人逐站驗證,就會在某個客戶打電話來說網站掛了的時候才發現。
網站不在瑪尼國際,要怎麼自己檢查?
三步:看版本號、看套件變更紀錄、確認 PHP 行程已經重新啟動。
- 看版本號:在主機上執行
php -v,或在網站放一支只有<?php echo PHP_VERSION;的檔案看完就刪。8.5 要 8.5.12 以上、8.4 要 8.4.27 以上、8.3 要 8.3.36 以上、8.2 要 8.2.35 以上。 - 舊版本看變更紀錄:PHP 8.1 以前、或用 Linux 發行版與 CloudLinux 套件的主機,版本號不一定會變。執行
rpm -q --changelog 套件名稱 | grep CVE-2026-109618,有出現才代表修補已經裝上;什麼都沒出現,就是沒修。 - 重新啟動:PHP-FPM、Apache 或 LiteSpeed 都要重新啟動,正在執行的 PHP 行程不會自己載入新版本。
主機商說「已經更新」,可以怎麼確認?
直接問三個問題:網站實際跑的 PHP 版本是多少?那個版本的套件有沒有這次的 CVE 修補?更新後 PHP 有沒有重新啟動?答得出來的主機商才是真的有處理。用的是 PHP 7.3 以前的網站,要特別追問,因為官方沒有修補,只能靠主機商自己想辦法。
沒有工程師、也不想自己追這些事的公司,這正是虛擬主機該包含的服務:主機維運、資安更新、每日備份與 24 小時技術支援,屬於瑪尼國際的終生免費售後服務。各方案內容見虛擬主機方案;網站上線後的持續照顧,見 6G 至尊服務。
本文屬於「主機與機房系列」。虛擬主機怎麼挑、包含哪些服務、搬家要注意什麼,見虛擬主機完整指南。
常見問題
Q:我的網站放在瑪尼國際的主機上,需要做什麼嗎?
不需要。三台虛擬主機上所有網站使用的 PHP 版本,都已更新到含 PHP2Shell 修補的版本;仍在使用 PHP 5.6、7.0、7.2 這類官方早已停止支援版本的網站,也已在 2026 年 11 月 10 日切換到有修補的同版本執行環境,程式不用改。如果您另外有放在其他地方的主機或自己管理的 VPS,可以參考本文最後一節自行檢查,或把主機資訊交給我們協助判斷,評估不收費。
Q:PHP 7.4、PHP 5.6 這些舊版本,PHP 官方會出修補嗎?
不會。依 PHP 官方的說法,這次只對 8.2、8.3、8.4、8.5 四個仍在支援的版本釋出正式修正版;7.4、8.0、8.1 只有最小幅度的原始碼修補,7.3 以前(包含 PHP 5)完全沒有。主機上的舊版本能不能被修好,取決於主機商用的是哪一家的延伸支援套件,以及主機商有沒有真的去更新。這也是我們這次最後花時間處理的部分:沒有修補可裝的舊版本,就把網站搬到有修補的同版本環境。
Q:怎麼確認自己的主機已經修好了?
先看 PHP 版本號:8.5 要 8.5.12 以上、8.4 要 8.4.27 以上、8.3 要 8.3.36 以上、8.2 要 8.2.35 以上。用的是 Linux 發行版或 CloudLinux 提供的套件時,版本號不一定會變,要查套件的變更紀錄,例如執行 rpm -q --changelog 套件名稱 | grep CVE-2026-109618,有出現才代表修補已經裝上。最後一步常被忽略:裝完套件要重新啟動 PHP-FPM 或網頁伺服器,已經在執行的 PHP 行程不會自己換成新版本。