
OrcaCyber 研究 - PHP2Shell:一個失敗的請求如何演變成遠端程式碼執行
- Orca新Orca: OrcaCyber Ultra 1.02026-10-17$5.00 / $10.00 每百萬 tokens · 13 tok/s
- deepseek新DeepSeek: DeepSeek V4.1 Flash 10172026-10-1745智能
- DeepSeek新DeepSeek: DeepSeek V4.1 Flash2026-10-1740智能
- Orca新Orca: OrcaCyber Zero 1.52026-10-10$3.00 / $7.50 每百萬 tokens · 151 tok/s
- openaiOpenAI: GPT-6.1 Sol2026-09-2952智能
- anthropicAnthropic: Claude Sonnet 5.52026-09-2856智能
- typesafeTypeSafe: Jev 1.132026-09-24$0.04 / $0.00 每百萬 tokens · 1076 tok/s
- OpenAIOpenAI: GPT-6 Luna2026-09-2238智能
- OpenAIOpenAI: GPT-6 Sol2026-09-2248智能
- AnthropicAnthropic: Claude Opus 5.52026-09-2258智能
- xAIGrok 4.72026-09-2146智能
- OrcaOrca: OrcaCyber Zero 1.02026-09-17$3.00 / $7.50 每百萬 tokens · 157 tok/s
- OrcaOrca: OrcaVerify Text 1.02026-09-16$2.00 / $0.00 每百萬 tokens · 1885 tok/s
- OpenAIOpenAI: GPT-6 Astra2026-09-0453智能77程式
- GoogleGoogle: Gemini 3.8 Flash2026-09-0241智能76程式
- AlibabaQwen: Qwen3.8 Max (0902)2026-09-0245智能76程式
- AnthropicAnthropic: Claude Fable 5.12026-09-0153智能82程式
- TencentTencent: Hy4 preview2026-08-28$0.83 / $2.50 每百萬 tokens · 49 tok/s
- AlibabaQwen: Qwen3.8 Flash2026-08-26$0.15 / $0.47 每百萬 tokens · 105 tok/s
- z-aiZ.ai: GLM 5.3 Flash2026-08-2642智能72程式
本調查的概念驗證是使用OrcaCyber Zero與OrcaCyber Ultra模型建立的。研究資料包記錄了原始碼層級分析、使用經改編之公開漏洞利用程式進行的受控重現、記憶體洩漏產物、程序當機,以及命令執行證據。所提供的檔案並未獨立記錄各模型執行了哪些步驟;模型歸屬由研究團隊提供。
致命的記憶體不足(out-of-memory)狀況應能安全地終止請求。但在這裡,它可能在原生狀態僅部分初始化時就打斷 PHP,留下持續存在至下一個請求的參照。結果便構成跨請求的記憶體生命週期違規,在受測環境中造成的後果從資訊洩漏到遠端程式碼執行不等。
關鍵證據一覽
• 目標 — PHP 8.4.26、Apache/mod_php、單一 worker、隔離的 Docker 實驗環境。
• 當機日誌 — 在提供的摘錄中,有一次 SIGABRT 和三次 SIGSEGV worker 結束。
• HTTP 回應 — URL 解碼後的 PHPSESSID 值中有 819,200 位元組。
• 執行證明 — code>uid=33(www-data) gid=33(www-data) groups=33(www-data)/code>。
• 迴歸 — 報告描述了在已修補的 PHP 8.4.27 上四次未成功的嘗試;原始執行紀錄未隨附。
來源:上傳的 REPORT.md、crash_evidence.log、leak_attempt.resp 與 rce_proof_8426.txt。以下所述的展示圖係將該等產物重製為排版後的證據面板;其並非照片,亦非原生終端機畫面截圖。
1. 漏洞:請求邊界的所有權失效
這兩個相關問題涉及被中斷的請求初始化,以及過期的執行階段全域指標。在相關的 PHP 架構中,multipart/form-data 處理與工作階段上傳進度回呼可能會在一般使用者應用程式碼之前執行。異常的控制流程轉移(包括 code>zend_bailout()/code>)可能會略過預期的清理,並讓狀態指向稍後會被釋放或重複使用的記憶體。
安全性不變量:暴露給請求 B 的 worker 全域參照,絕不得參照其所有權與生命週期已隨請求 A 結束的記憶體。所回報的失敗違反了該不變量。
所展示的端點是一個極簡的 PHP 頁面,僅回傳 OK;該漏洞利用的敘述並不依賴應用程式層級的 SQL 注入、檔案包含或反序列化端點。
2. 技術順序
• A1 — 中斷。 Multipart 與上傳進度處理在清理期間觸發 OOM,留下過期的工作階段狀態。
• B1 — 洩漏。後續請求會導致工作階段 Cookie 序列化時讀取超出有效工作階段 ID 的範圍。
• 位址復原。外洩的指標值會被用來推斷該建置中相關的程式庫與堆積佈局。
• A2/B2 — 損毀。 另一個雙請求序列會形塑並重新導向關機時所使用的過期資料。
• 結果。改寫後的公開漏洞利用程式回報以 www-data 身分執行命令。

證據證物:所提供的檔案實際顯示的內容
證物 A — 來自 Apache 日誌的 worker 終止
• code>[core:notice] [pid 1:tid 1] AH00051: child pid 54 exit signal Abort (6), possible coredump in /etc/apache2/code>
• code>[core:notice] [pid 1:tid 1] AH00051: 子行程 pid 55 結束訊號 Segmentation fault (11),可能在 /etc/apache2 中有核心傾印/code>
• code>[core:notice] [pid 1:tid 1] AH00051: child pid 58 exit signal Segmentation fault (11), possible coredump in /etc/apache2/code>
• code>[core:notice] [pid 1:tid 1] AH00051: child pid 61 exit signal Segmentation fault (11), possible coredump in /etc/apache2/code>
摘自 crash_evidence.log 的排版摘錄(2026 年 10 月 23 日)。多個 worker 結束的情形支持記憶體安全失效的結論;僅憑當機並不足以確立 RCE。
附件 B — 帶有異常工作階段 Cookie 的 HTTP 回應
• code>HTTP/1.1 200 OK/code>,省略二進位資料。
• code>Server: Apache/2.4.69 (Debian)/code>
• code>X-Powered-By: PHP/8.4.26/code>
• code>Set-Cookie: PHPSESSID=[已省略的二進位資料]/code>
• 編碼後的 Cookie 長度:2,330,754 位元組。
• URL 解碼後的值:819,200 位元組。
量測結果是直接從 leak_attempt.resp 計算得出。二進位值被刻意省略,以避免重現任何外洩的程序內容。
證物 C — 執行證明
code>uid=33(www-data) gid=33(www-data) groups=33(www-data)/code>
rce_proof_8426.txt 的確切內容,如所提供。此內容可佐證所報告的執行結果,但並非完整的命令/工作階段逐字記錄。

附件 D — 工作階段生命週期修正
• code>static inline void php_rinit_session_globals(void)/code>
• code>@@ -121,6 +120,7 @@ static inline void php_rinit_session_globals(void)/code>
• code>* 會在請求啟動期間、RINIT 之前,於尚無使用者時重新編碼工作階段/code>
• code>/* 在 RINIT 之前執行:不得叫用任何使用者程式碼,請參閱 php_session_unserialize_init() *//code>
• code>/* 這段程式碼會在 RINIT 之前執行,因此我們需要提早清除這些 *//code>
• code>php_rinit_session_globals();/code>
從 session.c.diff 精選的原始碼差異行。此變更會比一般 RINIT 更早明確重設工作階段全域狀態。
3. 為什麼證據很重要
記憶體揭露提供了程序崩潰與漏洞利用鏈之間的橋樑。一個大小異常且內嵌二進位資料的 session 值,與執行環境將無效記憶體解讀為 Zend 字串的情況相符。該研究報告進一步描述從洩漏視窗中提取程式碼與堆積位址。證據包包含原始回應,但不包含可證明每個已復原位址的獨立腳本。
RCE artifact 顯示 www-data 的安全性內容。它並不證明可取得 root 存取權、危及生產環境,或可完全移植到任意 PHP 部署。單一 worker 的實驗室配置很重要,因為請求排序與 worker 親和性會影響此機制。
4. 針對底層生命週期進行修正,而不只是處理表面症狀
所提供的 PHP 修補提交 01a40e89fbfc(「避免因 bailout 造成狀態損毀」)的原始碼差異顯示了提早進行 session 全域初始化、配置器 OOM 處理的變更,以及更廣泛的重設/清理邏輯。這些變更旨在防止原生狀態在請求中斷後以無效狀態留存。僅修正 cookie 編碼路徑本身並無法恢復此記憶體所有權保證。
研究報告指出,針對 PHP 8.4.27 的多次嘗試在四項測試中並未產生異常 cookie、當機或 RCE 證明。實際修補版本的紀錄並不在本包件中,因此該項比較僅以研究人員的觀察結果呈現,而非可供獨立檢視的證物。
5. 防禦行動
• 立即處理。將受影響且仍受支援的 PHP 版本系列升級至已修補安全問題的發行版本,並依據廠商公告確認各套件的確切狀態。
• 降低暴露風險。考慮限制 multipart 輸入,並在未使用時停用 code>session.upload_progress/code>;這些措施不能取代修補程式。
• 偵測。檢視請求初始化期間的當機、非預期的 500 錯誤,以及過大的 code>Set-Cookie/code> 回應標頭。
• 保證。 以具生產代表性的 worker 集區重新測試,並驗證舊工作階段狀態無法跨要求持續存在。
6. OrcaCyber 研究方法論
這項有價值的研究任務不僅在於找出個別的不安全操作;更在於追蹤一項完整的不變量違反,橫跨請求解析、配置器行為、持續存在的原生全域變數、序列化以及關機流程。如研究團隊所標註,本次調查使用 OrcaCyber Zero 與 OrcaCyber Ultra 建立 PoC。公開的成品集支持技術重現,但未提供逐模型執行軌跡,也未證明能自主發現漏洞。
證據階梯:原始碼假設 → 可達觸發條件 → 執行期失敗 → 資訊揭露 → 執行證明 → 修正版本回歸。此序列比漏洞描述或僅有當機結果更能建立更強的信心。它也鼓勵在缺少原始碼檔案或原始執行日誌時,清楚報告不確定性。
7. 範圍與限制
本出版物描述一個經授權的隔離 Docker 實驗環境。此漏洞利用程式以先前已發表的 PHP2Shell 研究為基礎,並在隨附報告中記錄了本地化調整。此套件包含指令碼、差異檔、回應位元組、日誌與證明輸出,但省略了完整的上游漏洞利用程式碼簽出、原始截圖,以及完整的原始修補回歸測試逐字記錄。並未聲稱有任何真實世界的受害者或客戶遭到入侵。
來源與產出物
主要:提供的 php2shell-report-bundle.tar.gz(REPORT.md;report-CVE-2026-109618.md;report-CVE-2026-109619.md;crash_evidence.log;leak_attempt.resp;rce_proof_8426.txt;PHP 原始碼差異)。公開背景:PHP 安全公告 GHSA-w8hw-w9fx-j79w 與 GHSA-6wmf-4rv5-p3rp;PHP 安全版本發布公告。公開漏洞利用歸屬:9bie/php2shell-bypass-aslr-exp。研究儲存庫:orcacyber-php2shell-research。

重點:一個請求失敗了;一個指標存活下來;下一個請求信任了它。理解這個漏洞的難處,在於用可觀察的證據建立那個連結。
本文中的比較1
根據本文內容識別
