王 麗,錢文祥
(安徽理工大學(xué)計(jì)算機(jī)學(xué)院,安徽 淮南 232001)
微軟推出Internet Explorer 3 之時(shí)便同時(shí)開放了WebBrowser 給開發(fā)者使用,開發(fā)者可以在自己的程序中使用WebBrowser 控件以實(shí)現(xiàn)與瀏覽器類似的功能。
截至2014年,服役13年之久的Internet Explorer 6 由于安全性不足引發(fā)了人們的關(guān)注。微軟也多次勸告用戶升級至更高版本的瀏覽器。在版本6 之后的瀏覽器中,Internet Explorer 一直在增添新的安全功能。Internet Explorer 8 中,微軟加入了基于請求字串的XSS 檢測功能和對反點(diǎn)擊劫持的HTTP 頭的支持;之后,Internet Explorer 9、10、11 幾個(gè)版本加入了進(jìn)程層面的安全特性,例如加入硬件執(zhí)行保護(hù)、代碼地址隨機(jī)化、安全異常處理鏈以及瀏覽器的64 位化。但是瀏覽器作為腳本宿主,針對腳本攻擊卻沒有更多的安全提升。因此,為了用戶的數(shù)據(jù)安全,有必要為其定制安全功能。
由于網(wǎng)頁中代碼和數(shù)據(jù)的界限不明,導(dǎo)致了很多注入類的攻擊手段,針對腳本注入的跨站腳本請求攻擊(Cross Site Scripting,XSS,由于和層疊樣式表縮寫一樣,被改稱為XSS)。而瀏覽器自身的實(shí)現(xiàn),將導(dǎo)致表示層的攻擊,利用視覺欺騙的攻擊點(diǎn)擊劫持則是這類攻擊。而網(wǎng)站自身實(shí)現(xiàn)的不完善,則將導(dǎo)致其他針對網(wǎng)站的攻擊,例如瀏覽器中可以實(shí)現(xiàn)的跨域請求偽造(Cross Site Request Forgery,CSRF)。
而超文本標(biāo)記語言是一個(gè)語法寬松的語言,在HTML 標(biāo)簽的“屬性=值”對中,有很多字符會被瀏覽器丟棄,即使加入了也不影響執(zhí)行。Internet Explorer 支持的VBScript 和Javascript 中,存在更多的編碼方式。由于對腳本的支持,字符和函數(shù)還可以通過Javascript 的重載和庫函數(shù)、系統(tǒng)事件、對象強(qiáng)制轉(zhuǎn)換等方式獲得。
由于XSS 屬于腳本注入,而且由于瀏覽器支持信息的多樣化,攻擊者注入的腳本采用普通字符比對方式將難以檢測。因此,將采用正則表達(dá)式,在用戶發(fā)出請求時(shí)進(jìn)行動態(tài)檢測并修正。
程序?qū)⒃贗nternet Explorer 自帶的檢查之外再次做額外的檢查。主要檢測方式是針對請求字串在正文寫入的位置進(jìn)行判斷,對非文本節(jié)點(diǎn)通過Boost 庫的TR1 正則表達(dá)式引擎對請求內(nèi)容進(jìn)行正則匹配,實(shí)現(xiàn)掃描。通過導(dǎo)出mshtml.dll 中的字符串組,可以得到Internet Explorer 自帶的庫,對其自帶的庫進(jìn)行判斷分析之后,可以知道其無法防御的攻擊方法,接著,針對這些內(nèi)容完善補(bǔ)充正則表達(dá)式即可防御攻擊者的防御。
使用時(shí),如果用戶訪問的請求匹配到了正則表達(dá)式,那么提示用戶可以選擇過濾或是繼續(xù)訪問。如果用戶選擇過濾,程序?qū)討B(tài)刪除攻擊向量,達(dá)到動態(tài)清除攻擊向量的作用。新增的正則表達(dá)式如表1所示。
表1 新增的正則表達(dá)式
CSRF 屬于網(wǎng)站側(cè)的實(shí)現(xiàn)缺陷,因此,瀏覽器只能協(xié)助減少危害,而并不能保證消除所有危害。CSRF 攻擊主要依靠同源準(zhǔn)則來檢測,程序不僅會應(yīng)用較為嚴(yán)格的同源策略,還會對請求實(shí)體進(jìn)行XSS 檢查,使用的XSS 判斷方式如上節(jié)所述。之所以加上這類檢測是因?yàn)镮E 自帶的XSS 過濾器其實(shí)只會對GET 請求進(jìn)行檢查,而POST XSS 在某種程度上也是一個(gè)危害較大的攻擊方式,尤其是配合上CSRF,一樣可以達(dá)到同樣的危害。所以,如果瀏覽器的POST 請求中發(fā)現(xiàn)了XSS 攻擊代碼,瀏覽器將同樣會對POST 的實(shí)體部分進(jìn)行凈化,然后詢問用戶是將POST 轉(zhuǎn)換為GET 請求,還是將POST 丟棄。軟件的同源判斷邏輯如表2 所述。
表2 軟件的同源判斷邏輯
在瀏覽器中有一個(gè)特性,即如果樣式表中存在opacity 屬性,那么元素在瀏覽器中顯示的順序?qū)⒉粫僖云鋤-index 大小來判定,而是使用一個(gè)特殊的判斷邏輯:誰的opacity 大,誰顯示的時(shí)候排在前面。
但是,同一個(gè)位置的元素的事件接受函數(shù)將依然使用z-index 來判斷,如果一個(gè)位置上有多個(gè)元素,而這個(gè)位置上發(fā)生了某個(gè)事件,那么這個(gè)位置上的元素中誰的z-index 大,誰就會接收到這個(gè)事件。
因此,要實(shí)施點(diǎn)擊劫持攻擊,攻擊者最容易的是只通過iframe 框架的方式來加載被害網(wǎng)站,而且通常是設(shè)置iframe 全透明或者透明度非常大,以至于幾乎無法看見,通常是0%~1%的情況比較多。然后,在iframe 上方覆蓋一層虛假頁面,例如“點(diǎn)擊某處開始游戲”的頁面,而要求用戶點(diǎn)擊的地方實(shí)際上覆蓋在下方iframe 中一些敏感位置,例如微博的“關(guān)注”按鈕等位置。
因此,攻擊者攻擊時(shí),只需要指定下方iframe的樣式為高z-index 和低opacity,給自己偽造的內(nèi)容的樣式指定為低z-index 和高opacity,那么就可以創(chuàng)建一個(gè)點(diǎn)擊劫持頁面。
點(diǎn)擊劫持頁面的特性也正是檢測的突破口所在。通過遍歷元素的樣式表,找到存在opacity 屬性的iframe,并對其進(jìn)行邏輯檢查,從而以最小的報(bào)警次數(shù)獲得較為準(zhǔn)確的判定結(jié)果,發(fā)現(xiàn)攻擊后,程序?qū)h除元素的透明元素,從而將真實(shí)頁面內(nèi)容展現(xiàn)給用戶。
用系統(tǒng)函數(shù)可以得到較為精準(zhǔn)的時(shí)間量,測試中選用CPU 時(shí)間/CPU 時(shí)鐘頻率來獲取經(jīng)過時(shí)間。據(jù)此可以得出算法從開始處理數(shù)據(jù)到處理結(jié)束(不包括對話框彈出的等待時(shí)間)額外消耗的時(shí)間。試驗(yàn)3 次,取平均值,得出耗時(shí)數(shù)據(jù)如表3所示。
表3 基準(zhǔn)耗時(shí)測試結(jié)果
需要注意的是,頁面完全載入時(shí)間指頁面完全下載的時(shí)間,不包括DOM 樹渲染的時(shí)間。網(wǎng)絡(luò)時(shí)間采用IE 的開發(fā)人員工具。
安全模塊對用戶瀏覽時(shí)產(chǎn)生的可感知的影響極小,也即用戶幾乎無法感知到模塊加載前后瀏覽時(shí)間上的差異,從而不會產(chǎn)生由于用戶覺得安全模塊過于拖慢顯示速度從而關(guān)閉安全模塊的事情。安全模塊的執(zhí)行效率也會因此直接影響用戶瀏覽網(wǎng)頁時(shí)的安全性。
而需要大量操作元素的Clickjacking 模塊,事實(shí)上并不會對用戶瀏覽造成影響。因?yàn)楣粽吖魹g覽器時(shí)產(chǎn)生的頁面元素通常都非常少,否則將不利于攻擊代碼的傳播,因此過濾時(shí)大部分都將僅對大約20 個(gè)左右的元素進(jìn)行操作。
而IE 瀏覽器在實(shí)現(xiàn)直接通過IHTMLDOMNode 接口操作瀏覽器元素的方法時(shí),其做的具體操作是,將對應(yīng)的DOM 節(jié)點(diǎn)從IE 的節(jié)點(diǎn)二叉伸展樹上移除,然后將元素對應(yīng)的類從內(nèi)存中刪除。這一操作具體實(shí)現(xiàn)起來資源開銷是十分少的。
以下測試結(jié)果是在程序冷啟動(開機(jī)后第一次運(yùn)行)下,開啟對應(yīng)標(biāo)簽后5 秒時(shí)的資源情況。每個(gè)標(biāo)簽的占用數(shù)據(jù)均包括標(biāo)簽和主程序,用后者減去前者除以標(biāo)簽差量得出單個(gè)標(biāo)簽的占用,最終全部加起來除以總標(biāo)簽差量得到平均每個(gè)標(biāo)簽的占用。后單頁內(nèi)存消耗方法與此相同,內(nèi)存增量測試結(jié)果如表4所示。
表4 內(nèi)存占用增量測試結(jié)果 KB
標(biāo)簽內(nèi)占用的內(nèi)存大部分是由IE 窗口導(dǎo)致的,而相對內(nèi)存增量則是保護(hù)模塊和IE 自身共同作用帶來的增量,這可以部分反應(yīng)模塊對瀏覽時(shí)內(nèi)存增加所帶來的貢獻(xiàn)。
瀏覽器自身就是一個(gè)資源密集型程序,如果模塊貢獻(xiàn)了過多的內(nèi)存增量,那么對用戶使用來說將是不利的。但是上述測試可以發(fā)現(xiàn)安全模塊并沒有貢獻(xiàn)出過多的內(nèi)存占用。
在日常使用過程中內(nèi)存占用是有一定波動的,在實(shí)際測試和理論驗(yàn)證中內(nèi)存增量并不會太多。事實(shí)證明這還是一個(gè)簡單易行而且對用戶機(jī)器資源消耗較少的方法。
控制內(nèi)存增加的主要辦法是,盡量多利用棧上內(nèi)存,必要時(shí)才在堆中分配,因?yàn)闂I蟽?nèi)存結(jié)構(gòu)簡單,不像堆中各個(gè)堆塊數(shù)據(jù)都有不少字節(jié)用于維護(hù)堆表信息。而這兩種內(nèi)存都將在函數(shù)函數(shù)結(jié)束時(shí)及時(shí)釋放,所以對用戶來說,內(nèi)存只是一個(gè)短期的增長。而一段時(shí)間后內(nèi)存不斷增長主要還是因?yàn)镮E 自身的實(shí)現(xiàn)機(jī)制,與模塊并無多大聯(lián)系。因此本保護(hù)模塊可以實(shí)現(xiàn)使用少量內(nèi)存占用實(shí)現(xiàn)安全功能。
瀏覽器中添加安全模塊是一種自由、可定制的輕便服務(wù)形式。同時(shí),采用模塊化的防護(hù)函數(shù)可以保證在現(xiàn)今產(chǎn)品主程序迭代較慢的情況下達(dá)到產(chǎn)品的迅速迭代性,進(jìn)而可以及時(shí)防御互聯(lián)網(wǎng)攻擊,具有十分重要的現(xiàn)實(shí)性意義,這是目前產(chǎn)品開發(fā)所流行推崇的研究開發(fā)方向。
對互聯(lián)網(wǎng)上存在的攻擊,在瀏覽器層面給用戶添加一層額外的保障,可以讓用戶在瀏覽互聯(lián)網(wǎng)時(shí)更加安心、省心。同時(shí),人性化的設(shè)計(jì)也可以照顧到各個(gè)層次的互聯(lián)網(wǎng)使用者,瀏覽器可以在安全和易用性上可以做到一個(gè)好的平衡點(diǎn)。隨著互聯(lián)網(wǎng)的進(jìn)步和技術(shù)水平的提高,在未來,可以預(yù)見的是將有更多的互聯(lián)網(wǎng)威脅,同時(shí)也會有更多的安全保護(hù)措施的誕生,安全防護(hù)意在提升黑客攻擊的門檻,同時(shí)給予用戶更好的互聯(lián)網(wǎng)瀏覽體驗(yàn),從而推動整個(gè)行業(yè)的發(fā)展。
[1]CHRISTIAN KANAMUGIRE.A Client-Side Solution Against Session Hijacking Through Xss Attacks[D].長沙:中南大學(xué),2012.
[2]溫凱,郭帆,余敏.自適應(yīng)的Web 攻擊異常檢測方法[J].計(jì)算機(jī)應(yīng)用,2012(7):2 003-2 006.
[3]徐少培,姚崎.基于操作劫持模式的Web 攻擊與防御技術(shù)研究[J].信息安全與通信保密,2011(1):86-89.
[4]張偉,吳灝,鄒郢路.針對基于編碼的跨站腳本攻擊分析及防范方法[J].小型微型計(jì)算機(jī)系統(tǒng),2013(7):1 615-1 619.
[5]WADE ALCORN,CHRISTIAN FRICHOT,MICHELE ORRù.The Browser Hacker’s Handbook[M].America:John Wiley & Sons,Inc.,2014.
[6]MICHAL ZALEWSKI.Web 之困——現(xiàn)代Web 應(yīng)用安全指南[M].北京:機(jī)械工業(yè)出版社,2014.
[7]MICHAEL SUTTON,ADAM GREENE,PEDRAM AMINI.模糊測試——強(qiáng)制性安全漏洞發(fā)掘[M].北京:機(jī)械工業(yè)出版社,2009.
[8]PACO HOPE,BEN WALTBER.Web Security Testing Cookbook[M].America:O’Reilly Media,2008.
[9]王文君,李建榮.Web 應(yīng)用安全威脅與防治-基于OWASP Top 10 與ESAPI[M].北京:電子工業(yè)出版社,2009.