我寫了一篇文章,整理了 PHP 的緊急漏洞(俗稱 PHP2Shell、CVE-2026-109618 / CVE-2026-109619)的機制與應對檢查清單。
原本主要是彙整對應方法,但在後續持續出現的反應中,我也注意到不少令人介意的聲音。
「乾脆別再用 PHP 了」
「現在還在用 PHP,本來就很老派了」
「這就是那種遺留語言的宿命吧。。」
……真的是這樣嗎?
我個人認為,從這起事件應該讀出的訊息,反而是完全相反的。
這個漏洞不只是 PHP 使用者才需要關心,也不是「選了 PHP 就是錯」的問題。更應該把它看成更大地殼變動的第一個案例。
本文將整理以下三點:
首先要先釐清一個前提:在漏洞世界裡,其實有兩個階段。
對於記憶體破壞類漏洞來說,第二階段一直都是非常高的門檻。比方說,即使知道有「重複使用已釋放記憶體(use-after-free)」這種缺陷,要把它一路推進到伺服器上的任意程式碼執行,仍然需要大量反覆試驗,例如:
也就是說,從「找到 bug」到「可以攻擊」之間,有一道深谷,必須由熟練研究者花上數個月去跨越。
在漏洞研究界,「已經重現,但放棄武器化」這類報告其實是家常便飯。
換句話說,在過去 30 年找到的龐大記憶體錯誤,有很多其實都只是「已知存在,但還沒變成實用武器」的沉睡狀態,堆積在全世界各地。
那這次到底發生了什麼?
回顧 PHP2Shell 的時間線,大致如下:
值得注意的是,這個缺陷本身其實兩年前就已經被知道了。改變的不是「第一階段(發現)」,而是「第二階段(武器化)」的難度。人類研究者花了兩年都沒走到的攻擊路徑,透過 AI 輔助分析卻在數週內完成了。而且還是多個組織獨立做到的。
為什麼這代表「時代變了」
把上述情況一般化來看,意思是這樣:
過去我們的資安評估,(即使是默認的)一直建立在「難以武器化的 bug,實際危害風險較低」這個前提上。漏洞嚴重度判定、修補優先順序安排,以及「應該還好吧」這種樂觀判斷,很多時候都仰賴這個前提。
而現在 AI 已經能填補那道深谷,這個前提就崩解了。
也就是說,「AI 能把記憶體錯誤變成武器」並不只是某種特定攻擊手法的問題,而是全球軟體資安前提整體上移了一個層級。PHP2Shell 只是第一個大型實例,下一次同樣的事情發生在什麼地方,不一定還是 PHP。
這不是 PHP 的問題,而是「C/C++ 製執行環境」整體的問題。
接下來,來把語言的部分釐清一下。
一聽到「PHP 的漏洞」,很多人會以為是 PHP 這門語言本身的規格有缺陷。但這次真正出問題的是 PHP 直譯器本體,也就是用 C 語言寫成的軟體之記憶體管理。而這並不是 PHP 特有的結構。
語言實作 記憶體破壞類 bug 的風險
PHP 有
Python(CPython) 有
Node.js 有
Ruby 有
Go / Rust / Java / C# 記憶體安全語言,結構上較不容易發生
Python 的 CPython 也持續有 buffer overflow 類的 CVE 被發現;而 Node.js 的核心 V8,從 Chrome 的資安更新就看得出來,本來就是記憶體破壞類漏洞的常客(近期甚至也修補了 Chrome 網路堆疊因記憶體破壞而導致的 RCE,CVSS 9.6)。
「只要從 PHP 換成 Python 或 Node,就能解決這類風險」——實際上只是搬進了同樣結構的房子而已。
即使是「現代化」的生態系,致命漏洞依然持續發生。
此外,就算先不談記憶體錯誤,單純從「用了新技術就比較安全」這個假設來看,事實也早已否定了它。
每個生態系都有、而且形式不同但同樣致命的漏洞。你的技術堆疊這次不是當事者,並不能證明「我們的選擇是正確的」。
前面鋪陳得有點長,來切入主題。對於「因為用了 PHP 所以不好」「因為用了舊框架所以不好」這類主張,事實上有三個明顯錯誤。
前面已經提過了。Log4Shell 是 Java 的問題,2026 年那一波 RCE 連發是 Node.js 的問題,兩者都是「現在很常見」的技術堆疊。而 PHP2Shell 的缺陷其實從 PHP 5.4 時代就已潛伏,也就是說,這是十多年以前就存在的 bug,直到現在才突然被武器化。變的不是 bug 的「新舊」,而是「能不能武器化」。因此「換成新語言就能避免」這個說法並不成立。下一次也可能發生在你要換去的那個平台上。
對於認為「PHP 已經是化石」的人來說,這點可能會讓你意外,但我們還是看事實。
真正該看的是發現漏洞之後如何應對,而不是漏洞本身被發現這件事。從這個角度來看,PHP 的處理反而屬於相當迅速且周全的一方。
對「框架太舊」的批評也一樣。Laravel 與 Symfony 都是持續推出主要版本、仍在活躍使用的現代框架;而 PHP 也被約 7 成已知伺服器端語言的網站所使用,單一 WordPress 就撐起了約 4 成的整體網站。若「正在被大量使用的東西就是不好」這個說法成立,那麼就等於大半個網際網路都不好。那不是批評,而是無視現實的說法。
整理到這裡,可以歸納成以下幾點:
那麼,這次事件真正危險的是什麼?是繼續使用已終止支援(EOL)版本的環境,以及沒有建立好套用補丁體制的組織。
回頭看這次預期最嚴重的受害情境,像是「還在用 PHP 8.1 以前的 EOL 版本,而且沒有更新計畫」、「PHP 以 root 身分執行的舊式架構改不掉」等等,問題都不是語言選擇,而是營運面。相反地,若是認真追著支援中的 PHP 8.2~8.5 版本的人,只要更新套件、重新啟動 worker 就能完成應對。
不用說,把 EOL 版本放著不管的運作方式,就算你把 PHP 換成別的語言也一樣會沿用下去。語言換了,營運沒變,下一次還是會踩到同樣的坑。
先暫時離開「PHP 有問題」這個討論,我認為真正有效的投資有以下三項:
「那不是應該轉去 Go 或 Rust(或 Java / C#)嗎?」這樣的討論自然會出現。
美國政府也已經公開鼓勵移轉到記憶體安全語言的報告,從長期趨勢來看,我認為這是正確方向。
記憶體破壞類漏洞這個類別,本來就會逐漸移到那些以結構上較不容易發生這類問題的語言所寫的執行環境。
我也支持這個趨勢。
不過,這和「這次漏洞的對策」是不同時間軸的事情。即使是記憶體安全語言,也無法阻止相依函式庫的漏洞(Log4Shell 就是代表例子)、邏輯 bug、以及供應鏈攻擊。而既有系統的移轉成本,往往是數年規模。
比較務實的做法,是在新開發或大規模重寫的時機納入選項;但不應因為這次事件,就把既有資產因恐慌而全面改寫。這是我個人的看法。
這次事件失去的,不是「PHP 的信用」,而是「沉睡中的 bug 應該無害」這個世界前提。下一次發生同樣事情的,不一定是 PHP。可能是 Python,可能是 Node,也可能是那個你以為「已經捨棄 PHP 時代包袱而換過去的」語言。
到那時候,把責任推給語言的組織,和已經做好準備的組織之間的差距,不會靠幾天的修補作業就能彌補。真正拉開差距的,是日常營運。
原文出處:https://qiita.com/kotowazaman/items/aab621d31a8501617eb4