萬志遠,周 波
(浙江大學 計算機科學與技術學院,浙江 杭州310027)
隨著互聯網在全球范圍內的普及與發展,Web應用程序已經成為各種類型的服務供應商和客戶之間最重要的交流渠道.然而,由Web應用程序的安全漏洞遭攻擊而引發的經濟財產損失逐年遞增.其中,輸入驗證漏洞是Web應用程序中最普遍且威脅最大的漏洞類型之一.輸入驗證漏洞是指由惡意的外部輸入所引起的程序中的安全問題,常見的輸入驗證漏洞有跨站腳本和SQL 注入.為了有效地進行針對漏洞檢測的代碼審計工作[1],近年來靜態分析技術得到廣泛研究,即在Web應用程序部署前,不運行程序,從程序的內部結構和特性出發,運用程序分析技術檢測程序中的潛在漏洞.其中,靜態信息流跟蹤技術是一個研究熱點.該技術靜態地跟蹤由不可信的源頭引入的污點數據流,判斷污點數據流是否被恰當清潔,若污點數據流未被恰當清潔并且到達敏感函數,則認為存在潛在的安全風險.
高誤報率是基于靜態分析的漏洞檢測技術面臨的主要挑戰.本文旨在提出一種檢測輸入驗證漏洞的靜態分析方法,在降低漏洞檢測誤報率的同時,保證不明顯降低方法的性能.
信息流(information flow)是指信息從一個對象流向另一個對象的有效路徑[2].靜態信息流跟蹤技術[3-6],也稱靜態污點分析(static taint analysis),是通過對不可信的源頭(source)引入的數據進行污點標記,靜態地跟蹤被標記的污點數據在程序中的傳播路徑,并檢查傳播路徑中的污點數據是否在未經過清潔函數(sanitizer)恰當清潔的情況下,被敏感函數(sink)所使用.若發生這樣的情況,則表明存在安全漏洞.通過對污點數據傳播路徑的識別,可以完整地提供安全漏洞被利用時的攻擊過程.
一般而言,不可信的源頭包括網絡、文件和輸入設備,應用程序可以通過調用特定的接口獲得不可信源頭的數據.在Web應用程序中,不可信的源頭包括HTTP請求參數、HTTP請求頭部、表單隱藏域和Cookie信息等.對于Java Web應用程序而言,通過調用Java EE 的相關API可以獲得不可信源頭的輸入數據.清潔函數是指對帶有污點標記的數據進行檢查,使得輸出數據中不帶有污點標記的方法.敏感函數可以表示為對組(m,P),其中m 表示進行安全相關敏感操作的方法.方法m 中存在一些敏感參數P,當這些參數傳入污點數據時,表示存在安全攻擊的風險.
輸入驗證漏洞產生的根本原因在于外部輸入(不可信的源頭)引入的污點數據通過數據流和(或)控制流進行傳播.在傳播過程中,污點數據流未經過清潔函數恰當地清潔,最終到達敏感函數.在開放式Web應用程序安全項目(OWASP)公布的十大安全風險列表[7]中,常見的輸入驗證漏洞類型如下.
1)注入漏洞(injection flaws).注入漏洞是指Web應用程序將接收的用戶輸入數據直接作為命令或查詢語句發送至解釋器.利用注入漏洞,攻擊者能夠令解釋器執行任意的命令或查詢語句,從而導致數據丟失、問責缺失或拒絕服務.常見的注入漏洞有SQL注入漏洞.SQL注入漏洞被利用時,未經驗證的用戶輸入直接傳入后端數據庫解釋器,并且作為數據庫命令被執行.
2)跨站腳本(cross-site scripting,XSS).跨站腳本漏洞是指Web應用程序直接使用未經恰當驗證的用戶輸入數據動態生成頁面,并發送至受害者的瀏覽器端顯示.通常,攻擊者利用跨站腳本漏洞注入惡意數據,例如JavaScript、VBScript、ActiveX、HTML或Flash片段.當惡意數據在受害者瀏覽器端被執行時,可能引發用戶信息劫持、用戶設置篡改或Cookie竊取等后果.
3)未經驗證的重定向和請求轉發.未經驗證的重定向和請求轉發漏洞是指Web應用程序使用用戶提供的數據來確定重定向或請求轉發的目標Web站點.利用該類型漏洞,攻擊者可以通過操縱輸入來控制受害者訪問的目標站點,從而對受害者實施釣魚攻擊或利用受害者的信息訪問未經授權的Web頁面.
數據流分析是指通過分析程序中數據流在基本塊(basic block)之間的傳遞和修改,收集程序在不同點的數據流信息.對于程序中的任意基本塊B,基本塊之前與之后的數據流信息分別用IN[B]和OUT[B]表示,IN[B]和OUT[B]之間的約束關系由基本塊B 中語句的語義決定.該約束關系使用轉移函數(transfer function)進行描述.Kildall[8]提出一種統一的數據流分析框架來描述不同的數據流分析問題.數據流分析框架的核心理論基礎是格理論,應用格理論中的半格作為數據流分析的工具.
定義1 代數格[9]L 是由值集合和2個二元運算(交運算∩、并運算∪)組成,并滿足以下性質.
1)封閉律:對于所有的x、y∈L,存在唯一的u、v∈L,使得x∩y=u并且x∪y=v.
2)交換律:對于所有的x、y∈L,滿足
x∩y=y∩x 并且x∪y=y∪x.
3)結合律:對于所有的x、y∈L,滿足(x∩y)∩z=x∩(y∩z)并且(x∪y)∪z=x∪(y∪z).
4)L 中存在唯一的頂元素(top)┬和底元素(bottom)┴,對于所有的x∈L,滿足x∩┴=┴并且x∪┬=┬.
半格[10]與格最大的差別在于二元運算的個數,半格中只有一個二元運算∩.數據流分析使用半格的元素來表達數據流信息.
定義2 數據流分析框架(D,V,∩,F)由以下元素組成[8].
1)數據流方向D,取值為FORWARD(前向)或BACKWARD(逆向).
2)半格L=(V,∩),其中包括值的集合V 和交匯運算∩.
3)從集合V 到集合V 的轉移函數集合F,轉移函數集合中包含描述程序中每個節點邊界條件的轉移函數.
在半格L 上定義如下偏序關系≤:對于集合V中的所有x 和y,x≤y 當且僅當x ∩y=x.此外,F反映數據流信息在各個點之間的轉移情況.當F 中的函數為單調函數時,可以通過求解轉移函數的固定點求解數據流分析問題.
對靜態漏洞檢測方法進行介紹.該檢測方法的輸入為被分析程序以及Web應用程序中常見的污點源頭、敏感函數和清潔函數的相關信息.
該方法整體分為以下4個階段.
1)生成被分析程序的調用圖G,并對該程序進行指針分析.
2)遍歷程序的調用圖G 以標記程序中的污點源頭、敏感函數和清潔函數.
3)對除污點源頭、敏感函數和清潔函數以外的方法進行過程內數據依賴分析,建立方法的數據依賴關系摘要.
4)進行雙向數據流分析來跟蹤數據流,定位漏洞位置,生成漏洞警報.
指針分析是一種靜態程序分析技術,計算指針指向關系,將每一個指針變量映射到運行時可能指向的對象集合.典型的指針指向關系通過變量的指針指向集合(points-to set)表示,集合中存放運行時變量可能指向的對象.通過指針分析得到完整的指針指向關系被證明是不可判定的[11],通過指針分析只能得到近似的結果,并且算法的精確度由算法對程序結構描述的精確度決定.指針分析算法的精確度越高,時間復雜度越高,在實際的系統設計中須同時考慮方法的精確度和性能.本文采用以Andersen算法[12]為基礎的指針分析算法,直接集成了Java指針分析框架Doop[13]中實現的2種類型指針分析算法,分別是上下文不敏感(context-insensitive)的指針分析和一層調用點上下文敏感(one level of call-site context-sensitive)的指針分析,對被分析程序進行指針分析預處理.在預處理之后,系統使用指針分析的結果計算變量之間的may-alias 別名關系.
定義3 對于本地變量v 和w,定義別名關系Alias(v,w)為

式中:pts(v)和pts(w)為變量v 和w 的指針指向集合.
Java程序片段如下.

通過指針分析可以發現,變量s1和s2均指向由第16行內存分配點所表示的同一個堆內存位置,即pts(v)∩pts(w)≠?.由別名關系的定義可得,變量s1和s2之間存在別名關系Alias(s1,s2).同時,指針分析處理程序中的load/store語句,因此可以通過指針分析獲得堆內數據的依賴關系.
過程內數據依賴分析旨在獲得被分析方法參數與返回值之間的數據依賴關系摘要.
定義4 數據依賴關系摘要可以定義為對組(ret,P),其中ret表示方法的返回值,P 表示方法中所有影響返回值ret的參數的集合.
在對單個方法進行過程內數據依賴分析時,只考慮除源頭函數、清潔函數以及敏感函數以外的方法.分析從方法返回語句出發,逆向地對方法內的語句逐一進行分析,記錄影響方法返回值的變量,直達方法初始處的語句;若記錄的變量中存在該方法的參數,則將參數作為輸入生成該方法的摘要.Java程序片段如下.


方法“id”經過程間數據依賴分析得到的數據依賴關系摘要為(ret,{str}).方法“id”調用了Java標準庫中StringBuffer類的toString和append方法.為了提高分析效率,在對應用程序部分進行過程內數據依賴分析前,預先識別出與字符串操作相關的庫方法,并構建這些方法的數據依賴關系摘要,用于應用程序中方法的數據依賴分析.
方法的數據依賴關系摘要描述了參數與返回值間的數據依賴關系,在進行過程間分析時,可以避免對同一方法重復進行多次分析.當過程間分析中某方法被調用時,可以直接使用摘要獲得該方法的數據依賴關系,完成數據流傳播,從而提高方法的整體性能.
使用雙向數據流分析:首先,從敏感函數被調用處出發,進行逆向的數據流分析,即敏感性分析;然后,將污點源頭輸入的數據標記為污點數據,進行前向的數據流分析,即污點傳播.當雙向數據流交匯時,即污點源頭和敏感函數之間存在可行路徑如圖1所示,方法會發出漏洞警報.在Web應用程序中,典型的污點源頭函數包括getParameter、getHeader和getCookies,典型的敏感函數包括Statement.execute-Update、JspWriter.print和sendRedirect.
傳統的靜態信息流跟蹤技術只進行單向的污點傳播,當污點數據傳入敏感函數時進行漏洞報警.與傳統方法相比,本文方法在進行污點傳播前先進行敏感性分析,從而縮短了污點傳播路徑的長度,提高了污點傳播的效率.此外,在進行過程間數據流分析時使用過程內分析產生的數據依賴關系摘要,分別對敏感性數據和污點數據進行傳播.

圖1 漏洞檢測模型Fig.1 Vulnerability detection model
2.3.1 敏感性分析 敏感性分析是一種逆向的數據流分析,計算程序中變量的敏感性屬性.變量的敏感性屬性表示變量是否會成為敏感函數的敏感參數.表達變量敏感性屬性的半格定義為Sensitiveness,半格的值包括sensitive和insensitive,分別表示不敏感(insensitive)和敏感(sensitive)2種數據類型.當變量為不敏感(insensitive)時,表示變量不會成為敏感函數的敏感參數;當變量為敏感(sensitive)時,表示變量會成為敏感函數的敏感參數.在半格上定義偏序關系“≤”,其中sensitive≤insensitive,定義二元運算符∩為半格中的最大下界操作.在默認情況下,局部變量的敏感性屬性初始化為insensitive.
敏感性分析的半格為一個乘積格,值域集合V為P(Var×Sensitiveness).其中Var為程序中變量的集合,Sensitiveness為變量的敏感性屬性值,頂元素┬為?,底元素┴為全集Var,在該半格上定義偏序關系“≤”為?.
求解變量的敏感性屬性的迭代算法如下.

在敏感性分析中,IN[B]和OUT[B]是值為sensitive的變量的集合.S∈succ(B)表示基本塊B 在控制流圖中的所有后繼節點.
基本塊B 由一個或多個語句stmt組成.轉移函數fB定義為fB(OUT[B])=(OUT[B]-KILLB)∪GENB,其中集合KILLB為基本塊B 中變為不敏感的變量(即值為insensitive),集合GENB為基本塊B 中變為敏感的變量(即值為sensitive).敏感性分析主要關注基本塊中的數據操作語句,數據操作語句有賦值和函數調用等.這些語句中包含至少一個源數據src和一個目標數據tgt.sensitivity(stmt,src),sensitivity(stmt,tgt)={insensitive,sensitive}分別表示語句stmt中的源數據和目標數據是否敏感.數據間的敏感性屬性按如下規則傳播.
1)當stmt為賦值語句,tgt=src時,sensitivity(stmt,src)=sensitivity(stmt,tgt).
2)當stmt為調用語句,tgt=invoke(src)時,分為以下3種情況.
a)若調用的方法為敏感函數,
則sensitivity(stmt,src)=sensitive.
b)若調用的方法為清潔函數,
則sensitivity(stmt,src)=insensitive.
c)若調用的方法為其他方法,
則sensitivity(stmt,src)=sensitive(stmt,tgt).對于程序中的每一個基本塊B,逆向遍歷其中的語句stmt∈B,根據語句的類型對集合KILLB和GENB進行更新.不同類型語句對應的規則如下.1)當stmt為賦值語句,tgt=src時,GENB=
{src|sensitivity(stmt,tgt)is sensitive}∪GENB.
2)當stmt為調用語句,tgt=invoke(src)時,分為3種情況.
a)若調用的方法為敏感函數,則GENB={src}∪GENB.
b)若調用的方法為清潔函數,則KILLB={src}∪KILLB.
c)若調用的方法為其他方法,則GENB={src|sensitivity(stmt,tgt)is sensitive}∪GENB.
2.3.2 污點傳播 污點傳播是一種前向的數據流分析,計算程序中變量的污點屬性.變量的污點屬性表示變量是否受污點源頭數據的污染.表達變量污點屬性的半格定義為Taintness,半格的值包括tainted、unknown和untainted.當變量為污染(tainted)時,表示變量受污點源頭數據的污染.當變量為未知(unknown)時,表示變量的污點屬性待定.當變量為未污染(untainted)時,表示變量不受污點源頭數據的污染.在半格上定義偏序關系“≤”如圖2所示,二元運算符∩為半格中的最大下界操作.在默認情況下,將局部變量的污點屬性初始化為unknown.

圖2 半格Taintness的定義Fig.2 Definition of lattice“Taintness”
污點傳播的半格為一個乘積格,值域集合V 為P(Var×Taintness),其中Var為程序中變量的集合,Taintness為變量的污點屬性值;頂元素┬為?,底元素┴為全集Var;在該半格上定義偏序關系“≤”為?.
污點傳播的迭代算法如下.

在污點傳播中,IN[B]和OUT[B]包含2 個集合,INuntainted[B]、INtainted[B]以 及OUTuntainted[B]、OUTtainted[B]分別包含值為untainted和tainted的變量.S∈pred(B)表示基本塊B 在控制流圖中的所有前驅節點.該算法中轉移函數fB定義如下.
1)fB(INuntainted[B])=(INuntainted[B]-KILLB-untainted)∪GENB-untainted.其中集合KILLB-untainted為基本塊B 中變為污染的變量(即值為tainted);集合GENB-untainted為基本塊B 中變為未污染的變量(即值為untainted).
2)fB(INtainted[B])=(INtainted[B]-KILLB-tainted)∪GENB-tainted.其中集合KILLB-tainted為基本塊B 中變為未污染的變量(即值為untainted);集合GENB-tainted為基本塊B 中變為污染的變量(即值為tainted).
在污點傳播中,關注基本塊中的數據操作語句,即賦值和函數調用語句;語句中包含至少一個源數據src和一個目標數據tgt.taint(stmt,src),taint(stmt,tgt)={tainted,unknown,untainted}分別表示語句stmt中源數據和目標數據是否被污染.數據間的污點屬性按如下規則傳播.
1)當stmt為賦值語句,tgt=src時,
taint(stmt,tgt)=taint(stmt,src);
2)當stmt為調用語句,tgt=invoke(src)時,分為3種情況.
a)若調用的方法為污點源頭,
則taint(stmt,tgt)=tainted.
b)若調用的方法為清潔函數,
則taint(stmt,tgt)=untainted.
c)若調用的方法為其他方法,
則taint(stmt,tgt)=taint(stmt,src).
對于程序中的每一個基本塊B,前向遍歷其中的語句stmt∈B,根據語句的類型對集合KILLB和GENB進行更新.不同類型語句對應的規則如下.
1)當stmt為賦值語句tgt=src時,
GENB-tainted={tgt|taint(stmt,src)is tainted}∪GENB-tainted,
GENB-untainted={tgt|taint(stmt,src)is untainted}∪GENB-untainted.
2)當stmt為調用語句tgt=invoke(src)時,分為以下3種情況.
a)若調用的方法為污點源頭,
則 GENB-tainted={tgt}∪GENB-tainted,并 且KILLB-untainted={tgt}∪KILLB-untainted;
b)若調用的方法為清潔函數,則GENB-untainted={tgt}∪GENB-untainted,并且KILLB-tainted={tgt}∪KILLB-tainted.
c)若調用的方法為其他方法,則

通過與FindBugs 2.0.0[14]靜態檢測方法進行比較,證明本文提出的方法能夠在不明顯降低運行性能的同時,提高FindBugs的輸入驗證漏洞檢測精確度.
方法的實現基于開源靜態代碼分析工具Find-Bugs.系統整合了Java指針分析框架Doop 中的2種類型指針分析的結果,分別是上下文不敏感指針分析(CI)和一層調用點上下文敏感指針分析(CS).
實驗的運行環境為Windows XP SP2 的PC(2.33GHz Intel Core 2CPU,2GB RAM)以及Java標準 版 運 行 環 境(Java Standard Edition Runtime Environment,JRE)1.6.0_23版本和256M 堆空間.實驗的分析對象為SecuriBench[15]基準程序中7個開 源 的Java Web 應 用 程 序,表1 顯 示 了SecuriBench中基準程序的基本信息.
為了評估方法的精確度,對本文方法漏洞檢測的誤報率進行分析,并與FindBugs進行比較.如表2所示為對本文方法和FindBugs的漏洞檢測結果進行統計:“污點源頭”列顯示了基準程序中污點源頭的數量,“敏感函數”列顯示了敏感函數的數量,這2列值在一定程度上體現了人工代碼審計的工作量;“FindBugs”列顯示了FindBugs漏洞警報的數量,“CI”列和“CS”列分別顯示了整合2種不同類型指針分析后本文方法的漏洞警報數量.

表1 實驗基準程序信息Tab.1 Information of benchmarks

表2 FindBugs和本文方法的實驗結果比較Tab.2 Experimental results of FindBugs and our approach
表2顯示的漏洞警報包含真/假陽性警報.通過人工檢查,確定真/假陽性警報,并對存在假陽性漏洞警報的基準程序中的真/假陽性漏洞警報的數量進行對比.如圖3 所示,N 為漏洞警報的數量.FindBugs總共報出50 例漏洞警報,其中30 例誤報,平均誤報率為60.0%.其中,在基準程序jboard、roller和snipsnap中,FindBugs報出11例假陽性漏洞警報;在webgoat中,FindBugs報出2例假陽性漏洞警報.經人工分析發現,該13例假陽性漏洞警報對應的數據流均不來源于不可信的源頭,因而無法被利用進行攻擊.此外,FindBugs報出的其他17例假陽性漏洞警報均存在于webgoat中;漏洞警報對應的污點數據流已被應用程序中特定的方法進行清潔,因此無法被利用進行攻擊.綜上所述,FindBugs誤報率是由其不完整且不精確的信息流跟蹤造成的.

圖3 漏洞警報的真陽性與假陽性分類Fig.3 Classification of reported issues into true and false positives
本文提出的方法共報出23 例漏洞警報,其中1例假陽性,誤報率為4.3%,將FindBugs輸入驗證漏洞檢測的誤報率降低了55.7%.該假陽性警報存在于webgoat中,漏洞發生處的污點數據流已被應用程序中特定的方法進行清潔,因此無法被利用進行攻擊.此外,與FindBugs相比,本文的方法發現了額外2例存在于webgoat中的真陽性漏洞警報,類型為HTTP響應拆分漏洞(HTTP response splitting).在本文方法發現的22 例漏洞警報中,包含snipsnap中的7例HTTP響應拆分漏洞、2例webgoat中的HTTP響應拆分漏洞以及13例webgoat中的SQL注入漏洞.
在實驗中,本文方法的平均運行時間為42.8s,是FindBugs運行時間的1.9倍.本文方法的最長運行時間不超過100s,為FindBugs運行時間的2.5倍.圖4比較了本文提出的方法和FindBugs分析各個基準程序的運行時間t.實驗結果表明,本文方法在沒有明顯降低性能的同時,降低了FindBugs輸入驗證類型漏洞檢測的誤報率.經過分析發現,額外的運行時間主要來源于在數據流分析過程中使用指針分析結果計算別名關系帶來的額外開銷.
本文方法的核心算法基于數據流分析實現,數據流分析通過迭代模型求解.假設被分析程序的控制流圖中基本塊的數量為I,變量的數量為V,每一個基本塊B 的IN[B]和OUT[B]對應的集合中最多包含V 個變量,因此算法最多需要O(I×V)次迭代到達固定點.此外,每次迭代中最多包含O(I)次數據流交匯運算,每次交匯運算最多需要O(V)時間.在最壞情況下,數據流分析的時間復雜度為O(I2×V2).實際中,數據流分析的時間復雜度為O(I×V)[16].實驗結果表明,對于普通的應用程序,本文方法能夠以較小的時間代價完成.隨著輸入程序的復雜性和規模的增長,本文方法的運行時間呈線性遞增的趨勢.

圖4 FindBugs和本文方法的運行時間比較Fig.4 Execution time of FindBugs and our approach
在應用安全領域,信息流跟蹤技術被廣泛應用于安全漏洞檢測、攻擊檢測和預防、惡意軟件檢測和自動輸入過濾生成等方向.信息流跟蹤技術可以通過3種方式,即靜態、動態和混合的方式實現.本章主要針對應用于安全漏洞檢測的靜態信息流跟蹤技術進行綜述和討論.
1)基于類型的方法.Volpano等[17]提出了一種基于類型的方法,用于檢測有類型編程語言中的漏洞,通過在編程語言的類型系統(type system)中引入類型限定符(type qualifier)實現變量污點屬性的傳遞.擴展了C 語言類型系統的CQual[18]工具,通過限定推斷(qualifier inference)確定引入額外限定符的擴展系統中是否存在類型錯誤.Shankar等[5]用CQual工具對C 語言程序中的格式化字符串缺陷進行檢測.JFlow[6]方法對Java語言進行擴展,通過標記靜態地檢測程序中的安全問題,并且在Myers 的Jif(Java Information Flow)工 具 上 實 現.Huang等[19]使用類似CQual的類型系統,首次針對PHP Web應用程序的漏洞進行檢測.通常,基于類型系統的方法要改變編程語言、編譯器及運行時系統,并且需要程序員對代碼進行類型注釋.采用本文提出的方法直接分析程序,不增加程序員負擔,相比之下更具有實際應用價值.
2)基于依賴圖(dependency graph)的方法.Java字節碼靜態檢測工具MARCO[20]基于程序切片技術實現靜態數據流跟蹤.Tripp等[8]提出了Java應用 程 序 污 點 分 析 方 法(taint analysis for Java,TAJ),將MARCO 中使用的技術擴展到實際的大型Web應用程序中.Guarnieri等[21]提出了ACTARUS工具,該工具受到TAJ的重要影響,用于進行JavaScript應用程序中的安全漏洞檢測.Sridharan等[22]在ACTARUS上提出了F4F,用于支持基于框架開發的Web應用程序靜態分析.通常,基于依賴圖的方法將被分析程序用程序依賴圖(program dependency graph)或系統依賴圖(system dependency graph)表示,從而將數據流跟蹤問題轉化為圖的可達性問題.本文方法不生成被分析程序的依賴圖,直接對程序進行數據流分析.
3)基于數據流分析的方法.Jovanovic等[23]提出一種上下文敏感的過程間數據流分析算法,來檢測PHP應用程序中的輸入驗證漏洞,并實現了原型系統Pixy.與Pixy相比,本文采用基于數據流分析的方法檢測漏洞,但提出雙向數據流分析實現靜態信息流跟蹤,在一定程度上提高信息流跟蹤的效率.
黃強等提出一種在SSA(static single assignment)中間表示上進行前向污點傳播分析的方法,在潛在漏洞發生處動態插裝清潔函數.與黃強等[24]提出的方法相比,本文方法直接分析Java程序,采用前向的污點傳播和逆向的敏感性分析,縮短了污點傳播路徑的長度.
此外,Livshits 等[7]使 用 程 序 查 詢 語 言(program query language,PQL)描述漏洞檢測策略,并進行 基 于 二 元 決 策 圖(binary decision diagrams,BDD)[25]的流不敏感過程間別名分析跟蹤對象間的信息流,從而檢測程序中的安全漏洞.本文使用的漏洞檢測策略描述方式比PQL更簡潔,易于擴展.
本文針對Java Web應用程序中的輸入驗證漏洞,提出一種基于靜態信息流跟蹤的檢測方法.本文在開源靜態代碼分析工具FindBugs上實現了該方法,并在基準程序SecuriBench 上對該方法的性能和漏洞檢測精確度進行評估.實驗結果表明,采用該方法能夠有效地檢測輸入驗證漏洞,在不明顯降低FindBugs運行性能的前提下,大幅度降低了漏洞檢測的誤報率.
(
):
[1]CHESS B,WEST J.Secure programming with static analysis[M].Boston:Wesley,2007.
[2]DENNING P J.Certification of programs for secure information flow [J].Communications of the ACM,1977,20(7):504-513.
[3]SHANKAR U,TALWAR K,FOSTER J,et al.Detecting format string vulnerabilities with type qualifiers[C]∥Proceedings of 10th USENIX Security Symposium.Berkeley:USENIX,2001.
[4]MYERS A.JFlow:practical mostly-static information flow control[C]∥Proceedings of the ACM Symposium on Principles of Programming Languages.New York:ACM,1999.
[5]LIVSHITS B,LAM M.Finding security vulnerabilities in Java applications with static analysis[C]∥Proceedings of 14th USENIX Security Symposium.Baltimore:USENIX,2005.
[6]TRIPP O,PISTOIA M,FINK S J,et al.TAJ:effec-tive taint analysis of web applications[C]∥Proceedings of ACM Conference on Programming Language Design and Implementation.Dublin:ACM,2009.
[7]OWASP Top 10.2014-03-21.https:∥www.owasp.org/index.php/Top_10_2013-Top_10.
[8]KILDALL G A.A unified approach to global program optimization[C]∥Proceedings of the ACM Symposium on Principles of Programming Languages.New York:ACM,1973.
[9]GR?TZER G.Lattice theory:first concepts and distributive lattices[M].San Francisco:Freeman,1971.
[10]張鳴華.半格基礎上的數據流分析[J].計算機學報,1980(04):309-320.ZHANG Ming-hua.Dataflow analysis with semi-lattice[J].Chinese Journal of Computers,1980(04):309-320.
[11]RAMALINGAM G.The undecidability of aliasing[J].ACM Transactions on Programming Languages and Systems,1994,16(5):1467-1471.
[12]ANDERSEN L O.Program analysis and specialization for the C programming language[D].Denmark:University of Copenhagen,1994.
[13]BRAVENBOER M,SMARAGDAKIS Y.Strictly declarative specication of sophisticated points-to analyses[C]∥Proceedings of the 24th ACM SIGPLAN Conference on Object Oriented Programming Systems Languages and Applications. New York:ACM,2009.
[14]FindBugsTM-Find Bugs in Java Programs.2014-03-21.http:∥findbugs.sourceforge.net/.
[15]Stanford SecuriBench.2014-03-21.http:∥suif.stanford.edu/~livshits/securibench/.
[16]ANDREW W A,JENS P.Modern compiler implementation in Java[M].Cambridge:Cambridge University Press,2002.
[17]VOLPANO D,IRVINE C,SMITH G.A sound type system for secure flow analysis[J].Journal of Computer Security,1996,4(2/3):167-187.
[18]FOSTER J,FAEHNDRICH M,AIKEN A.A theory of type qualifiers[C]∥Proceedings of ACM Conference on Programming Language Design and Implementation.New York:ACM,1999.
[19]HUANG Y,YU F,HANG C,et al.Securing web application code by static analysis and runtime protection[C]∥Proceedings of the 12th International World Wide Web Conference.New York:ACM,2004.
[20]PISTOIA M,FLYNN R J,KOVED L,et al.Interprocedural analysis for privileged code placement and tainted variable detection[C]∥Proceedings of the 19th European Conference on Object-Oriented Programming.Glasgow:Springer,2005.
[21]GUARNIERI S,PISTOIA M,TRIPP O,et al.Saving the world wide web from vulnerable JavaScript[C]∥Proceedings of the 20th International Symposium on Software Testing and Analysis.New York:ACM,2011.
[22]SRIDHARAN M,ARTZI S,PISTOIA M,et al.F4F:taint analysis of framework-based web applications[C]∥Proceedings of the 2011ACM International Conference on Object Oriented Programming Systems Languages and Applications.New York:ACM,2011.
[23]JOVANOVIC N,KRUEGEL C,KIRDA E.Pixy:a static analysis tool for detecting web application vulnerabilities[C]∥Proceedings of IEEE Symposium on Security and Privacy.Berkeley/Oakland:IEEE,2006.
[24]黃強,曾慶凱.基于信息流策略的污點傳播分析及動態驗證[J].軟件學報,2011,22(9):2036-2048.HUANG Qiang,ZENG Qing-kai.Taint propagation analysis and dynamic verification with information flow policy [J].Journal of Software,2011,22(9):2036-2048.
[25]WHALEY J,LAM M.Cloning-based context-sensitive pointer alias analysis using binary decision diagrams[C]∥Proceedings of ACM Conference on Programming Language Design and Implementation.New York:ACM,2004.