PHP多個版本爆出遠程DOS漏洞


近日,php多個版本爆出遠程DoS漏洞(官方編號69364),利用該漏洞構造poc發起鏈接,很容易導致目標主機cpu的100%占用率,綠盟科技威脅響應中心隨即啟動應急機制, 啟動應急響應工作,總結PHP漏洞要點,並制定了一系列防護方案。

  受此漏洞影響的軟件及系統包括PHP的版本有:

  • PHP 5.0.0 - 5.0.5

  • PHP 5.1.0 - 5.1.6

  • PHP 5.2.0 - 5.2.17

  • PHP 5.3.0 - 5.3.29

  • PHP 5.4.0 - 5.4.40

  • PHP 5.5.0 - 5.5.24

  • PHP 5.6.0 - 5.6.8

  此次漏洞具備的特性有:

  1. 一旦被利用成功,可以在迅速消耗被攻擊主機的CPU資源,從而達到DoS的目的;

  2. PHP在全球的部署量相當大,為攻擊者提供了相當多可以攻擊的目標;

  3. PHP官方目前僅給出了5.4及5.5版本的補丁。

  有關PHP遠程DoS漏洞

  4月3日,有人在PHP官網提交PHP 遠程DoS漏洞(PHP Multipart/form-data remote dos Vulnerability),代號69364。該漏洞涉及PHP的所有版本,影響面較大,所以發布后迅速引發多方面關注。14日,各種PoC已經在網絡上流傳。

  Boundary中的鍵值對分隔

  PHP是一種流行的Web服務器端編程語言,它功能強大,簡單易用,利用它編寫網絡應用程序,可以應對大規模的Http請求,所以很多業務環境中都部署了PHP。考慮規范性,PHP在設計之初就遵循rfc規范,進行各個協議模塊的封裝及過程處理。PHP與其他同樣遵循rfc規范的語言及環境相比,不過是處理方式不同。

  而從rfc1867開始,http協議開始支持"multipart/form-data"請求,以便接受多種數據格式,包括多種變量甚至是文件上傳。multipart/form-data中可以包含多個報文,每一個報文boundary(分隔符)分隔開來,而每個報文中都包含了多行鍵值對,鍵值對用冒號分隔,這樣的設計是為了讓程序可以清晰的區分這些數據。

  

1

  但如果由於某種原因,鍵值中間缺少了那個冒號,PHP函數會將下一對鍵值合並到了上一行,形成這樣的鍵值對,“鍵1:值1鍵2值2”。由於PHP進行鍵值合並的算法不夠優化,這樣的事情發生幾次還沒什么,如果數以百萬記,就變成了一種災難。

  在下面的例子中,當a的部分達到一定數量的時候(幾十萬行or上百萬行),由於每行鍵與值之間並沒有冒號分隔,函數就自動將下一行的鍵值對合並,這樣數據越來越大,越來越長,函數針對這些數據不斷執行內存的分配和釋放,最終被攻擊目標主機的CPU資源被耗盡。

2

 

  這樣的代碼,在抓包時顯示情況如下:

3

  Boundary報文解析過程

  PHP在main/rfc1867.c中,有兩個函數都涉及boundary的解析,包括SAPI_API SAPI_POST_HANDLER_FUNC及multipart_buffer_headers函數。DoS漏洞出現在main/rfc46675pxultipart_buffer_headers函數。

  PHP先解析解析multipart/form-data http請求, http請求體的入口函數在SAPI_POST_HANDLER_FUNC(rfc1867.c中的函數),SAPI_POST_HANDLER_FUNC函數首先解析請求的boundary,也就是POST請求中第一次定義時的boundary;並且在其內部調用了multipart_buffer_headers,該函數先找到boundary(也就是一次引用的boundary),會和定義時的boundary比較。如果相等即找到第一次引用的boundary,接下來會逐行讀取請求的輸入以解析body port header(也就是解析第一次引用boundary后面的內容)。

  SAPI_API SAPI_POST_HANDLER_FUNC

  

4

05

6

7

  multipart_buffer_headers

  

8

9

10

  出現問題的函數處理邏輯

  multipart_buffer_headers函數在解析HTTP請求中的multipart頭部數據時,每次解析由get_line得到的一行鍵值對。當被解析的行是以空白字符開始,或者出現一個不包含 ' : ' 的行,該行將被當作是上一行鍵值對的延續來處理,將當前的值拼接到上一個鍵值對里,並且在拼接的過程里,該函數進行如下動作:

  一次內存分配

  

11

 

  兩次內存復制

 

12

 

  一次內存釋放

  

13

 

  當出現多個不包含 ' : ' 的行時,PHP就會進行大量內存分配釋放的操作,並且分配的空間與拷貝的長度將越來越大。當行的數目足夠多時,拷貝的操作將顯著的消耗服務器的CPU。實際測試中,包含近一百萬行的頭字段可以使服務器的CPU保持100%幾秒或者數十秒。如果並發多個攻擊請求,可能造成更長時間的資源占用。

  漏洞利用原理

  攻擊者可通過發送一個2M左右的包含多行multipart頭部數據的HTTP請求來發起攻擊,無需認證,也不依賴PHP程序本身的內容。例如,通過發送畸形請求,每隔若干秒,同時並發多個這樣的請求,就會耗盡目標主機的CPU資源。

  PHP遠程DoS漏洞檢測

  面對如此簡單的漏洞利用,以及較低的攻擊門檻,分析人員迅速將經過安全驗證后的檢測方法向雲端、產品端及服務端傳遞,並建議用戶盡快對其業務環境進行一次全面的漏洞檢測,以便可以盡快拿到第一手數據,為后續制定漏洞防護方案及執行措施提供數據支撐及決策依據。

  雲端檢測

  5月16日晚,綠盟科技客戶自助門戶系統Portal發布PHP遠程DoS漏洞檢測引擎,為PHP Multipart/form-data遠程DoS漏洞(PHP-69364)提供掃描支持。

  

14

  現在您隨時可以使用這個自助系統,對業務環境進行掃描,以便確認是否存在該漏洞,掃描請點擊:https://portal.nsfocus.com/vulnerability/list/

  漏洞確認 當掃描結果信息中出現信息“您的檢測目標存在此漏洞”,即可確認當前業務環境中存在該漏洞,建議您盡快制定防護計划,以避免系統在獲得加固前遭受攻擊。

  產品檢測

  通過部署綠盟遠程安全評估系統(Remote Security Assessment System),可以在您的業務環境中快速掃描及獲取此次漏洞情況,同時支持1實現漏洞的安全閉環管理,包括預警、檢測、分析管理、修補、審計等幾個環節;2獲取豐富的漏洞和配置知識庫支持,該知識庫是國內領先的安全漏洞庫,目前累計接近3萬條;3靈活部署,並獲得綠盟企業安全中心(NSFOCUS ESPC)進行集中管理,可以有效實現大型網絡的統一漏洞管理。4享有Gartner推薦的信譽保障。

  

15

  PHP遠程DoS漏洞防護

  知道了漏洞利用方法,也知道了攻擊檢測方法,那么漏洞的防護也就知道該如何做了。如果確認您的業務環境中存在這個漏洞,那么就需要參考上面的信息,盡快制定並啟動加固方案,這些加固從漏洞補丁開始,到產品防護,到整體防護,逐步推進。

  漏洞加固

  PHP官方已經針對PHP 5.4 及PHP 5.5版本給出了補丁,請使用這些版本的用戶,盡快到官方網站下載並安裝補丁,補丁的下載地址如下:

  http://php.net/ChangeLog-5.php#5.4.41

  http://php.net/ChangeLog-5.php#5.5.25

圖片1

  如果您使用了PHP的其它版本,請隨時關注PHP官方的最新通告。

  業務安全加固


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM