鮑澤民,王根英,李 娟
(1.北京交通大學(xué) 通信與信息系統(tǒng)北京市重點(diǎn)實(shí)驗(yàn)室,北京 100044;2.中國(guó)信息安全測(cè)評(píng)中心,北京 100085)
跨站腳本攻擊客戶端防御技術(shù)研究
鮑澤民1,王根英1,李 娟2
(1.北京交通大學(xué) 通信與信息系統(tǒng)北京市重點(diǎn)實(shí)驗(yàn)室,北京 100044;2.中國(guó)信息安全測(cè)評(píng)中心,北京 100085)
跨站腳本攻擊是當(dāng)今Web應(yīng)用領(lǐng)域危害最嚴(yán)重、最常見(jiàn)的威脅之一,本文設(shè)計(jì)了全新的跨站攻擊防御方法,該方法以動(dòng)態(tài)污點(diǎn)追蹤為主,輔以靜態(tài)污點(diǎn)分析,可有效阻止客戶端敏感信息的泄露,實(shí)現(xiàn)了對(duì)跨站攻擊的有效攔截。并通過(guò)對(duì)Javascript引擎Spidermonkey的擴(kuò)展,在開源的Firefox上實(shí)現(xiàn)了基于該方法的插件xssCleaner,驗(yàn)證了防御方法的有效性。
跨站腳本攻擊;瀏覽器安全;動(dòng)態(tài)污點(diǎn)追蹤;靜態(tài)分析
跨站腳本攻擊是一種針對(duì)Web客戶端的重量級(jí)攻擊。XSS漏洞廣泛存在于PHP、Java、.NET等語(yǔ)言編寫的、未嚴(yán)格過(guò)濾用戶輸入的Web應(yīng)用程序中[1]。攻擊者利用該服務(wù)器端漏洞,在客戶端瀏覽器從服務(wù)器端得到的HTML響應(yīng)頁(yè)面中“注入”惡意Javascript腳本。惡意腳本在客戶端瀏覽器執(zhí)行,避開同源策略限制,實(shí)施惡意操作??缯灸_本攻擊根源于Web應(yīng)用安全機(jī)制的薄弱環(huán)節(jié):對(duì)用戶輸入缺乏足夠的過(guò)濾處理。雖然在服務(wù)器端修復(fù)Web應(yīng)用中的跨站漏洞可以根本性解決該問(wèn)題,由于安全補(bǔ)丁的更新速度慢,系統(tǒng)運(yùn)維人員的安全意識(shí)薄弱等各種原因,仍有很多Web應(yīng)用不能及時(shí)修復(fù)漏洞,導(dǎo)致用戶在使用這些應(yīng)用時(shí)處于遭受跨站攻擊的風(fēng)險(xiǎn)下。為了提高用戶面對(duì)跨站腳本攻擊的主動(dòng)防御能力,研究客戶端的跨站攻擊防御措施顯得很有必要。
自2000年開始著手研究跨站攻擊的防御機(jī)制,安全專家們已經(jīng)提出多種不同的客戶端防御機(jī)制。文獻(xiàn)[2]提出的客戶端惡意腳本檢測(cè)系統(tǒng)由一個(gè)處理審計(jì)日志的入侵檢測(cè)系統(tǒng)和一個(gè)瀏覽器內(nèi)嵌的腳本審計(jì)器構(gòu)成,通過(guò)對(duì)比審計(jì)日志和已知惡意腳本行為來(lái)發(fā)現(xiàn)攻擊,并阻止惡意腳本執(zhí)行。該系統(tǒng)不僅可以檢測(cè)跨站攻擊,同時(shí)可以發(fā)現(xiàn)其他攻擊。不足之處是,該系統(tǒng)不能防御未知行為特征的新型攻擊。文獻(xiàn)[3]可以不受必須已知攻擊行為特征的限制,通過(guò)在客戶端部署個(gè)人Web防火墻,依據(jù)訪問(wèn)規(guī)則對(duì)惡意的URL進(jìn)行阻止。合理訪問(wèn)規(guī)則的設(shè)置對(duì)用戶要求較高,而且發(fā)現(xiàn)攻擊后需要用戶干預(yù)方可解決。
本文提出的跨站腳本防御方法是一種新型的純客戶端的XSS防御方法,可以在客戶端形成一道應(yīng)對(duì)跨站攻擊的有效屏障,增強(qiáng)了客戶端的主動(dòng)防御能力。它以動(dòng)態(tài)污點(diǎn)追蹤為主,輔以靜態(tài)污點(diǎn)追蹤,綜合了動(dòng)態(tài)標(biāo)記的高效性和靜態(tài)分析的精確性的特點(diǎn)。防御方法整體框架如圖1所示。
圖1 防御方法整體框架
Javascript代碼的一般處理流程:源代碼通過(guò)詞法、語(yǔ)法分析生成抽象語(yǔ)法樹(AST,abstract syntax tree),抽象語(yǔ)法樹再編譯為字節(jié)碼,字節(jié)碼隨后交由解釋器翻譯執(zhí)行。本文的防御方法會(huì)對(duì)客戶端Javascript引擎進(jìn)行擴(kuò)展后,語(yǔ)法分析階段,會(huì)添加對(duì)敏感信息源(即源污點(diǎn))的污點(diǎn)標(biāo)記,通過(guò)基于信息流的污點(diǎn)傳播分析,實(shí)時(shí)追蹤、監(jiān)測(cè)污點(diǎn)的傳播。必要時(shí)在抽象語(yǔ)法樹階段調(diào)用靜態(tài)污點(diǎn)分析,本文引入約束分析方法用于靜態(tài)分析。
2.1 動(dòng)態(tài)追蹤
為了追蹤監(jiān)測(cè)Javascript程序?qū)γ舾行畔⒌氖褂?,需要擴(kuò)展Javascript引擎的功能,具體表現(xiàn)在擴(kuò)展字節(jié)碼指令的語(yǔ)義,污點(diǎn)信息可以有效擴(kuò)散。Javascript字節(jié)碼指令可分為4種操作:賦值操作、算數(shù)和邏輯操作(+,-)、控制和循環(huán)語(yǔ)句(if,while,switch)、函數(shù)調(diào)用和eval。當(dāng)一條指令被執(zhí)行時(shí),它的操作數(shù)可能是污點(diǎn)數(shù)據(jù)。因而需要定義規(guī)則,規(guī)定針對(duì)不同的操作指令,其指令結(jié)果是否應(yīng)被標(biāo)記為污點(diǎn)數(shù)據(jù),確保污點(diǎn)數(shù)據(jù)的有效傳遞與擴(kuò)散。
以賦值操作為例。賦值操作就是把一個(gè)常量或表達(dá)式的值賦給一個(gè)左值(等號(hào)左邊的數(shù)值,左值為變量)。如果該常量或表達(dá)式的值(即右值)已被標(biāo)記為污點(diǎn)數(shù)據(jù),則左值在賦值操作結(jié)束后也會(huì)被標(biāo)記為污點(diǎn)數(shù)據(jù)。Javascript引擎對(duì)單個(gè)變量、函數(shù)變量、數(shù)據(jù)、數(shù)組元素和對(duì)象屬性的賦值分別分配了不同指令。需要注意的是,個(gè)別情況下,當(dāng)污點(diǎn)數(shù)據(jù)賦值給一個(gè)變量后,除了該變量需要被污點(diǎn)標(biāo)記,該變量的其它相關(guān)屬性也需做污點(diǎn)標(biāo)記。比如,為了確保對(duì)數(shù)組整體上的操作的函數(shù)或方法(如arr. length)的返回值為污點(diǎn)數(shù)據(jù),必須規(guī)定當(dāng)一個(gè)數(shù)組array中的一個(gè)元素被標(biāo)記為污點(diǎn)數(shù)據(jù)后,整個(gè)數(shù)組的元素都應(yīng)被標(biāo)記為污點(diǎn)數(shù)據(jù)。通過(guò)圖2的例子可以說(shuō)明該規(guī)則的必要性。
圖2 數(shù)組元素賦值
如圖2,在第1行,一個(gè)初始長(zhǎng)度為0的數(shù)組被建立;當(dāng)cookie的第一個(gè)字符為字符“a”時(shí),數(shù)組的第一個(gè)元素會(huì)被賦值為數(shù)值“1”;第5行,當(dāng)數(shù)組的長(zhǎng)度arr.length為“1”時(shí),變量y會(huì)賦值為“a”。同樣的方法測(cè)試所有可能的字符(eg,“a”~“z”,“A”~“Z”,“0”~“9”),攻擊者可將cookie的首字符賦值給一個(gè)新的變量。如果在第3行的賦值操作后,僅僅對(duì)數(shù)組的第一個(gè)元素進(jìn)行污點(diǎn)標(biāo)記,則第5行的新變量便會(huì)避開污點(diǎn)追蹤,從而在用戶不知情的情況下泄露cookie信息。采用本節(jié)提出的規(guī)則,不僅數(shù)組的第一個(gè)元素被標(biāo)記為污點(diǎn)數(shù)據(jù),數(shù)組的屬性(包括arr.length)也會(huì)被污點(diǎn)標(biāo)記。第5行的變量“y”會(huì)在賦值后標(biāo)記為污點(diǎn)數(shù)據(jù),因而敏感信息可被追蹤。
2.2 靜態(tài)分析
動(dòng)態(tài)污點(diǎn)追蹤可以有效監(jiān)測(cè)數(shù)據(jù)依賴關(guān)系和直接控制依賴關(guān)系,從而高效地追蹤敏感信息流。但是動(dòng)態(tài)污點(diǎn)追蹤技術(shù)并不能處理所有的控制依賴關(guān)系[4]。作為動(dòng)態(tài)追蹤的補(bǔ)充,靜態(tài)分析可以解決這個(gè)問(wèn)題。當(dāng)動(dòng)態(tài)追蹤不能有效監(jiān)測(cè),信息流有泄露敏感信息的風(fēng)險(xiǎn)時(shí),靜態(tài)分析方法被調(diào)用。動(dòng)態(tài)污點(diǎn)追蹤具有高效的特點(diǎn),但是無(wú)法監(jiān)測(cè)所有類型的控制依賴關(guān)系;靜態(tài)分析使防御更加完善、可靠,然而會(huì)帶來(lái)更多的資源消耗。二者的綜合利用充分發(fā)揮各自的優(yōu)勢(shì),使用戶遠(yuǎn)離跨站腳本攻擊的侵?jǐn)_。本文應(yīng)用了約束分析方法[5],在信息流模型(Information flow model)基礎(chǔ)上,設(shè)計(jì)實(shí)現(xiàn)了Javascript腳本的約束系統(tǒng),通過(guò)約束分析,實(shí)現(xiàn)污點(diǎn)擴(kuò)散。約束分析方法包含約束系統(tǒng)建立和約束系統(tǒng)求解兩個(gè)步驟。
2.2.1 約束分析系統(tǒng)建立
本文的約束分析系統(tǒng)是建立在信息流模型基礎(chǔ)上的。信息流模型[6]中,數(shù)據(jù)被保存在相互獨(dú)立的、按照安全級(jí)別定義的分隔區(qū)間上。Bell-Lapadula模型是用于提供機(jī)密性的信息流模型,關(guān)心不同安全級(jí)別間的數(shù)據(jù)流動(dòng)問(wèn)題。借鑒Bell-Lapadula和Biba經(jīng)典的安全模型[7],本文建立如下污點(diǎn)規(guī)則:
機(jī)密性F-NR:污點(diǎn)信息不被泄露(x,?);
完整性F-NW:污點(diǎn)信息不能被篡改(?,x);
需要說(shuō)明的是,(x,y)表示x的值流向y, y=x。(x,?)就是說(shuō)任何非可信數(shù)據(jù)都不能讀取x。本文中非可信數(shù)據(jù)部分指的是從不同源的域中加載的腳本。
建立約束分析系統(tǒng)的具體過(guò)程是在Javascript的抽象語(yǔ)法樹階段,根據(jù)約束分析規(guī)則遍歷抽象語(yǔ)法樹上的每一個(gè)語(yǔ)法元素。Javascript的語(yǔ)法元素分為語(yǔ)句和表達(dá)式。多個(gè)表達(dá)式e可以組成一個(gè)語(yǔ)句s,設(shè)xe為表達(dá)式e的約束變量。
其中,k為當(dāng)前上下文對(duì)象的標(biāo)示符;e為當(dāng)前接受約束分析的表達(dá)式; xi表示當(dāng)前表達(dá)式e接收到的間接信息流。不同語(yǔ)法元素的具體約束分析規(guī)則不同,如控制語(yǔ)句的分析規(guī)則如下:
多個(gè)語(yǔ)句順序執(zhí)行時(shí),依次對(duì)每個(gè)語(yǔ)句進(jìn)行約束分析,如式2所示。條件控制語(yǔ)句、循環(huán)控制語(yǔ)句的約束分析規(guī)則分別是式(3)和式(4)。
2.2.2 約束求解
污點(diǎn)規(guī)則對(duì)其求解,以實(shí)現(xiàn)污點(diǎn)監(jiān)測(cè)。若污點(diǎn)信息x?F-NR,調(diào)用NR(x)可以從約束系統(tǒng)得到x的相關(guān)信息流x1→xn,且x1→xn上的信息節(jié)點(diǎn)均被標(biāo)記為污點(diǎn)信息,即 xi?F-NR(1≤i≤n ),同理,若x?F-NW,則求解的 xi?F-NW(1≤i≤n ),從而實(shí)現(xiàn)污點(diǎn)擴(kuò)散。
為測(cè)試本文提出的防御方法的有效性,本文依據(jù)新型的跨站腳本防御方法對(duì)開源的Spidermonkey進(jìn)行擴(kuò)展,完成了跨站腳本攻擊客戶端防御工具xssCleaner的開發(fā)。xssCleaner作為Firefox的插件,具有部署快速、跨平臺(tái)等特點(diǎn)。本文搭建了一個(gè)博客網(wǎng)站系統(tǒng)用于演示xssCleaner對(duì)跨站攻擊的有效防御。攻擊者在博客網(wǎng)站的登陸界面嵌入惡意腳本,惡意腳本在客戶端瀏覽器執(zhí)行后,會(huì)將用戶名及密碼等敏感信息發(fā)送給攻擊者。客戶端部署xssCleaner插件后,xssCleaner插件攔截該腳本的執(zhí)行,并向用戶發(fā)出跨站攻擊警告,如圖3所示。為方便用戶,同時(shí)提高效率,插件提供了黑白名單機(jī)制,白名單中的腳本將被定為可信任域,黑名單中的腳本將始終被禁止執(zhí)行。
圖3 xssCleaner對(duì)跨站腳本攔截
為了驗(yàn)證xssCleaner的檢測(cè)準(zhǔn)確率,收集了19種網(wǎng)上常見(jiàn)的跨站攻擊腳本,并搭建了存在跨站漏洞并且訪問(wèn)敏感信息的網(wǎng)站。為了驗(yàn)證誤報(bào)率,通過(guò)網(wǎng)上下載大量網(wǎng)頁(yè)測(cè)試,并對(duì)插件xssCleaner檢測(cè)結(jié)果進(jìn)行人工分析。針對(duì)這些網(wǎng)站的正確的檢測(cè)率和誤報(bào)率如表1所示。
表1 xssCleaner檢測(cè)率和誤報(bào)率
由上表可知,擴(kuò)展后的瀏覽器可以有效檢測(cè)出所有跨站攻擊,然而應(yīng)用中xssCleaner也會(huì)發(fā)出誤報(bào)。
本文提出了一種新型的跨站腳本防御方法,介紹該新型防御方法的框架,該方法以動(dòng)態(tài)污點(diǎn)追蹤為主,輔以靜態(tài)污點(diǎn)分析,兼顧了效率和精確性。分別闡述了動(dòng)態(tài)、靜態(tài)追蹤的詳細(xì)實(shí)現(xiàn)策略,二者實(shí)質(zhì)都是實(shí)現(xiàn)污點(diǎn)的有效擴(kuò)散,在靜態(tài)污點(diǎn)追蹤中應(yīng)用了約束分析算法。為驗(yàn)證方法的有效性,開發(fā)了基于該方法的Firefox插件xssCleaner,其核心是對(duì)Javascript引擎Spidermonkey的擴(kuò)展。經(jīng)驗(yàn)證,xssCleaner可有效防御跨站腳本攻擊。
[1]Seixas N, Fonseca J, Vieira M, et al. Looking at web security vulnerabilities from the programming language perspective: a field study[C]. Software Reliability Engineering, 2009. ISSRE'09. 20th International Symposium on. IEEE, 2009: 129-135.
[2]Hallaraker O, Vigna G. Detecting malicious javascript code in mozilla[C]. Engineering of Complex Computer Systems, 2005. ICECCS 2005. Proceedings. 10th IEEE International Conference on. IEEE, 2005: 85-94.
[3]Kirda E, Kruegel C, Vigna G, et al. Noxes: a client-side solution for mitigating cross-site scripting attacks[C]. Proceedings of the 2006 ACM symposium on Applied computing. ACM, 2006: 330-337.
[4]Denning D E. A lattice model of secure information flow[J]. Communications of the ACM, 1976, 19(5): 236-243.
[5]Kodumal J, Aiken A. Banshee: A scalable constraint-based analysis toolkit[M]. Static Analysis. Springer Berlin Heidelberg, 2005: 218-234.
[6]Huang Y W, Yu F, Hang C, et al. Securing web application code by static analysis and runtime protection[C]. Proceedings of the 13th international conference on World Wide Web. ACM, 2004: 40-52.
[7]Shon Harris. CISSP All-in-One Exam Guide, Fifth Edition[M]. McGraw-Hill Osborne Media, 2010.
責(zé)任編輯 徐侃春
Client-side defense techniques of cross-site scripting attack
BAO Zemin1, WANG Genying1, LI Juan2
( 1.Key Laboratory of Communication & Information System, Beijing Municipal Commission of Education, Beijing Jiaotong University, Beijing 100044, China; 2.China Information Technology Security Evaluation Center, Beijing 100085, China )
Cross-site scripting(XSS) attack was the most serious and common threat in Web applications today. This paper proposed a novel client-side approach, which combined the dynamic taint tracking with static analysis, to prevent XSS attacks. Based on this method, through extending Spidermonkey of Javascript, the plugin xssCleaner was implemented in open-source Firefox.
cross-site scripting attack; browser security; dynamic taint tracking; static analysis
U29∶TP39
A
1005-8451(2015)07-0017-04
2014-11-28
鮑澤民,在讀碩士研究生;王根英,副教授。