2026 年 10 月 21 日,PHP Foundation 為兩個 remote code execution bug 發布了嚴重安全補丁。10 月 26 日,CISA 把兩個都加進 Known Exploited Vulnerabilities catalog。10 月 29 日,研究者確認了野外的主動利用——攻擊者把這些 bug 跟一個 Linux kernel 提權 flaw 串起來,在對外的 server 上拿到 root。
我寫自架的文章,也跑 PHP。所以我檢查了自己的家。以下是我發現的,還有這些 bug 實際是什麼。
兩個 bug
它們被叫做 php2shell:CVE-2026-109618 和 CVE-2026-109619。兩個在 CVSS 4.0 下都是 CVSS 9.2(Critical)。兩個都允許未經驗證的 remote code execution——不用登入、不用 CSRF token、不用特殊 header。對一個 PHP 驱动的 web server 送出正確的 request,你就能以 PHP process 的身分執行代碼。
兩個 bug 的根因是同一類:透過 longjmp() 造成的 use-after-free。
PHP 的 fatal-error 處理向來使用 longjmp()——一個 C 函式,跳回 call stack 上預存的一個點。它是引擎深處一個快速、醜陋的逃生口。問題在於,如 PHP advisory 所述:
- CVE-2026-109618:當 out-of-memory error 觸發
longjmp()時,request 的記憶體被留成未初始化狀態。一個能可靠觸發 OOM 的攻擊者(大 upload、深遞迴、精心製作的 input)就能讀取那段垃圾記憶體並據以分支——這足以 reaching RCE。
- CVE-2026-109619:當
longjmp()觸發時,某些全域記憶體被留著指回一個已經 free 掉的區域。一個之後、看似無關的 request 可以讀取或分支到那個 stale pointer。這個更麻煩,因為觸發和 exploit 可以是不同的 request。
一個關於我自己表述方式的提醒:longjmp() 式的錯誤處理在 PHP 引擎裡是舊設計,但我描述的是機制,而不是宣稱它「1995 年設計出來之後從來沒動過」。PHP 團隊自己的文章才是歷史的權威;清楚的是,fatal-path 處理是記憶體紀律失守的地方。
為什麼這個不一樣
大多數「更新你的 CMS」的 CVE 是在元件裡——plugin、framework、library。這兩個是在引擎本身,影響所有服務 web request 的 PHP 版本:
- Apache 搭配
mod_php(PHP 認為這是最高風險的配置) - PHP-FPM
php-cgi- FrankenPHP
- LiteSpeed
而規模才是真正的炸點:Palo Alto Networks 的 Xpanse 遙測數出2260 萬+ 個暴露的實例可能受害。這不是小眾。這是「web 上有意義的比例」。
修正版本,2026-10-21 發布:
- PHP 8.5.12
- PHP 8.4.27
- PHP 8.3.36
- PHP 8.2.35
PHP 8.1 及更早的版本已經 end-of-life,沒有補丁。如果你在那些版本上,CISA 的建議很直白:在你能升級之前把系統關掉,或者先在前頭放一個 WAF 當過渡。
我檢查了自己的家
我在 Proxmox LXC(CT 114)上跑 Nextcloud。Nextcloud 是 PHP。所以問題是:我在哪個版本?
$ docker exec nextcloud php -v
PHP 8.5.12 (cli) (built: Oct 21 2026 15:49:40) (NTS)
8.5.12——正好是修好的版本。而且 build 時間戳是 2026 年 10 月 21 日,就是 fix 上線的那天。我的 Nextcloud Docker image 在 CISA 寫告警之前就已經拉到了修好的 PHP。我不在那 2260 萬裡。
這是如釋重負,但也是個提醒:安全裕度有多薄。我安全不是因為我做了什麼聰明的事——我安全是因為 Docker image 的維護者重建得快。一個那天沒有更新的自架 PHP 安裝,會被留在被利用的集合裡整整一週。
幾件我會告訴每個自架 PHP 的人:
- 盤點你的 PHP。它藏在別的软件裡面(Nextcloud、WordPress、任何 CMS、router 或防火牆的管理介面——PAN-OS 被中招就是這樣發生的)。
find / -name 'php*' -type f 2>/dev/null是個起頭。 - 對外的優先。如果一个 PHP box 對公共 internet 說話,它比別的一切都先補。
- 盯 spawned shells。post-exploitation 的簽名是 PHP worker process 啟動
/bin/sh或下載一個工具。如果你有 log 聚合,CISA 為此發布了一條 SIGMA rule。 - EOL PHP 是一個決定,不是一個預設值。8.1 及更早不僅沒補丁——它是你向自己保證,你會是最早知道下一個 RCE 的人。
時間軸
| 日期 | 事件 |
|---|---|
| Oct 21, 2026 | PHP Foundation 發布 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 |
| Oct 21, 2026 | CISA 發布「Critical Vulnerabilities in PHP Require Immediate Patching」告警 |
| Oct 26, 2026 | CISA 把兩個 CVE 加入 KEV catalog |
| Oct 29, 2026 | Unit 42 / Dream Research 確認主動利用(php2shell + Linux kernel LPE → 在對外的 PAN-OS 管理介面上拿到 root) |
patch 到確認野外利用之間的五天,是值得記住的那個數字。那是一個未打 patch、對外的 PHP box 最容易被敲中的時間窗。
對一個 homelab 代表什麼
我跑的 PHP 不多。Nextcloud 是主要的那個,而且是 containerized(這是真正的優勢——image 維護者做 patch,你只需要更新 image)。但這課不是 PHP 專屬的:那些無聊的、古老的、到處都是的技術,才是會拿到 2200 萬暴露的那批。 Apache、PHP、一個 Linux kernel——沒有一个是新的、没有一个是「現代的」,而它們全都是「自架」的 box 一碰到 internet 就還是標的的原因。
自架不會讓你變小。它讓你負責。