出處:27th USENIX Security Symposium
作者:Abeer Alhuzali, Rigel Gjomemo, Birhanu Eshete, and V.N.
單位:Venkatakrishnan University of Illinois at Chicago
資料:Paper | Github
譯者:Z3R0YU
譯者博客:http://zeroyu.xyz/

1. Abstract & Introduction

作者在本文中提出了一種以靜態分析作為指導,結合動態分析自動驗證漏洞并構造可用exploit的工具NAVEX。

研究問題:

  1. 解決以往自動化審計的誤報以及必須結合人工參與構造Exp的問題;
  2. 靜態分析雖然覆蓋率高,但是對于具有動態特性的語言其建模困難。

解決方案:

  1. 靜態分析階段:使用符號執行創建Web應用程序的各個模塊的行為模型。標記出包含潛在漏洞點的模塊;
  2. 動態分析階段:使用Web爬蟲和concolic執行器去發現可能導致攻擊者進入易受攻擊模塊的可能的HTTP導航路徑,之后使用約束求解器生成一組對漏洞進行利用的HTTP輸入序列。

方案優點:

  1. 動態分析與靜態分析相結合提升了性能,可以應用于大型應用程序;
  2. 是一種多類型漏洞的Exp生成框架。

NAVEX分析了320萬行PHP代碼,自動構建并利用204個漏洞,其中有195個與SQLI和XSS相關,而9個與邏輯漏洞相關。此外NAVEX是第一個可以自動發現并利用EAR漏洞的方案。

2 Challenges and Approach Overview

2.1 Running Example

下面是一個包含漏洞的小型Web程序。selectBooks.php模塊在第23-38行使用了Web表單來實現選擇數據,其中在23行調用了JavaScript來驗證數輸入,相關定義在第31-36行。第4-12行實現用戶輸入由服務器端代碼進一步驗證和過濾。之后第17行通過MySQL查詢來驗證書籍的可用性。最后根據查詢結果,初始化$_SESSION['ISBN']并在瀏覽器上打印到hold.php的HTTP鏈接。

之后跳轉到hold.php執行附加檢查,如果滿足,則HTTP鏈接引導用戶進入下一步(第7行)。 單擊鏈接時,將設置超全局$_GET ['step'],從而讓hold.php包含模塊checkout.php并執行。

checkout.php通過向用戶提供鏈接(第19行)進行確認來完成借用過程。 該鏈接設置兩個超全局變量($_GET['step']$_GET['msg']),將在第6行進行檢驗。最后,調用確認功能(第13行)以通知用戶該書已成功保留。

該程序存在以下幾點缺陷:

  1. selectBooks.php:17中$publisher經過簡單校驗就傳入SQL語句進行拼接,可造成SQLi漏洞(str_place函數進行了無效過濾);
  2. checkout.php:15行使用了echo,可能會造成XSS;
  3. selectBooks.php:3行調用header但是沒有使用exit(),造成EAR漏洞進而可以在不進行登錄的情況下觸發下面的SQLi漏洞。

2.2 Challenges

面臨的挑戰主要是以下三點:

  1. 污點可達性:對于WebApp而言,完成一個功能往往是各模塊相關聯的。此外,模塊中往往還使用內置函數過濾(比如htmlspecialchars)、隱式過濾(比如類型轉換)、自定義過濾和數據庫約束條件帶來的過濾來消除風險。所以攻擊路徑的尋找是具有一定難度的。
  2. 動態特征:靜態分析對于動態程序的分析具有局限性,比如無法推斷動態將會生成怎樣的表單或者鏈接(比如使用JavaScript來生成的內容)。
  3. 擴展性:對大型程序的分析會覆蓋客戶端,服務器端和數據庫后端,因而會產生很多路徑,必須使用一些方法來減少一些無用的路徑。(之所以叫擴展性應該是跟后面的COG圖的擴展有關)

2.3 Approach Overview

方法主要分為兩個步驟:

  1. 可能的漏洞點識別。首先,定位程序中可能的漏洞點以及對應的模塊(這樣減少后面的搜索空間);其次,對各種過濾方案進行了精確表示;最后,對自定義的過濾先使用符號約束構建模型之后使用約束求解器來判斷過濾的穩健性。
  2. 具體的漏洞利用生成。首先,動態執行得到Web應用程序的導航結構;其次,結合靜態分析得到的漏洞點和對應的模塊尋找可行的攻擊路徑;最后,多次重復動態執行,使用約束求解最大化路徑覆蓋。

3 Architecture and Algorithms

3.1 Vulnerable Sink Identification

目的:排除那些不包含漏洞點的模塊

方法:如下圖,首先,構建每個模塊代碼的圖模型;然后,發現包含源和目標(漏洞點)之間數據流的路徑;最后,使用符號執行生成公式后利用約束求解以確定哪些路徑可能被利用。

3.1.1 Attack Dictionary

多種漏洞被觸發的過程是相似的–均是攻擊載荷到達敏感接收器進而觸發漏洞,所以NAVEX使用這種相似性構建了一個包含Sinks(敏感接收器)、Sanitizations(過濾函數)、遍歷類型(前向遍歷還是反向遍歷)和攻擊字符串(其實就是收集的WebFuzz字典)的攻擊字典來實例化針對每類漏洞的分析。

字典包含:SQLI,XSS,文件包含,命令注入,代碼執行和EAR漏洞。

3.1.2 Graph Construction

代碼屬性圖(CPG)是一種結合了抽象語法樹(AST),控制流圖(CFG),調用圖和數據依賴圖(DDG)的表示。此處,將過濾標簽和數據庫約束標記作為屬性添加到CPG,從而對其進行擴展。最終將漏洞發現問題轉變為對CPG圖的遍歷問題。

3.1.3 Graph Traversal

此步驟的目的是通過對擴展后CPG來尋找攻擊路徑,主要分為向后遍歷和向前遍歷。向后遍歷的算法如下圖所示。正向遍歷則主要是從源到可能漏洞點的路徑搜索,這種搜索方式也是對EAR漏洞的重要檢測方法。(文中提到了良性EAR–header之后不含可利用點和惡性EAR–header之后包含可利用點)。圖遍歷最終將會返回一組可能容易受到攻擊的路徑供下一步使用。

3.1.4 Exploit String Generation

利用上一步發現的攻擊路徑來生成攻擊字符串是靜態分析的最后一步。首選構造增廣公式 Fpath∧Fdb∧Fattack(Fpath是易受攻擊的路徑;Fdb是從DB標記派生的約束;Fattack是針對漏洞點的可控變量的,其值來源于之前構造的攻擊字典)。之后使用求解器求出一組解(解就是是攻擊字符串傳入可控變量后在易受攻擊的路徑上經過過濾到達漏洞點依舊可以造成危害)。到此靜態分析過程結束,之后的過程是通過動態分析得到攻擊字符串到達攻擊點的HTTP請求序列。

3.2 Concrete Exploit Generation

NAVEX執行幾個步驟來生成具體的Exp,如下圖所示。首先,創建導航圖來發現所有執行應用程序模塊的可能HTTP請求序列;之后,結合靜態分析階段得到的可能漏洞點來篩選對應模塊的執行路徑;最終,生成可用的Exp。

3.2.1 Dynamic Execution

NAVEX使用動態執行方法,借助約束求解和concolic執行來生成大量表單輸入,以幫助爬蟲最大化應用程序的覆蓋范圍。

爬蟲(解決客戶端約束條件):使用種子URL啟動,可以對Web站點的每個角色自動化登錄驗證,采用廣度優先遍歷算法,新抓取的URL將作為下一次的爬蟲的起始。此處的優點在于,首先,爬蟲可以構造符合JavaScript驗證的輸入;其次,有效表單輸入的自動生成提高了覆蓋范圍。

自動有效輸入構造:NAVEX結合了表單HTML約束Fhtml和JavaScript約束Fjs來生成最終形式約束Fform,之后使用求解器來求解,最終得到對應的HTTP請求。示例如下:

// 約束公式
Fhtml : (book_name=="Intro to CS by author1" ∨ book_name=="Intro to Math by author2")
Fjs: edition > 0
Fform: Fhtml ∧ Fjs
// 求解得到的HTTP請求
http:.../selectBooks.php?action=borrow POST[book name=Intro to CS by author1, edition=2]

解決服務器端約束:在服務端也會對輸入有一定的約束,所以在滿足前端約束后必須判斷服務端約束是否也同時得到了滿足。為解決這個問題,NAVEX會動態跟蹤判斷信息是否滿足服務端約束,主要根據以下兩點信息:(i)更改其狀態(即,創建新會話,設置新變量和超全局值等);(ii)執行敏感操作來確定請求是否成功,比如查詢數據庫等。如果檢測到請求沒有成功執行,那么將會concolic執行依據服務端程序邏輯得出約束公式并對之前發現的執行路徑進行更新,之后使用求解器求解生成新的表單數據進行提交(在成功之前會一直執行這個過程)。服務端約束示例如下:

(book name=="intro to CS by author1" ∨ book name=="intro to Math by author2") ∧ length(publisher)<=35 ∧ edition >0

PS:NAVEX會存儲導致成功提交的完整HTTP請求。

3.2.2 Navigation Graph

導航圖是一個有向圖G=(N,E),其中每個節點n∈N表示HTTP請求.每個邊e=(ni,nj)∈E表示從ni到nj的導航,表示發起d的請求,可以是鏈接形式。圖中的每個節點都具有以下屬性id,URL,role和form params,用于表示表單提交生成的HTTP請求。id屬性存儲節點的唯一標識符,URL屬性是HTTP請求中的URL,它由請求的模塊名稱和HTTP參數組成,role屬性包含爬蟲使用的登錄憑證。示例圖如下:

3.2.3 Final Exploit Generation

靜態分析:擴展的CPG圖和Exp字符串。

動態分析:NG導航圖。

如何將這個兩個信息進行組合并產生Exp就是此步的作用。

優點:將漏洞Exp的構造問題轉換為對圖的簡單搜索問題。

難點:文件被包含這個過程在NG中是看不到的。

難點解決:預處理包含解析,此步驟創建存儲文件包含關系的包含映射。通過執行遍歷來構造映射,該遍歷在增強的CPG中搜索表示對文件包含PHP函數的調用的節點,最終將得到包含圖。

之后使用NG和包含圖來搜索公共模塊到存在漏洞模塊的路徑,具體算法見下圖:

依據Figure4我們使用算法得到的序列如下:

1. http://localhost/App/index.php
2. http://localhost/App/selectBooks.php with POST params:[book name=intro to CS by author1, edition=2,publisher=aaaaaaa]
3. http://localhost/App/selectBooks.php?action
=borrow
4. http://localhost/App/hold.php
5. http://localhost/App/hold.php?step=checkout
6. http://localhost/App/hold.php?step=checkout
&msg=<script>alert(”XSS”);</script>

4 Implementation

NAVEX基于現有的幾種工具進行實現:

  1. 擴展的CPG圖利用phpjoern進行實現;
  2. 擴展的CPG圖存儲在Neo4j圖形數據庫中;
  3. 圖遍歷算法使用Apache TinkerPop編寫;
  4. 約束求解使用z3以及其擴展Z3-str;
  5. 爬蟲程序使用被約束和z3斷言擴展的crawler4j;
  6. 爬蟲對JavaScript的處理使用了Narcissus JavaScript引擎的擴展;
  7. 服務端代碼執行跟蹤使用Xdebug。

5 Evaluation

數據集:26個真實PHP應用程序,代碼庫組合為3.2M SLOC和22.7K PHP文件如下表所示。

標準:

(i) 評估最流行應用的最新版本,并且要求是復雜且大型的PHP應用程序,如Joomla,HotCRP和WordPress;
(ii) 使用NAVEX與已有的一些先進項目(例如,Chainsaw,RIPS)進行比較。

部署:實驗環境:Ubuntu 12.04 LTS VM,2核2.4GHz,40GB RAM。目標WebApp部署:(1)進行靜態分析;(2)部署后進行動態分析(注意每次爬蟲后要恢復數據庫初始狀態)

結果摘要。 NAVEX共構建了204個漏洞exp,其中195個注入類型,9個是邏輯漏洞。 增強的CPG平均將假陽性(FP)減少了87%。包含用于構建導航圖的客戶端代碼分析將Exp生成的精度平均提高了54%。 在評估集上,NAVEX能夠進行6個HTTP請求來拼接出Exp。

增強的代碼屬性圖統計:表2顯示了增強的CPG構建時間和大小,可以看出NAVEX的運行時開銷很低。

導航圖統計:表3總結了在NAVEX的步驟II中生成漏洞Exp的總時間。

以上是綜述,下面將闡述作者從四個方面對NAVEX的評估:1.Exploits;2.定量分析;3.與相關工作的比較;4.限制和討論

5.1 Exploits

接下來作者將對NAVEX針對的漏洞逐一簡要說明:

SQLI漏洞

漏洞觸發點:mssql_query, mysql_query, mysqli_query,sqlite_query

漏洞定位:155個SQLI可利用的漏洞點,其運行時間為37分和45秒。

Exp生成:105個SQLI漏洞利用Exp,其運行時間為7分和76秒。

SQLI漏洞利用

XSS漏洞

漏洞觸發點:echo、print

漏洞定位:1小時49分鐘內共發現了133個XSS可利用的漏洞點,其中5個是誤報

Exp生成:40分12秒為133個漏洞點生成了90個XSS漏洞利用

XSS漏洞利用:如下所示包含strtr函數的路徑會被認為是可被攻擊的,但是htmlspecialchars的就不會,因為strtr函數對XSS的過濾能力很弱,之后求解器會選擇%26%2339%3B-alert(1)-%26%2339%3B來進行繞過。

EAR漏洞

漏洞觸發點:header

漏洞定位:17分17秒內發現了19個良性EAR和3個惡意EAR漏洞

Exp生成:成功針對22個EAR漏洞生成了9個漏洞利用

代碼執行漏洞

漏洞觸發點:eval

漏洞定位:在21m20sec內找到98次調用但是均無安全缺陷

命令注入漏洞:

漏洞觸發點:exec,expect_popen,passthru,pcntl_exec,popen,proc_open,shell_exec,system,mail,backtick_operator

漏洞定位:在22m32sec內NAVEX沒有找到任何易受影響的漏洞點

文件包含漏洞

漏洞觸發點:include,include_once,require,require_once

漏洞定位:在27分58秒內找到1處接收器內包含了可控變量但是因為后面有約束所以無法構造出Exp,即此處依舊不可利用

5.2 Measurements

  1. 圖5顯示了NAVEX的性能(定位漏洞點的耗時和構造Exp的耗時)

  2. 圖6顯示使用了過濾和DB標簽增強的CPG對可能漏洞點判別的影響。(減少了誤報)

  3. 總覆蓋率為68%

  4. 對客戶端代碼進行分析帶來的好處:提升了精度和覆蓋率

  1. 漏洞檢測方面與RIPS,Chainsaw的對比;
  2. Exp生成與Chainsaw(只能夠對SQLi和XSS生成Exp)的對比;
  3. 效率方面與Chainsaw的對比:

生成Exp: NAVEX->25分鐘2秒;Chainsaw->112分鐘

前期準備: NAVEX->18分26秒;Chainsaw->1天13小時21分

5.4 Limitations and Discussion

  1. Web應用程序的某些功能尚不受支持,比如文件上傳邏輯;
  2. 自動從圖節點導出的TAC公式不完整(未提及哪些不支持);
  3. 靜態分析進行漏洞定位存在誤報;
  4. CPG圖不支持解析動態函數調用(文中說這個不太重要但未具體說明,可能是使用極少);
  5. 如果網站的動態邏輯不被NAVEX支持,那么將無法構造漏洞利用(比如前面的SchoolMate程序的會話維持未被支持<-筆者從文中得到的信息)

詳細見論文中表述

7 Conclusions

PS: 此部分是一些筆者個人的總結并非論文的最終總結

之前對PHP漏洞的自動化審計工作主要分為靜態分析和動態分析。其中靜態分析的一些代表的可實際使用的工具有rips、cobra、Cobra-W以及seay代碼審計系統,其中rips的建模分析以及攻擊字典的構造是比較詳細和全面的。雖然可以參考其代碼和論文進行學習,但是開源版對現在而言已經不具有實用價值。cobra是基于AST進行分析,AST是具有一定的局限性的,從分析效果上而言沒有控制流圖好,當然也沒有今天提到的CPG好。但是cobra在AST上建立的分析模型以及他對規則集的引入方式是具有一定參考性的。當然在cobra之后的Cobra-W是令人眼前一亮的感覺,雖然還未完全開發完成,但是它對文件包含的處理以及對于自定義過濾函數的處理思想是很值得學習的(相比rips的暴力直接將代碼拼接好一些)。seay代碼審計系統的優點就是其中包含了對數據庫的審計。其它的還有phpvulhunter等工具,但是年代較為久遠因而筆者沒有對其代碼做進一步的分析。在分析過上面的程序之后筆者也曾在一年前嘗試引入別名分析等新機制來進一步改善靜態分析的準確率,但是效果不是很理想隨后就棄坑了。動態分析最具代表性的是prvd,這個筆者還未進行分析,但是用效果不錯,感興趣可以對其進行進一步的分析。

最后回到本文,此文提出的NAVEX采用靜態分析和動態分析相結合的方式,可以自動完成對漏洞的分析并生成Exp。在文中提到的幾個方法都是非常新穎的,從效果上來看很不錯。如果從工程的角度來看,完全可以借鑒其思想從而進行深入的開發完善。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/859/