李潔 俞研 吳家順
摘要:針對Web客戶端中基于文檔對象模型的跨站腳本攻擊(DOM XSS)漏洞檢測問題,提出一種基于動態(tài)污點分析的DOM XSS漏洞檢測算法。通過構造DOM模型和修改Firefox SpiderMonkey腳本引擎,利用動態(tài)的、基于bytecode的污點分析方法實現(xiàn)了DOM XSS漏洞的檢測。對DOM對象類屬性的擴展和SpiderMonkey字符串編碼格式的修改可以完成污點數(shù)據(jù)標記;遍歷JavaScript指令代碼bytecode的執(zhí)行路徑,獲得污點傳播路徑,實現(xiàn)污點數(shù)據(jù)集的生成;監(jiān)控所有可能會觸發(fā)DOM XSS攻擊的輸出點,實現(xiàn)DOM XSS漏洞的判定。在此基礎上,利用爬蟲程序設計并實現(xiàn)了一個互聯(lián)網(wǎng)DOM XSS漏洞檢測系統(tǒng)。實驗結果表明,所提算法能有效檢測網(wǎng)頁存在的DOM XSS漏洞,其檢測率可達92%。
關鍵詞:動態(tài)污點分析;注入點;輸出點;執(zhí)行路徑
中圖分類號:TP393.08 文獻標志碼:A
Abstract: Concerning DOM XSS (Document Object Model (DOM)based Cross Site Scripting (XSS)) vulnerability detection in Web client, a detection algorithm for DOM XSS vulnerability based on dynamic taint analysis was proposed. By constructing DOM model and modifying Firefox SpiderMonkey script engine, a dynamic taint analysis method based on the bytecode was used to detect DOM XSS vulnerabilities. First, taint data was marked by extending the attribute of the DOM object class and modifying the string encoding format of SpiderMonkey. Then, the execution route of the bytecode was traversed to generate the tainted data set. After that, all the output points which might trigger DOM XSS attacks were monitored to determine whether the application contained the DOM XSS vulnerabilities. In the experiment, a DOM XSS vulnerability detection system containing a crawler was designed and implemented. The experimental results show that the proposed algorithm can effectively detect the DOM XSS vulnerabilities, and the detection rate is about 92%.
Key words:dynamic taint analysis; source; sink; execution route
0 引言
隨著網(wǎng)絡技術的快速發(fā)展以及互聯(lián)網(wǎng)的廣泛應用,Web服務也在不斷地更新與發(fā)展。然而,與Web應用相伴的是Web安全問題,早期Web安全主要體現(xiàn)在服務端動態(tài)腳本與Web服務器安全方面,而Web攻擊技術的不斷演進,使得Web客戶端逐漸成為攻擊的熱點,針對Web客戶端的攻擊主要有跨站腳本攻擊(Cross Site Scripting, XSS)、跨站請求偽造(CrossSite Request Forgery, CSRF)和界面操作劫持等。
在眾多針對Web客戶端的攻擊中,XSS攻擊是最為嚴重也最容易被忽略的安全威脅。在各種Web安全漏洞中,XSS長期占據(jù)著開放式Web應用程序安全項目(Open Web Application Security Project, OWASP)列出的安全漏洞列表的前列[1]。XSS漏洞通常是由于Web應用程序對于用戶的輸入過濾不足而產(chǎn)生的[2-3],其最大特點是攻擊者利用網(wǎng)站漏洞將惡意腳本代碼,例如超文本標記語言(Hypertext Markup Language, HTML)和客戶端JavaScript等,注入用戶瀏覽的網(wǎng)頁上,從而實現(xiàn)隱私信息竊取、會話劫持等攻擊目的。與此同時,伴隨著客戶端JavaScript功能的日益復雜和強大,也使得XSS漏洞問題日益嚴重。
傳統(tǒng)意義上的XSS,例如反射型XSS和存儲型XSS,通常是攻擊者向服務器發(fā)送JavaScript代碼等惡意數(shù)據(jù),在服務器返回該惡意數(shù)據(jù)后由客戶端瀏覽器在本地執(zhí)行JavaScript惡意腳本。然而,基于文檔對象模型(Document Object Model, DOM)的XSS漏洞[4](DOM XSS)則是專門針對Web客戶端進行攻擊的主要XSS漏洞之一,它不依賴于客戶端向服務器發(fā)送惡意數(shù)據(jù)即可在客戶端本地執(zhí)行。DOM XSS與反射型XSS相似,通常誘使用戶訪問精心構造的統(tǒng)一資源定位符(Uniform Resource Locator, URL)來執(zhí)行腳本,但二者之間的差異在于DOM XSS的URL不會被發(fā)送至服務器,而是在用戶瀏覽器本地執(zhí)行,因而威脅更大,也更難以防御。
由于DOM XSS攻擊直接在客戶端執(zhí)行而不經(jīng)過服務器端,因而無法直接應用傳統(tǒng)的XSS漏洞檢測技術來檢測XSS漏洞。Klein[4]在發(fā)現(xiàn)并分析DOM XSS形成原因的基礎上,提出應檢查有可能被攻擊者影響或使用的對于DOM對象的引用,來防止DOM XSS攻擊,但文中并未給出對DOM對象引用的分析方法。FLAX[5]針對字節(jié)碼bytecode進行動態(tài)污點分析,來表示JavaScript腳本中不安全的數(shù)據(jù)流,然而FLAX采用基于程序切片的靜態(tài)分析技術,將程序切片翻譯為JavaScript腳本的簡化版本JASIL(JavaScript Simplified Instruction Language),而未真正將動態(tài)污點分析應用于JavaScript引擎。DexterJS[6]采用插裝技術執(zhí)行字符精度的動態(tài)污點追蹤,然而,DexterJS并未在bytecode層面實現(xiàn)數(shù)據(jù)流追蹤,而僅是在源代碼層面追蹤對原始污點數(shù)據(jù)的操作可能導致的污點字符串的輸出,因而具有很大的局限性。賈文超等[7]采用正則表達式匹配程序的輸入點和輸出點,通過混合驅動爬蟲檢測,雖然其基于污點傳播模型,但并沒有實現(xiàn)污點數(shù)據(jù)的追蹤過程,并未真正地應用動態(tài)污點分析技術,而且該方法需要對每個輸出點進行檢測,檢測時間增加,因而具有局限性。
本文在對DOM XSS漏洞原理和動態(tài)污點追蹤技術研究的基礎上,提出了一種基于動態(tài)污點分析的DOM XSS漏洞檢測方法,通過對Firefox SpiderMonkey瀏覽器引擎進行修改,實現(xiàn)了動態(tài)的、基于bytecode的污點追蹤方法,該方法直接修改SpiderMonkey引擎中底層字符串類型的表示方法和DOM對象類的特征屬性,完成污點分析過程中對JavaScript腳本語言特性和DOM API的完全覆蓋。
1 問題描述
與反射型XSS和存儲型XSS等傳統(tǒng)的XSS攻擊依賴于從服務器返回瀏覽器的惡意載荷實施攻擊的方式不同[8-9],DOM XSS是一種基于DOM文檔對象模型的漏洞,并不依賴于服務器返回的惡意數(shù)據(jù),僅受客戶端瀏覽器的腳本所影響,其產(chǎn)生的原因是HTML頁面以不安全的方式使用了document等攻擊者可以操縱的對象來操作數(shù)據(jù)。
客戶端瀏覽器的JavaScript腳本可以訪問瀏覽器的DOM,通過DOM動態(tài)檢查和修改頁面內(nèi)容,且可以不依賴于服務器端數(shù)據(jù),從客戶端瀏覽器獲得DOM中的數(shù)據(jù),例如可以從URL中提取數(shù)據(jù)等,并在本地執(zhí)行。另一方面,客戶端瀏覽器的JavaScript腳本可以操縱DOM中的對象,若用戶在客戶端輸入的數(shù)據(jù)包含了惡意JavaScript腳本,而這些腳本未經(jīng)過適當?shù)倪^濾,則應用程序可能遭受DOM XSS攻擊。
此時,客戶端瀏覽器將HTML文本解析為DOM,而上述URL屬性值的一部分會被寫入HTML文本中產(chǎn)生DOM XSS。由于URL中#之后的字符串不會被當作瀏覽器的查詢字符串發(fā)送至服務器,因而作為代碼片段在客戶端瀏覽器本地解釋和執(zhí)行。
由上例可見,DOM XSS的請求不會被發(fā)送至服務器,而是在客戶端瀏覽器本地執(zhí)行,因而更難以防御,威脅更大。針對DOM XSS存在的上述問題,本文提出一種基于動態(tài)污點分析的DOM XSS漏洞檢測方法,通過跟蹤document.referrer等JavaScript腳本能夠操縱的屬性,查看其獲得的數(shù)據(jù)是否會在document.write等能夠使字符串在頁面上輸出的方法或函數(shù)中執(zhí)行,從而確定是否會造成DOM XSS攻擊。
2 DOM XSS漏洞檢測算法研究
2.1 基本思想
DOM XSS漏洞的產(chǎn)生是因為攻擊者可以輸入不可信的數(shù)據(jù),而在客戶端瀏覽器與用戶交互時,JavaScript腳本能夠對DOM進行操縱從而獲得敏感的本地數(shù)據(jù),并將敏感數(shù)據(jù)泄露出去。由于DOM XSS漏洞是由于客戶端代碼的非正確執(zhí)行而導致的,且客戶端代碼呈現(xiàn)出多種多樣且動態(tài)的特點,因而,采用一般的掃描技術或者黑盒測試方法[11]無法檢測DOM XSS漏洞。
動態(tài)污點分析(Dynamic Taint Analysis, DTA)[12]能夠在運行時對軟件中的不可信數(shù)據(jù)進行信息流追蹤,從而發(fā)現(xiàn)漏洞或惡意行為。動態(tài)污點分析通常包括污點標記、污點傳播和污點檢測三個過程,在執(zhí)行動態(tài)污點分析時,首先將來自污點源(source)的數(shù)據(jù)標識為污點數(shù)據(jù),然后跟蹤污點數(shù)據(jù)可能發(fā)生的操作和運算過程,并記錄污點數(shù)據(jù)的傳播路徑。當污點數(shù)據(jù)傳播到敏感操作點(sink)時,則按相應的策略觸發(fā)操作。
由于動態(tài)污點分析技術能夠有效追蹤敏感數(shù)據(jù)的傳播路徑,因而可以將其應用于DOM XSS漏洞檢測。本文方法的基本思想是:首先標記可以觸發(fā)DOM XSS漏洞的屬性,例如document.referrer、window.name、location等JavaScript腳本可以操縱的屬性,將其標記為污點數(shù)據(jù)源;然后利用污點傳播方法跟蹤標記數(shù)據(jù)的傳播路徑,即標記數(shù)據(jù)傳遞時所經(jīng)過的方法,例如substr()、concat()等,以標記發(fā)生轉換后的污點數(shù)據(jù);最后,檢查產(chǎn)生字符串輸出的方法,例如eval()、document.write()等,以確定其中是否包含了標記的污點數(shù)據(jù),從而可以確定是否發(fā)生了敏感信息的泄露。另外,本文還設計并生成了測試用例集合,對提出的漏洞檢測算法進行了實驗驗證,以確定算法的有效性。
基于動態(tài)污點分析的DOM XSS漏洞檢測算法中敏感數(shù)據(jù)的污點標記、傳播以及檢測過程的示意圖如圖1所示。
圖1中,首先將可能觸發(fā)DOM XSS漏洞的方法作為外部數(shù)據(jù)的可能注入點,并對該方法的輸入變量1,2,…,n進行污點標記,構造污點源;對JavaScript腳本引擎進行修改,使得在腳本執(zhí)行過程中能夠分析指令與函數(shù)對污點變量的操作,追蹤污點傳播過程,例如污點變量1在執(zhí)行過程中,由于指令或函數(shù)的操作,將其污點傳播至變量a和變量b,從而使得與污點源1相關的污點數(shù)據(jù)集變?yōu)閧1,a,b};最后,檢測輸出點函數(shù)或方法是否對污點數(shù)據(jù)集中的數(shù)據(jù)進行了執(zhí)行操作,若是則判定存在DOM XSS漏洞。
2.2 算法描述
基于動態(tài)污點分析的DOM XSS漏洞檢測算法通過構造DOM模型和修改SpiderMonkey引擎,實現(xiàn)了對DOM漏洞的檢測。具體的檢測算法如下所示。
2.3 算法實現(xiàn)
本文算法利用了爬蟲程序Heritrix來搜集頁面,并為搜集到的頁面URL構造DOM XSS攻擊載荷payload。同時,為了模擬瀏覽器DOM模型,構造了DOM模塊,以模擬document和window等可能的DOM XSS攻擊對象,并實現(xiàn)污點標記功能。另外,為了實現(xiàn)污點傳播,對Firefox SpiderMonkey腳本引擎進行了修改。
2.3.1 污點標記
為了實現(xiàn)動態(tài)污點追蹤,要獲取污點源并實現(xiàn)污點源的標記。本文首先對有可能觸發(fā)DOM XSS漏洞的DOM對象進行分析,確定了window.location.href、location.href、location.pathname、location.search、location.protocol、location.hostname和document.referrer等14個可以操縱數(shù)據(jù)的注入點方法,然后修改瀏覽器對象所對應類的屬性,在其中增加污點屬性taint,以標記該對象所獲得的變量是否為污點變量。
對于SpiderMonkey腳本引擎的字符串表示方法進行修改,將其中的字符串編碼格式由4位擴展至5位,并使用擴展位作為污點標記位。
通過對于DOM類屬性和SpiderMonkey字符串編碼格式的修改,算法可以實現(xiàn)對于注入點數(shù)據(jù)的污點標記。
2.3.2 污點傳播
JavaScript腳本在執(zhí)行過程中,污點數(shù)據(jù)受到數(shù)據(jù)操作和控制結構的影響,會產(chǎn)生新的污點數(shù)據(jù),新污點數(shù)據(jù)與源污點數(shù)據(jù)存在依賴關系,稱為源污點數(shù)據(jù)的依賴污點數(shù)據(jù)。同樣,依賴污點數(shù)據(jù)在執(zhí)行過程中也會產(chǎn)生新的污點數(shù)據(jù),因而在程序執(zhí)行過程中需要遞歸處理依賴污點數(shù)據(jù)以產(chǎn)生污點數(shù)據(jù)集。為了存儲污點數(shù)據(jù)集以及源污點數(shù)據(jù)和依賴污點數(shù)據(jù)之間、依賴污點數(shù)據(jù)之間的傳遞依賴關系,本文算法定義了用于保存污點數(shù)據(jù)集的結構體TaintEntry,如下所示:
TaintEntry中,TaintDep鏈表存儲了獲得污點數(shù)據(jù)的DOM對象以及從源污點數(shù)據(jù)開始污點傳播過程中所影響的污點數(shù)據(jù)集,而TaintEntry結構體則存儲了污點數(shù)據(jù)相關信息,包括源污點數(shù)據(jù)、產(chǎn)生依賴污點數(shù)據(jù)的操作以及依賴關系污點數(shù)據(jù)信息。
另外,為了實現(xiàn)污點傳播過程中污點數(shù)據(jù)的記錄,算法對JavaScript腳本引擎的字符串操作方法進行了修改。在操作方法中對所獲得的字符串進行污點判斷,若該字符串為污點字符串,則其返回的結果字符串也保存為污點字符串;為了實現(xiàn)程序控制結構中污點數(shù)據(jù)的傳播,對bytecode指令的執(zhí)行過程進行了修改,以獲得bytecode的執(zhí)行路徑,若控制結構中有數(shù)據(jù)是污點數(shù)據(jù),則其執(zhí)行路徑中的其他數(shù)據(jù)也將變?yōu)槲埸c數(shù)據(jù)。
2.3.3 污點檢測
DOM XSS的基本檢測方法是檢測注入腳本能否在sink點執(zhí)行。因此,算法監(jiān)控sink點,添加analyse()方法,首先,判定sink點方法中獲得的實參是否是污點數(shù)據(jù),若是,則從污點數(shù)據(jù)集中獲得該污點數(shù)據(jù)的依賴關系,通過逆向遍歷污點數(shù)據(jù)集,獲得該污點數(shù)據(jù)的源污點數(shù)據(jù)來源,若其源污點數(shù)據(jù)來自標記對象產(chǎn)生的污點數(shù)據(jù),并且該污點數(shù)據(jù)存在執(zhí)行路徑。則在分析方法將測試結果輸出。
2.4 測試用例生成
為了測試提出的DOM XSS漏洞檢測算法的有效性,本文對DOM XSS漏洞利用點的上下文進行了分析,并根據(jù)以下規(guī)則設計DOM XSS攻擊載荷以生成測試用例:
Usecase ::= URL‖截斷序列‖有效載荷‖轉義序列
其中:URL表示待測網(wǎng)站的URL地址,攻擊者可以對URL進行修改以實施DOM XSS攻擊;截斷序列通常用于閉合頁面漏洞利用點中未結束的標簽;有效載荷標識攻擊者用于實施攻擊的代碼片段;而轉義序列通常為截斷序列的反序列,其目的是能夠使得經(jīng)過修改的漏洞利用點能夠在當前上下文中正常執(zhí)行。
本文根據(jù)上述提出的測試用例生成規(guī)則,生成針對不同注入點的攻擊載荷集,并結合fuzzing測試方法[13],生成一些特殊的載荷,組成攻擊載荷集合,依次將攻擊載荷集合中的載荷注入到待檢驗的URL中,完成攻擊過程的模擬。
3 實驗結果分析
為了測試算法的檢測率和檢測性能,本文收集了XSSed、Wooyun等漏洞公布平臺上發(fā)布的DOM XSS漏洞,搭建執(zhí)行環(huán)境,構造了一個本地樣本集,其中包含DOM XSS漏洞的網(wǎng)頁分為兩類:1)未對用戶輸入進行過濾的網(wǎng)站,樣本數(shù)為106;2)雖然含有過濾方法,但過濾不完全,導致漏洞的產(chǎn)生,樣本數(shù)為64。評價指標為檢測到的樣本數(shù)、檢測率、平均樣本檢測時間。實驗中將本文算法與應用較為廣泛的DOM XSS檢測工具DOMinator[14]進行了比較分析,比較實驗結果如表1所示。
由實驗結果分析可知:在檢測未過濾樣本時,本文算法的檢測率略低于DOMinator。經(jīng)過對未檢測到頁面的分析發(fā)現(xiàn),本文算法實現(xiàn)中輸出點集合不夠完善,部分輸出點函數(shù)未包含在內(nèi),導致漏報,可以在后續(xù)工作中改進輸出點集合。在檢測過濾樣本時,本文算法和DOMinator的檢測率基本持平,然而,本文算法的平均檢測時間明顯少于DOMinator,這是因為本文系統(tǒng)實現(xiàn)了自動化測試功能,檢測效率明顯提升。
為了評價算法的實際可用性,本文對真實的網(wǎng)頁進行了測試驗證。實驗中,首先利用爬蟲程序Heritrix搜集頁面,共計27411個頁面,并依次對其進行檢測,檢測結果如下:檢測到可疑樣本數(shù)為123,實際漏洞樣本數(shù)為114,誤報率為7.89%。因無法對所有真實樣本進行手工分析,因而對于真實樣本實驗采用誤報率來檢驗算法的可行性。經(jīng)分析,產(chǎn)生誤報率的原因是算法在生成和使用測試用例時匹配規(guī)則過于嚴格,也由于部分網(wǎng)站使用安全策略過濾,導致有些書寫不完善的語句也被算法誤報為DOM XSS漏洞。
4 結語
本文分析了DOM XSS漏洞的特點,提出了一種基于動態(tài)污點分析的DOM XSS檢測算法。為了實現(xiàn)動態(tài)污點傳播,對Firefox SpiderMonkey引擎進行修改,實現(xiàn)了動態(tài)的、基于bytecode的污點追蹤。實驗結果表明,本文算法具有較好的有效性與可行性。為了進一步提高算法的檢測率并降低誤報率,后續(xù)工作將利用fuzzing測試技術進一步完善污點數(shù)據(jù)集,實現(xiàn)DOM XSS漏洞的自動化檢測。
參考文獻:
[1]OWASP. CrossSite Scripting (XSS) [EB/OL]. [2014-04-22]. https://www.owasp.org/index.php/XSS.
[2]PIETRASZEK T,BERGHE C. Defending against injection attacks through contextsensitive string evaluation[C]// Proceedings of the 8th International Conference on Recent Advances in Intrusion Detection. Berlin: SpringerVerlag, 2006, 3858:124-145.
[3]VIKRAM K, PRATEEK A, LIVSHITS B. Ripley: automatically securing distributed Web applications through replicated execution[C]// Proceedings of the 16th ACM Conference on Computer and Communications Security. New York: ACM, 2009: 173-186.
[4]KLEIN A. Dom based cross site scripting or XSS of the third kind [EB/OL]. [2005-07-04]. http://www.webappsec.org/projects/articles/071105.html.
[5]SAXENA P, HANNA S, POOSANKAM P, SONG D. FLAX: systematic discovery of clientside validation vulnerabilities in rich Web applications[EB/OL].[2015-06-20].http://www.internetsociety.org/doc/flaxsystematicdiscoveryclientsidevalidationvulnerabilitiesrichwebapplications.
[6]LEKIES S, STOCK B, JOHNS M. 25 million flows laterlargescale detection of DOMbased XSS [C]// Proceedings of the 20th ACM Conference on Computer and Communications. New York: ACM, 2013: 1193-1204.
[7]賈文超, 汪永益, 施凡,等. 基于動態(tài)污點傳播模型的DOM XSS漏洞檢測[J]. 計算機應用研究, 2014, 31(7):2119-2122.(JIA W C,WANG Y Y, SHI F, et al. Detecting DOM based XSS vulnerability based on dynamic taint propagation model[J]. Application Research of Computers, 2014, 31(7): 2119-2122.)
[8]李沁蕾,王蕊,賈曉啟.OSN中基于分類器和改進ngram模型的跨站腳本檢測方法[J].計算機應用,2014,34(6):1661-1665. (LI Q L,WANG R,JIA X Q.Crosssite scripting detection in online social network based on classifiers and improved ngram model[J].Journal of Computer Applications,2014,34(6):1661-1665.)
[9]WEINBERGER J, SAXENA P, AKHAWE D, et al. A systematic analysis of XSS sanitization in Web application frameworks[C]// Proceedings of the 16th European Conference on Research in Computer Security. Berlin: SpringerVerlag, 2011:150-171.
[10]邱永華. XSS跨站腳本攻擊剖析與防御[M].北京:人民郵電出版社, 2013:120-126. (QIU Y H. XSS Attack and Defense Analysis[M]. Beijing: Posts & Telecom Press, 2013:120-126.)
[11]朱貫淼,曾凡平,袁園,等.基于污點跟蹤的黑盒fuzzing測試[J].小型微型計算機系統(tǒng),2012,33(8):1736-1739.(ZHU G M,ZENG F P,YUAN Y, et al. Blackbox fuzzing testing based on taint check[J].Journal of Chinese Computer Systems,2012, 33(8):1736-1739.)
[12]吳世忠, 郭濤, 董國偉, 等. 軟件漏洞分析技術進展[J].清華大學學報(自然科學版), 2012, 52(10):1309-1319. (WU S Z, GUO T, DONG G W, et al. Software vulnerability analyses: a road map [J]. Journal of Tsinghua University (Science & Technology), 2012, 52(10):1309-1319.)
[13]VIJAY G, TIM L, MARTIN R. Taintbased directed whitebox fuzzing[C]// Proceedings of the 31st International Conference on Software Engineering. Washington, DC: IEEE Computer Society, 2009:474-484.
[14]DOMINATOR. A full featured DOM XSS security suite[EB/OL].[2012-11-13].https://dominator.mindedsecurity.com.