Zend Framework遠程執行代碼漏洞
Zend Framework (ZF)是Zend公司推出的一套PHP開發框架。是用 PHP 5 來開發 web程序和服務的開源框架。ZF 用 100% 面向對象編碼實現。 ZF 的組件結構獨一無二,每個組件幾乎不依靠其他組件。這樣的松耦合結構可以讓開發者獨立使用組件。 我們常稱此為 “use-at-will”設計。
Zend類是整個Zend Framework的基類,之所以有這個類是為了使Zend Framework遵循DRY原則(Don't Repeat Yourself)。這個類只包含靜態方法,這些類方法具有Zend Framework中的很多組件都需要的功能。
Zend Framework出現漏洞已經不是第一次了,早在2012年,WooYun就曝出了Zend Framework(ZF)框架中的XMLRPC模塊存在xxe(XML external entity)注入漏洞,攻擊者可借此讀取服務器上的任意文件,包括密碼文件及PHP源代碼。當時200余家網站存在這一漏洞,知名開源建站平臺Magento等使用ZF框架的建站系統也受該漏洞影響。
本周bleepingcomputer揭露了一個不受信任的反序列化漏洞,攻擊者可以利用Zend Framework在PHP站點上實現遠程代碼執行。
目前這個漏洞被命名為CVE-2021-3007,此漏洞也可能影響Zend的替代項目Laminas,在一年前,Linux 基金會與 Zend Technologies、Rogue Wave Software 一起宣布 Zend 框架正在過渡到 Linux 基金會,并在新的治理框架下改名為 Laminas 項目。
Zend Framework由安裝超過5.7億次的PHP包組成,開發人員使用該框架構建面向對象的web應用程序。
從不受信任的反序列化到RCE
本周,安全研究員Ling Yizhou披露了Zend Framework 3.0.0中的一個特定gadget鏈是如何被濫用于不受信任的反序列化攻擊中的。
如果漏洞被利用,遠程攻擊者可以在某些情況下對易受攻擊的PHP應用程序進行遠程代碼執行(remote code execution, RCE)攻擊。
Zend Framework 3.0.0有一個反序列化漏洞,如果內容是可控的,可能導致遠程代碼執行,這與Stream中的Zend\Http\Response\Stream類的__destruct方法有關。
雖然實際的不受信任的反序列化必須來自易受攻擊的應用程序,而且Zend框架本身并不存在,但Zend提供的類鏈可能幫助攻擊者實現RCE。
當應用程序從用戶或系統接收的已編碼數據在應用程序解碼之前未經過適當驗證時,應用程序中就會出現不受信任的反序列化漏洞。
一個易受攻擊的應用程序可能會反序列化并處理接收到的格式不正確的數據,這可能會導致從應用程序崩潰(拒絕服務)到攻擊者能夠在應用程序上下文中運行任意命令等一系列后果。
在Zend的示例中,漏洞源于Stream類的析構函數,這是一個PHP魔術方法。
在面向對象編程中,構造函數和析構函數是在創建和銷毀新類對象時分別調用的方法。
例如,在本例中,一個新創建的Stream對象將通過構造函數在其概念處運行一系列命令。
一旦對象在整個程序執行工作流程中達到其目的,PHP解釋程序將最終調用該對象的析構函數,并遵循另一組命令來釋放內存,執行清理任務并刪除任何臨時文件,這是一種好方法。
Yizhou指出,Stream的析構函數調用的用于刪除文件的unlink()方法需要一個文件名作為參數,文件名是字符串數據類型。

Zend Framework和Laminas項目中的漏洞破壞程序
實際上,如果streamName對象為非字符串類型,則在應用程序執行結束時,仍將其傳遞給析構函數。因此,只期望字符串值的析構函數將嘗試調用對象的__toString方法,以獲取與字符串等價的值。但是,可以由對象的創建者,或者對象實例化的類的創建者,輕松地自定義__toString方法。例如,Yizhou強調了Zend Framework的Gravatar類中的__toString方法是由其程序員編寫的,其最終返回了攻擊者可以直接控制的值,以執行任意代碼。
這意味著,如果將Stream類傳遞到預期為streamName的Gravator對象,在某些情況下,攻擊者可以在使用Zend構建的易受攻擊的PHP應用程序中運行任意命令。
研究人員演示了至少2種情況,可以將序列化的對象傳遞給Zend,當通過PHP應用程序對其進行解析時,將在呈現的網頁上呈現攻擊者命令的輸出。
在概念驗證(PoC)漏洞中,研究人員演示了web應用程序的phpinfo頁面是如何成功解析他的系統命令“whoami”通過一個序列化的HTTP請求,并返回Windows帳戶名“nt authority\system”。
研究人員在演示對講機上成功運行了“whoami”命令,獲得了“nt authority system”輸出
使用Laminas構建的應用也可能會受到影響
在2020年1月,Zend框架被遷移到Laminas項目,大量的代碼被遷移到新的代碼庫中。
例如,帶有上述析構函數的Zend的Stream.php類在某些版本的Laminas中仍然存在。
該代碼可能與Laminas項目Laminas -http有關。維護人員不再支持Zend框架。然而,并不是所有的Zend Framework 3.0.0漏洞都存在于Laminas項目版本中。
雖然這并不一定表明所有用Laminas項目構建的應用程序都是脆弱的,但建議開發人員做好必要的防護。
考慮到PHP能夠在一定程度上控制大約80%的互聯網站點,并且考慮到Zend Framework的普及程度,建議開發人員徹底檢查他們的web應用程序,以確定是否存在不受信任的對象反序列化。
本周在Yii Framework中發現了一個類似的gadget鏈,攻擊者可以使用它們來攻擊易受攻擊的應用程序。
對應用程序執行徹底的安全審計是一種不時發現零日和特定于環境的漏洞的方法。
本文翻譯自:
https://www.bleepingcomputer.com/news/security/zend-framework-remote-code-execution-vulnerability-revealed/