
摘要
本報告探討與 Laravel 應用程式公開 APP_KEY 洩漏相關的重大安全性漏洞,可能導致遠端程式碼執行(Remote Code Execution, RCE)。報告深入分析 PHP 環境中,尤其是 Laravel 框架內的反序列化漏洞機制,並檢視如何利用被洩漏的 APP_KEY 實現 RCE。報告還討論了用於識別和利用這些漏洞的工具和方法,並強調此類洩漏對應用程式安全的廣泛影響。

1. 簡介
Laravel 是一個廣泛使用的開源 PHP 網頁框架,提供強大的網頁應用程式開發功能。然而,其內部處理
APP_KEY
(一個 32 位元組的對稱加密金鑰)的方式帶來了顯著的安全風險。此金鑰對於資料加密/解密以及密碼重設 Token 的安全生成等操作至關重要。Laravel 當前實作的一個基本缺陷是其
decrypt()
函數會自動反序列化解密的資料。這種自動反序列化與洩漏的
APP_KEY
結合,創造了一個強大的遠端程式碼執行途徑
[1]
。
這種漏洞不僅是理論上的;由於多個因素,它構成了一個重大威脅。首先,Laravel 的程式碼庫包含許多記錄完善的 PHP gadget chains。這些 chains 可在
unserialize()
程序中結合以實現任意命令執行,且在工具如
phpggc
中隨手可得
[1]
。其次,安全研究人員的最新發現表明,
APP_KEY
的洩漏與應用程式層級漏洞結合,可能導致受影響系統上的 RCE
[1]
。最後,使用
APP_KEY
對 cookie 進行序列化和加密,可能導致簡單的 RCE 攻擊,這一漏洞最初記錄為 CVE-2018-15133,且在特定設定的較新 Laravel 版本中仍然存在
[1]
。
本報告旨在提供這些漏洞的全面技術分析,重點探討其底層機制、利用技術以及對 Laravel 應用程式的更廣泛安全影響。
2. APP_KEY 漏洞的技術分析
2.1. PHP 和 Laravel 中的反序列化漏洞
在 PHP 環境中,反序列化漏洞是一類眾所周知的安全缺陷,可能導致任意程式碼執行。當應用程式反序列化不受信任的資料時,攻擊者可以製作 malicious serialized object,該 object 在反序列化時觸發非預期的程式碼執行。Laravel 的
decrypt()
函數由於自動反序列化資料,容易受到此類攻擊。如果攻擊者獲得
APP_KEY
並能以精心製作的 payload 呼叫
decrypt()
函數,就可以在 Laravel 網頁伺服器上實現 RCE
[1]
。
2.2. PHP Gadget Chains 與 phpggc
反序列化漏洞的利用通常依賴於使用 "gadget chains"。Gadget 是應用程式程式碼庫中的一段程式碼,可被攻擊者用來執行特定動作。Gadget chain 是這些 gadgets 的序列,按順序執行時可導致更複雜且 malicious 的結果,如 RCE。
phpggc
(PHP Generic Gadget Chains)工具是一個針對各種 PHP 應用程式和框架(包括 Laravel)的預建 gadget chains 的全面資料庫。該工具提供了可用 gadget chains 的列表、其目標版本以及它們利用的漏洞類型
[1]
。
- $ ./phpggc -l laravel
- Gadget Chains
- -------------
- NAME VERSION TYPE VECTOR I
- Laravel/FD1 * File delete __destruct *
- Laravel/RCE1 5.4.27 RCE: Function Call __destruct
- Laravel/RCE2 5.4.0 <= 8.6.9+ RCE: Function Call __destruct
- Laravel/RCE3 5.5.0 <= 5.8.35 RCE: Function Call __destruct *
- Laravel/RCE4 5.4.0 <= 8.6.9+ RCE: Function Call __destruct
- Laravel/RCE5 5.8.30 RCE: PHP Code __destruct *
- Laravel/RCE6 5.5.* <= 5.8.35 RCE: PHP Code __destruct *
- Laravel/RCE7 ? <= 8.16.1 RCE: Function Call __destruct *
- Laravel/RCE8 7.0.0 <= 8.6.9+ RCE: Function Call __destruct *
- Laravel/RCE9 5.4.0 <= 9.1.8+ RCE: Function Call __destruct
- Laravel/RCE10 5.6.0 <= 9.1.8+ RCE: Function Call __toString
- Laravel/RCE11 5.4.0 <= 9.1.8+ RCE: Function Call __destruct
- Laravel/RCE12 5.8.35, 7.0.0, 9.3.10 RCE: Function Call __destruct *
- Laravel/RCE13 5.3.0 <= 9.5.1+ RCE: Function Call __destruct *
- Laravel/RCE14 5.3.0 <= 9.5.1+ RCE: Function Call __destruct
- Laravel/RCE15 5.5.0 <= v9.5.1+ RCE: Function Call __destruct
- Laravel/RCE16 5.6.0 <= v9.5.1+ RCE: Function Call __destruct
- Laravel/RCE17 10.31.0 RCE: Function Call __destruct
- Laravel/RCE18 10.31.0 RCE: PHP Code __destruct *
- Laravel/RCE19 10.34 RCE: Command __destruct
- Laravel/RCE20 5.6 <= 10.x RCE: Function Call __destruct
- Laravel/RCE21 5.1.* RCE: Function Call __destruct
- Laravel/RCE22 v10.0.0 <= v11.34.2+ RCE: Function Call __destruct
此
phpggc
的輸出展示了 Laravel 可用的廣泛 gadget chains 列表,突顯了此漏洞的長期存在性質以及新 chains 的持續發現。
2.3. laravel_crypto_killer.py 腳本
文章提到了一個客制化工具
laravel_crypto_killer.py
,用於驗證被洩漏的
APP_KEY
的可利用性。此腳本可能自動化了解密 Session cookie 並驗證是否存在序列化的 PHP 物件的程序。文章中顯示的腳本輸出揭示了解密的 Session 資料,包括
XSRF-TOKEN
和
sstic_session
,兩者均包含序列化資料
[1]
。
- [+] Cookies decrypted:
- * XSRF-TOKEN
- (contains serialized data)
- s:81:"a4d0e5947d190e3e2c1a3abfcdcfe610176b974c|y5LcI3hGj46KDBA8NwBt";
- * sstic_session
- (contains serialized data)
- s:81:"c487b436096b788089efd1cdf18b9f537536601d|8HmruhPXM8Jh9GfwaJow";
解密的 cookie 中存在序列化資料,證實了該漏洞。攻擊者隨後可將這些序列化資料替換為由
phpggc
生成的 malicious payload,以實現 RCE。
2.4. 從偵測到驗證
文章中強調的研究涉及公開暴露的
APP_KEY
的全面偵測和驗證程序。最初的重點是識別公開暴露的
APP_KEY
,這些通常出現在
.env
檔案或其變體如
.env.production
中。這些檔案通常是各種應用程式秘密的常見儲存庫,不僅限於 Laravel 認證。分析顯示,大部分暴露的
APP_KEY
來自此類設定檔案
[1]
。
進一步調查顯示,許多開發者無意中同時暴露
APP_URL
和
APP_KEY
。這種組合創造了一個更強大的攻擊途徑,因為
APP_URL
定義了應用程式的基礎 URL,Laravel 使用它來生成絕對連結和資產 URL。當
APP_URL
和
APP_KEY
均被洩漏時,攻擊者可直接存取目標應用程式,取出 Session cookie,並嘗試使用暴露的金鑰解密它們
[1]
。
這種暴露的規模相當可觀。自 2018 年以來,GitHub 上約有 28,000 個
APP_KEY
和
APP_URL
對暴露。雖然僅約 10% 仍然有效,但它們仍使 120 個應用程式容易受到簡單的遠端程式碼執行攻擊。令人震驚的是,即使在發現後,仍有 50 個被洩漏的
APP_KEY
被開發者從 GitHub 儲存庫中刪除,而非正確輪換被洩漏的秘密,這突顯了安全實務的重大缺失和更好秘密管理的需要
[1]
。
2.5. 從 APP_KEY 到更多秘密
APP_KEY 的疏忽處理引發了對其他敏感秘密可能暴露的更廣泛擔憂。研究探討了 APP_KEY 暴露是否與其他類型的秘密洩漏相關。結果發現, APP_KEY 洩漏通常伴隨其他秘密暴露,表明這些秘密很少單獨存在。它們的暴露可能超出 Laravel 應用程式危害,潛在影響整個基礎設施環境 [1] 。
分析中識別的常見共洩漏秘密包括資料庫認證(例如 MongoDB、MySQL、PostgreSQL)、雲端儲存 Token(例如 Digital Ocean Spaces、Dropbox、AWS S3)、電子商務平台認證(例如 Stripe、PayPal、Square、WePay)、客戶支援系統認證(例如 JIRA、Zendesk、HubSpot),以及日益增加的常見 AI 服務 Token(例如 OpenAI、Hugging Face) [1] 。這強調了應用程式生態系統中秘密的互聯性以及一個秘密被洩漏時的放大風險。
3. 結論
Laravel APP_KEY 的公開暴露構成嚴重的安全性漏洞,主要是因為框架自動反序列化解密資料的缺陷。這種缺陷結合 PHP gadget chains 以及 APP_KEY 和其他敏感認證的廣泛無意暴露,創造了遠端程式碼執行攻擊的溫床。研究顯示,這些漏洞並非理論上的,而是可積極利用的,影響了大量應用程式。
有效的秘密管理,包括妥善輪換被洩漏的金鑰和 URL,對於減輕這些風險至關重要。研究結果還強調了持續秘密監控的關鍵重要性以及現實世界部署中可利用的錯誤設定的普遍性。協作安全研究和強大的秘密偵測與驗證工具的開發對於保護更廣泛的生態系統免受此類普遍威脅至關重要。