呂慶偉,曾慶凱
(1.南京大學 計算機軟件新技術國家重點實驗室,江蘇 南京210093;2.南京大學 計算機科學與技術系,江蘇 南京210093)
輸入驗證作為一種常見且有效的安全措施[1],目的在于保證到達安全敏感點的數據的正確性和安全性。很多Web應用程序由于缺少對外來輸入數據進行有效安全檢查而存在安全缺陷[1]。
Web注入型脆弱性便是因為缺乏對外來輸入作安全驗證而引發(fā)的一類普遍存在且危害巨大的脆弱性。目前關于注入型脆弱性分析的方案大多基于污點分析[1-4]、字符串分析[5,6]等技術實現(xiàn)。污點分析通過標記污染數據、提取從數據輸入點到安全敏感點的污染依賴關系來檢測脆弱性,但不能分析以控制語句形式出現(xiàn)的驗證,可能引入誤報和降低分析的準確性。字符串分析經常與污點分析等結合來檢測注入型脆弱性,分析字符串操作的過濾能力能增強分析的準確性,依然無法處理以控制語句形式出現(xiàn)的驗證?;谙到y(tǒng)依賴圖的信息流控制分析[7,8]可用于提取這種驗證,然而系統(tǒng)依賴圖的構造非常復雜,且需要事先收集程序中所有依賴信息,用于注入型脆弱性檢測時存在冗余。
針對現(xiàn)有工作的不足,本文使用污染驅動的切片方法,有效提取程序中所有驗證操作并生成驗證圖,隨后使用分步的、攻擊者視角的字符串分析方法評價驗證圖中操作的驗證能力,根據評價結果自動生成安全補丁和對應的增強型攻擊模式。最后實現(xiàn)了原型系統(tǒng)Valer,實驗表明本文方法在檢測注入型脆弱性時能有效減少分析中的誤報。
1.1.1 從表現(xiàn)形式分類
通常,Web應用程序為了防止注入相關的攻擊,采取的措施有:對輸入進行變換,使得變換后的數據滿足程序要求,或者檢測到異常數據時中止程序的運行并返回錯誤信息[1,9]。
根據驗證操作的這種表現(xiàn)形式,可將驗證操作分為過濾型驗證和檢查型驗證。過濾型驗證通過變換或刪除輸入數據中不符合策略部分使返回數據滿足策略[1];檢查型驗證判斷輸入數據是否滿足某種策略,若滿足則繼續(xù)程序的運行,若不滿足則中斷程序的運行。
1.1.2 從驗證能力分類
Web程序中的操作如trim或md5,無論輸入是什么,返回都是良定義的。而操作如preg_match,其驗證功能依賴于具體參數。易見,驗證操作在能力方面也有差異。
本文以驗證操作的驗證能力為依據,將驗證操作分為3類:0型驗證、1型驗證和partial型驗證。0型驗證指沒有驗證能力的操作,如賦值、截斷等操作;1型驗證具有完全的驗證能力,不需要參數輔助,內置過濾操作大多屬于此類;partial型驗證是分析的重點,此類操作的驗證能力通常依賴其參數,且該部分驗證操作的驗證能力評價是否準確會影響最終分析的效果。對php程序中的驗證操作按照驗證能力分類的結果如表1所示。
表1 驗證能力分類
1.2.1 污染驅動的切片分析
本文使用污染驅動的切片方法來提取驗證。過濾型驗證操作在程序中以變量定值的形式表現(xiàn),借助污點分析即可識別和提取。檢查型驗證以控制語句形式出現(xiàn),但不是所有的控制語句都是檢查型驗證操作,當且僅當控制語句既數據依賴于數據輸入點又控制依賴安全敏感點,才是檢查型驗證操作。污染驅動的切片方法將污點分析和依賴分析結合,迭代分析程序中污染數據的依賴關系,可有效提取檢查型驗證操作。
該技術的算法大致如下:①污點分析生成污染路徑,并根據污染路徑初始化驗證圖,驗證圖中包括從數據輸入點到安全敏感點的所有驗證操作;②收集驗證圖中候選節(jié)點并計算其控制依賴節(jié)點;③分析第2步所得節(jié)點是否數據依賴于數據輸入節(jié)點,若依賴將其加入驗證圖并設置驗證圖更新標識;④依據更新標識判斷驗證圖是否穩(wěn)定,若穩(wěn)定則分析結束,否則跳轉到第2步繼續(xù)分析。
1.2.2 分步的、攻擊者視角的字符串分析
字符串分析是一種有效的靜態(tài)分析驗證操作能力的技術,文獻[1,6]等借鑒字符串分析技術評價驗證操作的驗證能力來提升注入型脆弱性檢測的準確度。然而傳統(tǒng)的字符串分析不能直接用于檢查型驗證的驗證能力評價。傳統(tǒng)的字符串分析基于流傳遞的連續(xù)性分析,且將字符串操作定義為輸入和輸出均為字符串的一類操作,而檢查型驗證操作以字符串為輸入,以布爾型為輸出。從攻擊者視角,驗證操作是相對獨立的,給定攻擊模式,不需要計算程序點的所有可能值集合,只需要判定其是否能有效阻塞潛在的惡意字符到達安全敏感點即可。
本文使用分步的、攻擊者視角的字符串分析評價驗證操作的驗證能力。既能分析兩種驗證操作,又具有較小冗余,且便于生成對應的安全補丁和增強型攻擊模式。
分步將評價分析分為兩個階段。首先依據驗證操作的驗證能力分類進行粗分析,若操作為partial型,進一步借助攻擊者視角的字符串分析來分析驗證操作的驗證能力。驗證操作分類有助于降低攻擊者視角字符串分析的負擔。所謂攻擊者視角,是指在字符串分析用于web注入型脆弱性檢測時,將輸入數據定義為滿足給定攻擊模式的惡意字符串,而不是任意格式的字符串。相比其他方法需要分析執(zhí)行完畢,攻擊者視角的分析一旦發(fā)現(xiàn)條件不滿足,分析即可終止。
1.2.3 安全補丁和增強型攻擊模式
分步的、攻擊者視角的字符串分析分析后會生成安全補丁建議和增強型攻擊模式。安全補丁在形式上與檢查型驗證操作相似。一旦外來輸入與補丁中參數匹配,則中斷程序的運行以防惡意輸入到達安全敏感點[5]。相比普通的攻擊模式,增強型攻擊模式還包括長度、必需字符或子串等信息。增強型攻擊模式有助于構造具體的攻擊實例。
以圖1中的樣例程序為例。語句1接收外來輸入,為數據輸入點,語句2判斷客戶端輸入數據是否是電子郵件格式,若不是則中止程序的繼續(xù)執(zhí)行,語句4判斷輸入數據長度,若長度大于20,由語句5對輸入數據做截斷,語句6接收輸入并進行sql查詢,為安全敏感點。易見,外來輸入到達安全敏感點即語句6之前要經過語句2、4、5的驗證,其中語句2、4為檢查型驗證,語句5為過濾型驗證。
圖1 樣例程序
借助污點分析、基于系統(tǒng)依賴圖的信息流控制分析及污染驅動的切片分析對圖1中程序分析得到的結果分別如圖2(a)、(b)、(c)所示。比較易發(fā)現(xiàn),污染驅動的切片分析計算得到的驗證圖包含了所有的驗證操作,且沒有冗余。
圖2 污點分析、系統(tǒng)依賴圖與驗證
對所得驗證圖作字符串分析,提交攻擊模式/.*;.*/,檢測發(fā)現(xiàn)程序存在注入型脆弱性,為其生成安全補丁建議[if(eregi(“/^.*;.*$/”,$email))exit;]和增強型攻擊模式[/.*;.*/,/.*@.*/,20],其中該模式表示攻擊實例中須包含字符@且限制在20個字符以內。
基于第1節(jié)的設計分析,實現(xiàn)了如圖3所示原型系統(tǒng)Valer。Valer主要由驗證提取子模塊和驗證評價子模塊兩部分組成,另外為了增強系統(tǒng)地實用性,攻擊模式以配置文件的形式提供。
圖3 Valer基本框架
驗證提取模塊由解析子模塊和污染驅動切片子模塊組成。解析子模塊負責將php程序解析為控制流圖,污染驅動的切片子模塊進一步從控制流圖提取驗證操作并生成驗證圖。驗證評價模塊由粗粒度分析子模塊和細粒度分析子模塊兩部分組成,以提取模塊生成的驗證圖和攻擊模式為輸入,作分步的、攻擊者視角的字符串分析,生成分析報告并根據需要進一步生成增強型攻擊模式和安全補丁。
Pixy[2]是一個開源的靜態(tài)檢測php程序中脆弱性的解決方案。驗證提取模塊的實現(xiàn)時在Pixy解析模塊基礎上加入依賴分析和污點分析,實現(xiàn)了污染驅動的程序切片模塊。
循環(huán)結構的處理一直是程序分析和字符串分析要重點考慮的部分,本文在分析開源程序中循環(huán)結構后發(fā)現(xiàn)驗證操作幾乎不會出現(xiàn)在循環(huán)結構或是循環(huán)條件中?;诖耍瑢崿F(xiàn)中對程序中的循環(huán)結構采取了兩種處理,當循環(huán)中不存在安全敏感點時,用一個特殊的循環(huán)節(jié)點代替整個循環(huán)結構,如果存在時,將循環(huán)作簡單的一次展開。
Pixy-parser部分負責將php程序解析為控制流圖,該過程是過程間、上下文敏感的。污染驅動的切片模塊具體實現(xiàn)了污染驅動的切片方法,能夠有效地提取程序中的過濾型驗證操作和檢查型驗證操作,并生成驗證圖。
驗證分析模塊以驗證提取模塊計算得到的驗證圖為輸入,同時調用攻擊模式庫執(zhí)行具體分析。粗粒度分析先對驗證操作進行粗粒度分類,根據分類的結果決定是否進一步調用細粒度分析模塊作分析,最后生成分析報告。報告中除對驗證圖的普通安全分析外,還包括增強型的攻擊模式和對應的安全補丁建議。
2.3.1 粗粒度分析
粗粒度分析模塊以表1所示的驗證能力分類表為依據,對驗證圖中的驗證操作分類,根據分類結果來決定下一步動作。如果驗證操作全為0型驗證可斷言與驗證圖對應的web程序部分存在注入型脆弱性,并為該脆弱性生成安全補丁建議。如果驗證操作中存在1型驗證,可斷言對應的web程序部分是安全的。當不存在1型驗證又存在partial型驗證時,調用細粒度分析模塊來分析partial型驗證是否具有完整的驗證能力。
2.3.2 細粒度分析
細粒度分析模塊執(zhí)行攻擊者視角的字符串分析。該模塊 Anders M ller所實現(xiàn)自動機運算包dk.brics.automaton為基礎進行實現(xiàn)。相比其他字符串分析模擬所有的字符串操作,細粒度分析模塊只模擬分析字符串替換、正則表達式匹配等partial型操作。另外,細粒度分析是攻擊者視角的,無需計算字符串操作后的所有可能值,而是將計算簡化為攻擊模式經過字符串操作計算后是否為空,有效降低了計算復雜度。
原型系統(tǒng)Valer中數據輸入點和安全敏感點都是可配置的,本文的實驗部分只檢測了待測試程序中的sql注入脆弱性,故將數據輸入點設置為{_GET,_POST,_COOKIE,_REQUEST},安全敏感點設置為{mysql_query}。另外,攻擊模式也由分析人員提供,本次實驗使用的攻擊模式為/’or1=1/及其編碼格式/0x27or1=1/,表示繞過數據庫驗證的一類sql注入攻擊。
實驗選取了Eve activity tracker、Minibloggie、Utopia News Pro等3個開源web程序作為測試程序。其中Eve activity tracker是一個用戶行為追蹤程序,Minibloggie是一個小型博客系統(tǒng),Utopia News Pro是一個新聞管理系統(tǒng)。
表2 實驗基本結果
表2記錄了實驗基本結果,其中第一列為web應用的名稱,第二列為每個應用中代碼量,一定程度反映了程序的大小和復雜度,第三列表示程序中可能被sql注入攻擊的敏感點數量,第四列為提取分析模塊計算得到的各個web應用中驗證圖的數量,其中驗證圖包含程序中從外界輸入點到安全敏感點的相關操作,最后一列是檢測到的脆弱性的數量。
表2可知,污染相關的檢查型驗證確實存在于web程序中且具有一定比例,且不管程序中的敏感點還是最終的脆弱性數量都會隨著程序規(guī)模的增大而變多。另外Valer也為所檢測脆弱性生成了安全補丁建議和增強型攻擊模式。
表3中記錄了被分析程序中驗證圖的詳細信息,其中第三列數據為數據對,表示包含內置編碼過濾操作和自定義過濾操作的數量的驗證圖數量,第五列為包含檢查操作的驗證圖數量,第四、六列分別為驗證圖中過濾操作和檢查操作具有完全過濾功能的驗證圖數量。需要強調的是使用內置的編碼操作是所提倡的編程習慣,然而大多內置編碼操作依然只能過濾普通的惡意攻擊串,對攻擊串簡單變形便可逃避該類過濾的驗證,如本次實驗提供的編碼型攻擊模式。而用戶自定義的檢查操作正確的話能夠最大程度的反應程序可接受輸入的集合。根據實驗結果對比也容易發(fā)現(xiàn)檢查型驗證操作對程序的安全具有極其重要的作用,忽略對檢查型驗證的分析必然會產生誤報等問題。
表3 實驗驗證圖
以Utopia News Pro中comments.php頁面里的一個程序片斷$newsid=addslashes($ _POST[‘newsid’]);if(!preg_match(‘/^[\d]+$/’,$newsid)){unp_msgBox($gp_invalidrequest);exit;}$checknews=$DB->query("SELECT * FROM`unp_news`WHERE newsid=‘$newsid’");為例?;趥鹘y(tǒng)污點分析的檢測手段會檢測其為一個sql注入型脆弱性,而$newsid可接收的輸入集合為數字型變量,易發(fā)現(xiàn)是一個誤報。本文方案考慮了程序中檢查型驗證,有效避免了該誤報的產生。
結合表2和表3,可知Eve activity tracker幾乎沒有任何驗證措施,提取到的每個驗證圖被驗證評價模塊分析后都是有脆弱性的,而Minibloggie盡管采取了較多的驗證操作,甚至過濾操作都為內置編碼操作,12個驗證圖中只有兩個驗證圖是安全的,Utopia News Pro程序盡管檢測到56個脆弱性,因為大量使用了用戶自定義的檢查型驗證操作,包含檢查型驗證操作的驗證圖總共有85個,具有完全驗證功能的達到57個之多,大大降低了程序中脆弱性的比例。
文獻[2]設計了一個靜態(tài)分析工具Pixy來檢測web應用中的脆弱性,實現(xiàn)了程序解析、常值分析、別名分析、污點分析等分析。因為驗證提取不完全和沒有進一步分析驗證操作的驗證能力,其誤報率有50%多。文獻[1,5-7]等或以Pixy的結果作分析或進一步開發(fā),本文所實現(xiàn)系統(tǒng)Valer也以Pixy為基礎實現(xiàn)了污染驅動的程序切片模塊。文獻[1]將靜態(tài)分析和動態(tài)分析結合,來驗證過濾操作的是否正確或完全,具有較好的效果。遺憾的是依然沒有考慮驗證操作的全面性。文獻[10]是一個動態(tài)解決方案,將污點分析和fuzz技術結合來檢測客戶端脆弱性,考慮了檢查型驗證的分析。文獻[3,4]將污點分析和字符串分析結合,分別用于檢測sql注入和xss脆弱性檢測。相比,Valer能同時檢測兩種類型的脆弱性,并可生成增強型攻擊模式和安全補丁。與文獻[9,11]檢測web注入性脆弱性并可生成具體的攻擊實例不同,本文生成增強型攻擊模式,增強型攻擊模式有助于生成更多的攻擊實例。文獻[5,6]以Pixy為基礎,實現(xiàn)了基于字符串的分析工具Stranger。使用Stranger來分析web脆弱性,生成脆弱性特征和安全補丁。Stranger直接依賴Pixy的結果做分析,本文考慮了驗證操作提取的全面性,對Pixy作了相應改進,并從攻擊者視角簡化字符串分析,生成增強型攻擊模式和安全補丁。
程序中驗證操作提取的完整性以及對驗證操作的驗證能力評價的準確性是評價注入型脆弱性檢測效果的兩個重要要素。本文使用污染驅動的切片方法,比較完整地提取了程序中的所有驗證操作,并借助分步的、攻擊者視角的字符串分析對驗證操作的驗證能力進行評價分析,以更準確的檢測web注入型脆弱性。相比已有工作,有效降低了分析過程中的誤報,且能夠為檢測到的脆弱性生成安全補丁和增強型攻擊模式,具有一定地實用性。
[1]Balzarotti D,Cova M,Vigna G,et al.Saner:Composing static and dynamic analysis to validate sanitization in web applications[C]//Proc of IEEE Symposium on Security and Privacy,2008.
[2]Jovanovic N,Kruegel C,Kirda E.Pixy:A static analysis tool for detecting web application vulnerabilities[C]//Proc of IEEE Symposium on Security and Privacy,2006.
[3]Wassermann G,Su Z.Sound and precise analysis of web applications for injection vulnerabilities[C]//Proc of the ACM SIGPLAN Conference on Programming Language Design and Implementation,2007.
[4]Wassermann G,Su Z.Static detection of cross-site scripting vulnerabilities[C]//Proc of the 30th International Conference on Software Engineering,2008.
[5]Alkhalaf M,F(xiàn)ang Yu,Bultan T.Patching vulnerabilities with sanitization synthesis[C]//Proc of International Conference on Software Engineering,2011.
[6]Yu F,Alkhalaf M,Bultan T.Stranger:An automata-based string analysis tool for php[C]//Proc of International Conference on Tools and Algorithms for the Construction and Analysis of Systems,2010.
[7]Hammer C,Krinke J,Snelting G.Information flow control for java based on path conditions in dependence graphs[C]//Proc of IEEE International Symposium on Secure Software Engineering,2006.
[8]Hammer C,Schaade R,Snelting G.Static path conditions for Java[C]//Proc of the Third ACM SIGPLAN Workshop on Programming Languages and Analysis for Security,2008.
[9]Kieyzun A,Guo P J,Jayaraman K,et al.Automatic creation of SQL injection and cross-site scripting attacks[C]//Proc of 30th International Conference on Software Engineering,2008.
[10]Saxena P,Hanna S,Song D,et al.Flax:Systematic discovery of client-side validation vulnerabilities in rich web applications[C]//Proc of the Network and Distributed System Security Symposium,2010.
[11]Martin M,Lam M.Automatic generation of XSS and SQL injection attacks with goal-directed model checking[C]//Proc of USENIX Security Symposium,2008.