昨晚全球各地政府網站經歷大地震,荷蘭的眾議院網站看不見了,芬蘭的土地測量局登不進去,法國各省市的前線服務頁一片空白。荷蘭國安中心 NCSC 的官網、荷蘭政府的入口網站 MijnOverheid、比利時的外交部網站、英國愛丁堡與牛津市議會的網站,全都在同一時間被關閉,連英國的《Doctor Who》節目頁都無法瀏覽,連日本首相高市早苗都特地在 X 發文警告其嚴重性。
PHP2Shell爆發:AI協助找到藏了20年的PHP驚天漏洞
關掉網站的原因是一個修補程式還沒生出來。PHP 語言核心有兩個未授權遠端程式碼執行漏洞,編號 CVE-2026-109618 與 CVE-2026-109619,CVSS v4.0 評分 9.2,俗稱 PHP2Shell。修補版本預定在台灣時間 10 月 21 日晚上 10 點釋出,但漏洞細節在前一天就已經在 Hacker News 外洩,各國政府機構在等補丁的幾小時裡選擇直接關站。
目前 PHP 幾乎支撐了整個網際網路,依 W3Techs 統計,約 69.3% 的已知伺服器端語言網站使用 PHP,WordPress、Drupal、Joomla、Laravel 與 Magento 全部架在它上面。漏洞在 PHP 引擎本身,跟應用程式無關。
藏了二十年的兩個洞
這兩個漏洞的程式碼可以回溯到 PHP 5.4.0,也就是 2012 年。Calif 研究員 Ryan Austin 在原始揭露文件裡寫得很清楚,這批缺陷存在了數十年,但「證明它們可被利用,需要一條極度複雜的步驟鏈結,接近人類研究者實際能達成的極限」。
起點要拉回 2004 年,PHP 核心貢獻者 Stefan Esser 在那一年就挖出過第一個「記憶體上限」遠端漏洞,當時他認為嚴重到不公開攻擊程式。2020 年有人在 PHP 的 bug tracker 回報長變數會造成記憶體耗盡且暫存檔沒有清除,編號 bug #78876,回報沒有受到重視;2024 年 OSTIF 與 Quarkslab 稽核 PHP 時又找到一次。
2026 年 7 月底,OpenAI 邀請 Calif 參加「Patch the Planet」計畫,PHP 被列為高影響目標。8 月 1 日,Calif 團隊開始動手,隔幾天就找到第一個致命的記憶體耗盡路徑,以及三個能讓程式中途被打斷的插入點。
AI 接手的是後半段
Wiz 研究員 Sagi Tzadik 等人在 8 月 19 日用 Wiz Atlas 搭配 Gemini 4 Argon 與 GPT-5.6 Sol 找到第一個 PHP 漏洞,8 月 24 日回報給 PHP 安全團隊,最後累積出兩個 CVE。他們在技術分析裡下了個判斷:「這些發現可以排在 PHP 歷來最嚴重的漏洞之列,在軟體史上或許也是如此。底層缺陷存在數十年,但證明可利用性需要一條接近人類極限的複雜鏈結,前沿 AI 大幅降低了這道門檻。」
AI 確實做了事,但做的位置跟外界想像的不太一樣。Calif 的揭露文件裡提到,找到第一個漏洞之後,研究團隊把「先計數再配置鍵」這個模式交給 LLM 抽象成一份 SKILL.md,內容是一種泛用結構:先發布或銷毀狀態,再執行可能失敗的工作,最後才初始化或提交;如果在可能失敗的階段發生致命錯誤,提交與回滾就會被跳過,存活的消費者會信任一份錯誤的狀態。是這份一般化的模式,帶著他們在 session upload-progress 裡找到第二個漏洞。
Calif 自己的說法更保守。Ryan Austin 描述最初的發現時表示:「沒有使用任何特殊工具,也沒有使用一般人拿不到的模型。我專注在自己有背景、而且很了解漏洞史的目標上。」他給的結論是,「了解你的目標」到今天依然管用。
漏洞怎麼打穿的
PHP 底層用一個雜湊表存放請求變數,程式碼在配置新的鍵之前會先把計數器加一,等鍵配置完成後才真正初始化那一格。若配置鍵的過程中發生記憶體耗盡的致命錯誤,這一格的計數已經加上去,裡面仍是未初始化的內容。請求結束時的清理程式會依照計數器走過這些格子,把裡面的資料當成有效物件釋放。攻擊者可以讓程式控制流永遠走不到初始化那幾行,計數器卻已經加過,清理階段就會把殘留記憶體當成活著的格子消耗掉。
Calif 找到兩個能觸發記憶體耗盡的作法。一個是繞過 post_max_size:PHP 拿 Content-Length 跟 post_max_size 比對,但實際吃進來的位元組沒有同樣上限,Apache 因此可以送出 chunked HTTP/1.1 或沒有長度宣告的 HTTP/2 multipart 請求。另一個利用 RFC1867 上傳格式中 filename="" 的空檔案部分,PHP 不會把它算進 max_file_uploads,卻仍會建立完整的六個 $_FILES 欄位。搭配 files[a][b][c] 這種巢狀欄位名稱,幾百筆空上傳記錄就能占掉預設 128 MiB 的 PHP 堆積。[4]
第二個漏洞走 session upload-progress。PHP 在解析請求本文時會提早開啟 session,這時模組還沒完成啟動,session 的全域狀態裡就留了指向請求堆積的指標。若解析過程中發生致命錯誤,清理階段因為啟動旗標未翻,不會執行 session 的收尾,堆積卻照樣被釋放,Apache 的工作行程活了下來,指標卻指向已經被釋放的記憶體。第二個請求帶著 session ID 與 PHP_SESSION_UPLOAD_PROGRESS 欄位但不含檔案部分,剛好跳過重置路徑,就會讀到那個已經釋放的 session ID。
攻擊者還有一條更寬的路。PHP 的反序列化器會保留一份全域的引用與析構清單,當解碼過程被記憶體耗盡打斷,這份清單的釋放就被跳過,請求堆積被回收後,下一個請求可以讓反序列化器把已回收的記憶體當成巢狀解碼器重用。序列化資料中的 R: 與 r: 參照可以跟著被回收的參照清單走。
攻擊面不侷限在 PHP 本身。Calif 實測確認可未授權執行程式碼的應用程式包括 WordPress 7.1.2、Drupal 11.4.3、Joomla 6.1.4、MediaWiki 1.46.2、Magento 2.4.9、Nextcloud 35.0.1 與 Laravel 13.11。漏洞在請求啟動階段就會生效,應用程式自己的程式碼還沒開始跑就可能被利用,官方形容風險最高的是 Apache 的 mod_php,PHP-FPM 與 php-cgi 同樣受影響。
沒有緩解措施這回事
PHP 核心開發者 Gina Peter Banyard 的說法很直接:「唯一的緩解措施就是打補丁或升級 PHP。」PHP 8.6 釋出管理員 Joe Ferguson 補了一句:「ini 設定救不了你。」
英國 NCSC 的建議更硬:無法立即修補的組織,應該考慮讓系統下線。歐盟 CERT-EU 寫的是「考慮把對外服務與公眾網路隔離,直到有修補可用」,並指出影響範圍涵蓋 PHP 5 之後的所有版本。日本 IPA 在發布前就發出預警通知,日本、澳洲、美國的 NSA 與 CISA 也都同步發布警告。
Cloudflare 是最早動作的。技術長 Dane Knecht 在 10 月 21 日早上 7 點 43 分表示「我們看到早期攻擊正在出現,會隨著新的攻擊向量出現而更新緩解措施」,並說 Cloudflare 已部署首批 WAF 規則,比公開揭露早了約 9 小時,連免費方案客戶也涵蓋在內。但他強調那只是權宜之策,必須趕快打補丁。
修補版本是 8.5.12、8.4.27、8.3.36 與 8.2.35。PHP 8.1 以下官方已停止支援,但安全團隊另外提供了 7.4、8.0 與 8.1 的精簡原始碼回溯修補。使用 rpms.remirepo.net 這個社群倉庫的站點當天拿不到更新,必須改用發行版套件或自行編譯。美國資安廠商 Sansec 事前提醒「預期大規模攻擊會在釋出後 15 分鐘內開始」。
到底有多少台有風險
網路上流傳的「超過 510 萬台 PHP 伺服器暴露在網際網路上」這個說法,數字本身有依據,用語卻不精確。VirusTotal 官方部落格公布的是 510 萬個「與 PHP 關聯的 IP 位址」,其中約 380 萬個至少有一個開啟的 port,約 110 萬個有揭露 PHP 版本;在那 110 萬個之中,27.2 萬個跑的是 8.2 到 8.5 這些還在支撐的分支,75.8 萬個跑的是 5.4 到 8.1 這些已經終止支援的分支,另有 8.8 萬個跑 5.2 或 5.3,8.5 萬個跑的是修補前的最新版本。
研究者的估算落在另一個區間。安全研究員 Silas Cutler 估計約有 130 萬台連上網際網路的主機可能受影響,Shodan 的搜尋結果則是 190 萬台暴露在外的 PHP 主機。Kevin Beaumont 直說「PHP 這件事會帶來大量的事故,這是近年最大的漏洞之一」。
各國怎麼處理
荷蘭的案例最讓人記憶深刻,因為連國安中心自己的官網都關了。眾議院的 Tweede Kamer、荷蘭資料保護局、MijnOverheid 政府入口網站、鹿特丹港務局、荷蘭皇家足球協會 KNVB,以及多家政黨與醫院的網站都無法連線。
芬蘭的動作同樣徹底。國家資訊安全中心 Valtori 從下午開始關閉公共服務,國家土地測量局、赫辛基書展、芬蘭電影基金會與 Yle 的部分服務都受影響,Traficom 網路安全中心也發布聲明。Valtori 的說明寫得很清楚:「這是預防措施,不是攻擊或資料外洩的結果。」
法國的關閉由內政部依 ANSSI 的要求執行,範圍包括各省市網站、稅務局與天氣預報,巴黎警察局的網站也停擺。比利時外交部的網站是在有攻擊嘗試的通報之下被關閉,德國的聯邦 IT 局 ITZBund 也預防性地關閉旗下幾個網站。
英國的例子除了愛丁堡與牛津市議會、倫敦警察廳之外,《Doctor Who》與《The Traitors》節目頁也停擺,顯示這波下線不限於行政機關。開源社群這邊,Pinboard、Something Awful 論壇與 4chan 被限制為唯讀。日本的親子溝通 App Codmon 完全停擺,與任天堂相關的服務同樣在名單上。韓國的 Kakao 與 Naver 沒有出現大規模中斷。
‼️ PHP UPDATE: The Dutch parliament, the Dutch national cyber agency and Finland’s central government have pulled websites offline ahead of the PHP patch. Finland’s state IT centre Valtori is shutting down public-facing central government web services. The National Land Survey of Finland is already down. In the Netherlands, the Tweede Kamer, the NCSC and the Dutch Data Protection Authority are offline. So are tech site Tweakers and NotuBiz, which runs council information for 100+ local governments. The University of Vienna switched off its websites, webmail and Moodle. The University of Freiburg and Finland’s Haaga-Helia have taken services down too. Fur Affinity, Pinboard, explain xkcd and every wiki on Miraheze are dark as well. Valtori says its shutdown is a precaution, not the result of an attack or breach. PHP was created by Rasmus Lerdorf in 1994, it initially stood for Personal Home Page PHP’s fix is due at 14:00 UTC today.
— International Cyber Digest (@IntCyberDigest) October 21, 2026
接下來會發生什麼
10 月 21 日是修補日,也是觀察日。CISA 的已知被利用漏洞目錄尚未收錄這兩個編號,Tenable 也提醒公開流傳的 exploit 程式碼未經驗證,有些還夾帶了惡意程式。PHP 基金會當天強調,這是「近期記憶中最具影響力的安全議題之一」。
OpenAI 這邊的做法是把防禦端拉進來。9 月 3 日推出的 Daybreak for Frontline Defenders 計畫承諾在六個月內提供 10 億美元的補貼存取,優先給州與地方政府、關鍵基礎設施營運者、社區銀行、非營利組織與開源維護者;計畫分 Daybreak Blue 與 Daybreak Red 兩個等級,Red 給的是專門的網路攻擊模型。
對絕大多數網站使用者來說,什麼都不用做,這是站台維運的責任。對站台維運來說,要做的事很清楚:找出所有跑 PHP 的主機,包含那些沒人記得的那幾台,升級到修補版本,跑 8.1 以前的去問供應商要回溯修補,當天補不完就把網站下線。Hal Pomeranz 這位電腦取鑑專家的提醒是:「外面有太多內嵌的安裝永遠不會被修補,太多被遺忘、沒人維護的應用程式。這一次會有很長的尾巴。」














