PHP2Shell 與 Node2Shell:記憶體安全缺陷如何導致遠端程式執行
PHP2Shell vs Node2Shell: How Memory-Safety Flaws Lead to Remote Code Execution
導語:PHP2Shell 與 Node2Shell 兩項漏洞說明 PHP 與 Node.js 執行環境因記憶體安全缺陷而導致遠端程式執行。
本文比較 PHP 與 Node.js 兩大執行環境的記憶體安全缺陷,說明各自的攻擊路徑與修補優先順序,幫助安全團隊快速評估風險。

兩個執行環境。不同的記憶體安全失效。其一重要結果:遠端程式碼執行 (RCE)。
PHP2Shell 與 Node2Shell 展示了應用程式執行環境中的漏洞如何使網頁伺服器暴露於遠端攻擊。兩者都可能導致 RCE,但其根本弱點與利用路徑不同。
瞭解這些差異能協助安全團隊評估風險、優先修補並調查潛在利用。
1. PHP2Shell:當錯誤處理破壞記憶體
PHP2Shell 指的是兩個關鍵漏洞,CVE-2026-109618 與 CVE-2026-109619,兩者皆擁有 CVSS v4.0 分數 9.2。
這些漏洞影響 PHP 內部的請求處理與記憶體管理流程。它們可能允許未授權攻擊者透過精心製作的 HTTP 請求觸發不安全的記憶體狀態。
CVE-2026-109618:記憶體耗盡處理
PHP 在某些錯誤處理路徑中使用 longjmp() 以在執行遇到致命狀況時轉移控制。
記憶體耗盡(OOM)狀況可能在內部請求資料尚未完全初始化時中斷請求處理。若後續清理程式將該資料視為有效,便可能存取無效的記憶體狀態。
安全問題不僅是記憶體耗盡。它是執行被中斷時未能維持記憶體安全。
攻擊流程:Crafted HTTP Request | v PHP Request Processing | v Out-of-Memory Condition | v Partially Initialised State | v Unsafe Request Cleanup | v Memory Corruption | v Potential RCE
CVE-2026-109619:過期的內部狀態
PHP 維護與請求處理相關的內部狀態。若請求佔有的記憶體在被釋放後仍有引用存留,後續操作可能會遇到無效參照。
這是一個 使用後已釋放 狀態。Request A Allocates Memory | v Internal State References Memory | v Request A Completes | v Memory Is Freed | v Stale Reference Remains | v Later Access to Invalid Memory | v Potential Memory Corruption and RCE
這些漏洞影響不同的執行路徑,但皆示範不正確的記憶體狀態管理如何將 PHP 執行環境暴露於遠端利用。
2. Node2Shell:Brotli 中的越界寫入
Node2Shell 指的是 CVE-2026-111497,即 Node.js 捆綁的 Brotli 解碼器中的漏洞。
Brotli 是一種用於減少資料大小的壓縮演算法。Node.js 應用程式可透過 node:zlib API 處理 Brotli 壓縮資料,包括來自遠端系統的資料。
該漏洞涉及解碼器在區塊型別切換處理中的越界寫入。
無效的區塊切換被錯誤地視為臨時要求更多輸入,而非永久格式錯誤。結果,串流解碼器會繼續將資料附加到內部的八位元組緩衝區。
當受影響的解碼器處理特製的壓縮輸入時,會寫入超出預期記憶體邊界,並破壞相鄰記憶體。
攻擊流程:Attacker-Controlled Brotli Data | v Vulnerable Decoder | v Invalid Block Switch | v Out-of-Bounds Write | v Memory Corruption | +------+------+ | | | v v v Crash Memory Potential Exposure RCE
Node.js 安全通告確認該漏洞可允許遠端程式碼執行。
Imperva 亦在官方受影響的 Node.js 構建上示範了 RCE。這證明在已示範的條件下可成功利用,但並不代表每個執行受影響版本的應用程式都自動可利用。
相關風險在於應用程式是否透過受影響的解碼器處理攻擊者控制的 Brotli 資料。
3. PHP2Shell 與 Node2Shell:關鍵差異
PHP2Shell
- CVEs: CVE-2026-109618 與 CVE-2026-109619。
- 受影響元件: PHP 執行環境。
- 根本原因:記憶體耗盡處理與請求清理時的不安全記憶體狀態,包括過期參照。
- 觸發條件: 精心製作的 HTTP 請求觸及易受攻擊的 PHP 處理路徑。
- 嚴重性: 每個漏洞 CVSS v4.0 9.2。
- 潛在影響: 遠端程式碼執行與敏感記憶體資訊洩露。
- 主要補救措施: 升級至已修正的 PHP 版本。
Node2Shell
- CVE: CVE-2026-111497。
- 受影響元件: 內含於 Node.js 的 Brotli 解碼器。
- 根本原因: 解壓縮時發生越界寫入。
- 觸發條件: 受漏洞影響的解碼器處理格式錯誤的 Brotli 壓縮資料。
- 嚴重性: CVSS v3.1 9.8;Node.js 專案將此問題歸類為高危。
- 潛在影響: 遠端程式碼執行、記憶體洩露或程序崩潰。
- 主要補救措施: 升級至已修正的 Node.js 版本。
關鍵區別: PHP2Shell 涉及在請求處理與清理過程中不安全的記憶體狀態;Node2Shell 涉及在解壓縮元件中寫入超出預定記憶體邊界。
兩者都可能導致 RCE,但底層漏洞與利用路徑不同。
4. 記憶體破壞如何轉化為 RCE?
記憶體安全缺陷為攻擊者提供影響程式運作的機會。將此機會轉化為 RCE 需要額外的利用條件。
此過程分為三個階段:
- 觸發漏洞: 提供能觸及受影響程式碼路徑的輸入。
- 破壞記憶體: 造成無效的記憶體存取或寫入,或在其生命週期結束後存取記憶體。
- 影響執行: 利用產生的記憶體狀態改變程式行為,並可能執行攻擊者控制的程式碼。
如地址空間佈局隨機化(ASLR)、不可執行記憶體、控制流程保護以及程序隔離等緩解措施,能使利用更困難或降低其影響。
然而,其效能取決於漏洞、執行環境、作業系統與部署設定。
僅有崩潰並不能證明 RCE;同樣,缺少崩潰也不代表利用失敗。
5. 探測與補救
PHP2Shell:應檢查專案
- 異常的多部分 HTTP 請求與重複的格式錯誤請求。
- PHP 工作者崩潰、分段錯誤或意外的記憶體耗盡錯誤。
- PHP 或網頁伺服器工作者啟動的非預期子程序。
- 可疑的外部連線或未授權的檔案變更。
- 意外執行指令或存取敏感應用程式資料的證據。
Node2Shell:應檢查專案
- Brotli 解壓縮時的非預期錯誤或崩潰。
- 異常的 Node.js 程序重啟。
- 非預期子程序與外部連線。
- 未授權的應用程式檔案變更。
- 可疑存取環境變數、憑證或其他敏感資料。
將應用程式日誌與程序遠端監控、端點偵測及網路紀錄相關聯。單一錯誤僅為調查指標,並非成功利用的證明。
PHP2Shell:已修正版本
以下版本已修正 CVE-2026-109618 與 CVE-2026-109619:
- PHP 8.5: 升級至 8.5.12 或更高版本。
- PHP 8.4: 升級至 8.4.27 或更高版本。
- PHP 8.3: 升級至 8.3.36 或更高版本。
- PHP 8.2: 升級至 8.2.35 或更高版本。
上游 PHP 專案尚未釋出 PHP 8.1 及更舊分支的修補程式,這些分支已停止維護。使用這些版本的組織應該遷移至受支援的版本,或遵循其供應商的安全指引。
優先保護面向網際網路的 PHP 安裝,包括 PHP-FPM、Apache 搭配 mod_php、php-cgi、FrankenPHP,以及 LiteSpeed 部署。
Node2Shell:已修復版本
以下 Node.js 版本包含對 CVE-2026-111497 的修復:
- Node.js 22.x: 升級至 22.23.4 或更高版本。
- Node.js 24.x: 升級至 24.22.1 或更高版本。
- Node.js 26.x: 升級至 26.12.1 或更高版本。
應使用最新適用的安全更新,而非將最低修復版本視為長期目標。
使用 Node.js 的應用程式也應評估能解壓攻擊者控制的 Brotli 資料的路徑,包括從外部服務取得的回應。
額外 PHP 警示:CVE-2026-115560
於 2026 年 10 月 23 日,PHP 安全團隊公佈另一個 RCE 問題,CVE-2026-115560。
此問題與兩個 PHP2Shell 漏洞獨立,並未由上述 PHP 版本修復。
此問題需要結合不尋常的設定與應用程式行為,涉及會話序列化處理器與會話上傳進度。
在可用安全更新前,PHP 團隊建議停用會話上傳進度:session.upload_progress.enabled=0
報告的攻擊路徑要求應用程式將 session.serialize_handler 設定為 php_binary 或 php_serialize,於呼叫 session_start() 前在執行階段改為 php,且保持會話上傳進度啟用。
從未在執行階段更改序列化處理器的應用程式不會受到此特定攻擊路徑的影響。
組織應遵循 PHP 團隊的建議以獲取進一步更新,並在適當修復可用前保留此緩解措施。
6. 深度防禦
修補是主要的補救措施。額外的控制可降低風險並限制成功入侵的影響。
針對 PHP 部署:
- 盤點網頁伺服器、容器及第三方產品中的 PHP 版本。
- 升級至相應的已修復版本,並重新啟動受影響的服務。
- 套用 CVE-2026-115560 的上傳進度會話緩解措施。
- 以最小必要許可權執行 PHP 工作程式。
- 限制應用伺服器不必要的外部網路存取。
針對 Node.js 部署:
- 升級至已修復的 Node.js 版本。
- 辨識解壓縮非受信任 Brotli 資料的應用程式。
- 套用合理的請求大小與資源限制。
- 以最小許可權及適當隔離執行應用程式流程。
- 監控意外流程建立、外部連線以及應用程式檔案變更。
網頁應用防火牆可能對已知攻擊模式提供額外防護,但並非替代修補底層執行環境的方式。
修補後,請確認應用程式實際使用的執行環境。更新套件並不一定代表現有工作程式或容器已開始執行已修補版本。
若懷疑被利用,請保留日誌、調查潛在的妥協點,並輪換可能已暴露的憑證。
結論
PHP2Shell 與 Node2Shell 展示了兩條不同的路徑,從記憶體安全失效到潛在的遠端程式碼執行。
PHP2Shell 揭露了 PHP 在處理中斷請求處理與陳舊內部狀態時的弱點。Node2Shell 揭露了 Node.js Brotli 解碼器中的越界寫入。
額外的 PHP 漏洞 CVE-2026-115560 強化了在最初補丁公告之外持續遵循安全公告的重要性。
核心教訓很簡單:應用程式安全取決於其底層執行環境與原生元件的完整性。
辨識受影響的部署,套用相應的修正,確認執行中的版本,並調查是否有先前被利用的證據。