← go home回首頁
EN 繁中

PHP 2Shell:那個讓我們想起 PHP 到處都是的漏洞

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 的人:

  1. 盤點你的 PHP。它藏在別的软件裡面(Nextcloud、WordPress、任何 CMS、router 或防火牆的管理介面——PAN-OS 被中招就是這樣發生的)。find / -name 'php*' -type f 2>/dev/null 是個起頭。
  2. 對外的優先。如果一个 PHP box 對公共 internet 說話,它比別的一切都先補。
  3. 盯 spawned shells。post-exploitation 的簽名是 PHP worker process 啟動 /bin/sh 或下載一個工具。如果你有 log 聚合,CISA 為此發布了一條 SIGMA rule。
  4. EOL PHP 是一個決定,不是一個預設值。8.1 及更早不僅沒補丁——它是你向自己保證,你會是最早知道下一個 RCE 的人。

時間軸

日期事件
Oct 21, 2026PHP Foundation 發布 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35
Oct 21, 2026CISA 發布「Critical Vulnerabilities in PHP Require Immediate Patching」告警
Oct 26, 2026CISA 把兩個 CVE 加入 KEV catalog
Oct 29, 2026Unit 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 就還是標的的原因。

自架不會讓你變小。它讓你負責。