国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Jalangi的廣告代碼調用路徑追蹤*

2019-08-13 05:06:48劉蕊成陳貴美張衛(wèi)豐
軟件學報 2019年7期
關鍵詞:函數(shù)調用插樁調用

許 蕾, 劉蕊成, 陳貴美, 趙 晨, 張衛(wèi)豐

1(南京大學 計算機科學與技術系,江蘇 南京 210023)

2(南京郵電大學 計算機學院,江蘇 南京 210003)

1 背景介紹

目前,互聯(lián)網(wǎng)中最成熟的商業(yè)模式之一是以廣告為基礎的商業(yè)模式.據(jù)悉,谷歌公司 96%的收入都來自于網(wǎng)絡廣告.當用戶使用搜索引擎時,除了返回與查詢詞相關的信息外,還會出現(xiàn)廣告,一旦用戶點擊了這些廣告,廣告的發(fā)布者需要付費給搜索引擎,與此同時,用戶有可能成為廣告商品的買家.這樣,在線廣告把商家、用戶、應用開發(fā)者有機地聯(lián)系在一起,共同構成了互聯(lián)網(wǎng)應用的生態(tài)系統(tǒng).

為了便于發(fā)布、傳播廣告并提高用戶點擊率,廣告提供商通常使用JavaScript代碼動態(tài)生成廣告頁面,并收集用戶交互、瀏覽器環(huán)境等信息.作為第三方代碼,這些廣告代碼可能給網(wǎng)站以及用戶帶來極大的安全隱患.例如,這類廣告代碼可以獲得用戶在瀏覽器上的行為,從而獲得用戶的訪問信息,增加了用戶隱私信息泄露的可能性,同時也打破了網(wǎng)站本身的完整性.更可怕的是,一些惡意廣告可能利用網(wǎng)頁中的漏洞,偷偷將惡意軟件安裝到用戶的電腦中.研究顯示,網(wǎng)絡上每天出現(xiàn)約 130萬個惡意廣告,它們中的大部分都會下載惡意軟件并且進行一定的偽裝,以繞過安全軟件的檢測[1-4].

現(xiàn)今大部分網(wǎng)站都使用JavaScript代碼動態(tài)顯示信息.事實上,幾乎所有的惡意廣告都是通過JavaScript代碼加載的.因此,為了提高網(wǎng)頁的安全性,可以直接禁止所有JavaScript代碼的加載.但是由于包含JavaScript代碼的應用十分普遍,網(wǎng)頁中幾乎所有的動態(tài)效果和交互性強的顯示效果都需要使用JavaScript代碼,網(wǎng)站應用越來越趨向于使用JavaScript代碼,以吸引用戶和增強表現(xiàn)力.因此,直接屏蔽JavaScript代碼會導致網(wǎng)頁的交互性降低,不能因噎廢食.

為了識別惡意廣告,需要追蹤廣告代碼調用路徑.但追蹤廣告代碼路徑具有很大的挑戰(zhàn),這是由于:(1) 網(wǎng)頁中混雜了大量HTML文件、JavaScript腳本文件、CSS文件,又由于有的腳本文件根本不執(zhí)行,很難識別出廣告相關的JavaScript文件;(2) JavaScript腳本文件中包含大量函數(shù),每個函數(shù)之間的調用關系錯綜復雜,形成了很長的函數(shù)調用鏈路,這些函數(shù)大都分布在不同的JavaScript文件中,也不容易識別函數(shù)的調用關系;(3) 為了保證用戶的瀏覽體驗以及代碼本身的隱私和安全性,開發(fā)者往往對JavaScript代碼進行了壓縮,使得整體的代碼可讀性變差,導致JavaScript代碼中函數(shù)調用鏈的獲取工作更加困難.

為此,我們計劃使用動態(tài)分析方法獲取廣告的調用路徑.由于網(wǎng)頁廣告的調用過程實質上是網(wǎng)站主通過廣告聯(lián)盟獲取廣告相關的 JavaScript代碼,因此我們的工作可以認為是從廣告聯(lián)盟的代碼中獲取廣告調用路徑.本文的主要工作如下:(1) 對廣告相關的JavaScript腳本進行分析,發(fā)現(xiàn)動態(tài)廣告的生成特點;(2) 根據(jù)生成特點,使用動態(tài)插樁工具對網(wǎng)頁進行插樁,以獲得廣告的調用路徑;(3) 對iframe內部調用路徑和跨iframe調用路徑進行不同處理,獲得完整的調用路徑;(4) 通過實驗分析以及與靜態(tài)分析方法的對比,說明本文方法的有效性:能夠在有限增加訪問時間(2~10X)的前提下,獲取到靜態(tài)方法無法獲取到的廣告動態(tài)加載過程信息,并生成廣告代碼調用路徑.

本文第2節(jié)通過實例說明廣告調用路徑獲取的困難性.第3節(jié)設定規(guī)則使用動態(tài)插樁工具對廣告相關的調用路徑進行追蹤.第4節(jié)分別介紹對調用路徑中iframe內部和跨iframe調用路徑的獲取.第5節(jié)是實驗部分,針對 21個真實網(wǎng)站進行廣告代碼調用路徑的追蹤并給出具體的統(tǒng)計結果.另外,還與靜態(tài)分析方法進行了對比,說明本文方法的有效性.第6節(jié)為相關工作,包括互聯(lián)網(wǎng)廣告研究和JavaScript程序分析.第7節(jié)總結全文并指出后續(xù)可開展的工作.

2 動態(tài)廣告生成示例

網(wǎng)頁中動態(tài)廣告的加載和生成是一個復雜的過程,其傳播路徑可能涉及多個JavaScript腳本文件.本節(jié)我們用一個示例描述網(wǎng)頁中動態(tài)廣告的加載過程,并說明廣告調用路徑獲取的困難所在.

以www.gamefaqs.com為例,圖1虛線以上區(qū)域展示了該網(wǎng)站主頁加載完畢后的代碼及截圖,紅色橢圓區(qū)域是由Google提供的動態(tài)廣告;虛線以下區(qū)域顯示廣告加載的動態(tài)過程,包括多個JS文件的調用.在該應用中,為了個性化推送廣告和躲避檢測,源代碼經(jīng)過了一些混淆處理.為了方便閱讀,圖中所示代碼已經(jīng)進行了一些簡化處理.其廣告加載的詳細步驟描述如下.

(1) 瀏覽器加載主頁,加載后由服務器返回的代碼如圖1中虛線以下區(qū)域的左半部分第1行~第20行所示.當?shù)?行~第14行中的腳本語言執(zhí)行后,一個新script標簽及其包含的JS文件會加載到頁面中(ads.js).

(2) 瀏覽器解析新增加的script標簽并執(zhí)行來自pubads.g.doubleclick.net中的ads.js文件.該文件第4行又向頁面中插入新的script標簽并執(zhí)行JS文件akyi97Q8.js.

(3) 瀏覽器加載來自tpc.googlesyndication.com中的akyi97Q8.js文件,該文件創(chuàng)建了一個iframe標簽(文件中第 1行),并在第 3行中引用 tpc.googlesyndication.com的 adXpYxnS.html文件,并把該 iframe嵌套到 id為google_ads_iframe的div下(第6行、第7行).

(4) 瀏覽器從tpc.googlesyndication.com加載adXpYxnS.html文件.該HTML文件觸發(fā)了廣告內容相關函數(shù)的執(zhí)行,該函數(shù)返回廣告相關的內容(pagead2.googlesyndication.com).

(5) 最終,瀏覽器加載并顯示實際的廣告.頁面截圖和加載完畢后的源代碼如圖1中虛線上部所示.

從圖1所示例子可以看出,網(wǎng)頁中廣告相關的JavaScript調用路徑難以獲得有以下幾個原因.

(1) 由于網(wǎng)頁中混雜著大量的HTML代碼、JavaScript腳本文件、CSS文件,又由于有的腳本文件根本不執(zhí)行,這給廣告相關JavaScript文件的識別工作帶來了相當大的困難.

例如,網(wǎng)站www.gamefaqs.com中的measure.js存在于網(wǎng)頁中,卻沒有被執(zhí)行,也難以判斷該JS文件是否是廣告相關代碼.

(2) JavaScript腳本文件中包含大量函數(shù),包括匿名函數(shù),各函數(shù)之間的調用關系錯綜復雜,形成了很長的函數(shù)調用路徑.這些函數(shù)大都分布在不同的JavaScript文件中,這對觀察和識別函數(shù)的調用關系造成了不便.

例如,圖1中存在的文件調用路徑為ads.js?akyi97Q8.js?adXpYxnS.html,同時還有眾多其他文件沒有顯示出來,要從中找出這些調用路徑難度很大.

(3) 另外,為了保證用戶的瀏覽體驗以及代碼本身的隱私和安全性,HTML頁面中的JavaScript代碼通常會被壓縮或混淆,使得整體的代碼可讀性變差,導致JavaScript文件中函數(shù)調用鏈的獲取工作更加困難重重.

例如,圖 1所示 www.gamefaqs.com網(wǎng)站的 ads.js文件包含豐富的信息,實際找到的文件卻只有1行代碼,但卻有上千列.這些代碼壓縮或混淆在一起,可讀性極差,也進一步增加了調用路徑獲取的難度.

3 使用Jalangi獲取廣告調用路徑

本節(jié)我們通過使用動態(tài)插樁工具Jalangi對包含JavaScript代碼的網(wǎng)頁進行插樁,并針對JavaScript函數(shù)進行若干特殊處理,以獲取廣告的調用路徑.

3.1 動態(tài)插樁工具Jalangi

Jalangi[5]是美國加州大學伯克利分校在 2013年開發(fā)實現(xiàn)的 JavaScript動態(tài)分析框架,能夠對前端和后端JavaScript進行動態(tài)分析,允許監(jiān)控每個JavaScript程序的操作以及編寫自己的程序分析代碼;通過記錄-回放的機制來實現(xiàn)JavaScript代碼的插樁,并通過影子執(zhí)行的方法運行自定義的動態(tài)分析腳本.Jalangi提供了豐富的分析API,以實現(xiàn)各種動態(tài)程序分析.當使用Jalangi對網(wǎng)頁進行分析時,瀏覽器通過使用一個代理服務器向網(wǎng)頁所在服務器發(fā)送請求,并獲得整個原始頁面的JavaScript腳本文件;接著,Jalangi對獲得的腳本文件進行插樁.

Jalangi在網(wǎng)頁加載前對原始代碼進行插樁,并生成插樁后代碼.

插樁后代碼調用了兩個 Jalangi回調函數(shù) J$.W和 J$.R,分別是變量賦值和變量讀取的分析回調函數(shù),變量名和變量值等參數(shù)會被傳遞給這兩個函數(shù).J$.R(5,‘b’,b)表示讀取名稱為‘b’的變量,其中數(shù)字 5表示回調函數(shù)的標識符;J$.W(9,‘a’,J$.R(5,‘b’,b),a)表示對變量名為‘a’的變量賦值為 J$.R(5,‘b’,b)的返回值,其中數(shù)字 9 也表示回調函數(shù)的標識符.此時在瀏覽器中加載網(wǎng)頁,會執(zhí)行插樁后的JavaScript代碼,且不會破壞頁面的原有設置.

另外,還可以通過在工具Jalangi源程序中設定一系列規(guī)則,對JavaScript代碼進行動態(tài)插樁,進而得到執(zhí)行軌跡、變量取值等定制化信息.因此,我們可以設定規(guī)則對網(wǎng)頁進行插樁,以獲取廣告相關的JavaScript腳本.

Jalangi提供了回調函數(shù)invokeFunPre和putFieldPre,它們分別在函數(shù)執(zhí)行前和在對象屬性賦值前進行分析操作.其中,invokeFunPre函數(shù)包含幾個重要的參數(shù):(1) iid,當前回調函數(shù)執(zhí)行時的唯一標識符,以數(shù)字類型表示;(2) f,指向當前函數(shù)對象;(3) base,如果函數(shù)f是某個對象的方法,則base是該對象的引用,否則為null;(4) args,函數(shù) f的參數(shù)列表,以數(shù)組形式表示;(5) isConstructor,判斷函數(shù) f是否為構造函數(shù),以布爾形式類型表示.putFieldPre函數(shù)包含幾個重要的參數(shù):(1) iid,當前回調函數(shù)執(zhí)行時的唯一標識符,以數(shù)字類型表示;(2) base,賦值的屬性隸屬的對象;(3) offset,屬性名;(4) val,在base[offset]中存儲的值,即該對象屬性存儲的原始值.

3.2 廣告調用路徑相關定義

由于時間、精力有限,我們只追蹤來自百度和谷歌的廣告調用路徑,且對于域名與當前網(wǎng)頁所在服務器的二級域名不相同時才進行追蹤,以下定義均建立在此前提之上.另外,根據(jù)同源策略,當 iframe引用的URL與當前網(wǎng)頁的域名不同時,DOM元素是不可以被iframe所在頁面內的JavaScript代碼操作的,所以document內部的函數(shù)調用是指在一個iframe內的函數(shù)調用.

定義1.document內廣告路徑的開始節(jié)點S若函數(shù)調用時沒有調用者或者調用者是DOM事件處理函數(shù),則認為是廣告路徑的開始節(jié)點.另外,我們使用unname作為匿名函數(shù)調用的標識.

例如:圖1中左側代碼片段的開始節(jié)點為第3行~第15行的匿名函數(shù).

定義2.document內廣告路徑的結束節(jié)點E若使用函數(shù)appendChild、insertBefore以及document.write插入〈img〉、〈script〉、〈a〉、〈iframe〉標簽,或使用 innerHTML 方式插入〈iframe〉標簽,則將其作為廣告路徑的結束節(jié)點.

例如,圖 1右側底部 ads.js文件中的結束節(jié)點為第 6行用 insertBefore方式插入代碼片段,圖 1右側中部akyi97Q8.js文件中的結束節(jié)點為第7行用appendChild方式插入的〈iframe〉標簽.

定義3.document內廣告路徑的中間節(jié)點M開始節(jié)點和結束節(jié)點之間的一系列函數(shù)調用均作為中間節(jié)點.

例如,圖1虛線下方左側廣告調用路徑為%source%unnamed→insertBeforescriptads.js,虛線下部右側底部廣告調用路徑為%source%unnamed→insertBeforescriptakyi97Q8.js,虛線下部右側上部廣告調用路徑為%source%unnamed→appendChildiframe.

虛線下部代碼片段組成一條 document內部的函數(shù)調用路徑,即%source%unnamed→insertBeforescriptads.js→%source%unnamed→insertBeforescriptakyi97Q8.js→%source%unnamed→appendChildiframe.

另外,我們注意到,JavaScript函數(shù)中使用setTimeout和setInterval設置了定時執(zhí)行函數(shù),函數(shù)執(zhí)行時調用者會變?yōu)闉g覽器.因此,為了廣告鏈路的完整性,我們需要將調用 setTimeout和 setInterval的函數(shù)作為定時執(zhí)行函數(shù)的父節(jié)點.

定義5.跨document的函數(shù)調用路徑AP記為P1…Pm,其中,Pi表示第i個document內部的廣告路徑,相鄰節(jié)點Pi,Pi+1表示Pi結束節(jié)點產生了第i+1個document.

例如:在圖1虛線下右側中部中使用appendchild插入一個iframe,iframe的 src為 adXpYxnS.html,即這個document產生了另一個內容為adXpYxnS.html的document.

3.3 改寫Jalangi實現(xiàn)針對廣告調用的動態(tài)插樁

我們考慮使用Jalangi對網(wǎng)頁進行動態(tài)插樁,以獲得廣告的調用路徑,具體方案如圖2所示,其主要的工作流程是:在瀏覽器中設置代理,當我們訪問一個網(wǎng)頁時,代理服務器會獲取從Web服務器返回的HTML網(wǎng)頁文件及其引用的JS腳本文件,并調用Jalangi對HTML和JS文件中的JavaScript腳本代碼進行插樁,然后記錄執(zhí)行軌跡并在瀏覽器上顯示頁面內容.

每執(zhí)行一行 JavaScript腳本代碼,其執(zhí)行軌跡均會被記錄下來,通過分析將其關聯(lián)起來,就可以追蹤特定代碼的調用路徑.一個函數(shù)調用路徑是一個函數(shù)調用的相關信息項的序列,每一項都包含:執(zhí)行的函數(shù);函數(shù)調用在代碼中的位置,以行列數(shù)表示;函數(shù)調用所在的js文件的url.函數(shù)調用路徑中相鄰的兩項表示前一項中的函數(shù)調用了后一項中的函數(shù).本文獲取函數(shù)調用路徑的方法是基于函數(shù)的參數(shù)對象arguments實現(xiàn).一個函數(shù)的參數(shù)對象可以在該函數(shù)的作用域內被訪問,也可以在這個函數(shù)直接調用的函數(shù)的作用域內被訪問.參數(shù)對象是一個類數(shù)組對象,存放著包括本次函數(shù)調用傳入的實參arguments[0]~arguments[arguments.length-1]和對該函數(shù)的引用arguments.callee.

我們通過改寫Jalangi的invokeFunPre分析回調函數(shù),在被分析代碼中的函數(shù)調用之前,將函數(shù)調用路徑作為一個額外的實參傳遞給它,則函數(shù)執(zhí)行后該函數(shù)調用路徑會出現(xiàn)在它的參數(shù)對象里;在其調用的任何函數(shù)作用域內,都可以通過arguments.callee.caller.arguments訪問到前者的參數(shù)對象存放的函數(shù)調用路徑.

一個函數(shù)對應的函數(shù)調用路徑即以該次函數(shù)調用為終點的一系列函數(shù)調用.Jalangi將原代碼中的函數(shù)調用替換成一個包裝函數(shù)的調用,該包裝函數(shù)先調用 invokeFunPre進行調用前分析,再調用原代碼中的函數(shù)的插樁后版本,最后調用 invokeFun進行調用后分析.原本傳遞給原函數(shù)的參數(shù)現(xiàn)在傳遞給包裝函數(shù),且該包裝函數(shù)的調用者與原函數(shù)在插樁前原本的調用者是一致的;因為Jalangi將包裝函數(shù)的參數(shù)對象傳遞給invokeFunPre,所以我們可以獲取到包裝函數(shù)的調用函數(shù)的參數(shù)對象,提取后者對應的函數(shù)調用路徑.與此同時,我們也可以通過invokeFunPre在一個函數(shù)的參數(shù)對象里初始化一個函數(shù)調用路徑.

3.4 廣告調用路徑相關信息獲取

為了捕捉廣告調用路徑的開始、過程和結束,我們設定一條廣告路徑由0或一串函數(shù)調用路徑和一次插入某些特定 DOM 元素的操作組成.一個完整的網(wǎng)頁廣告生成流程包含不少于一個的廣告路徑.經(jīng)過調研我們發(fā)現(xiàn),廣告調用路徑涉及JavaScript中3類原生函數(shù),對應于定義2,即:使用insertBefore或appendChild插入script、a、img、iframe標簽;使用document.write插入script、a、img、iframe標簽;使用innerHTML插入iframe標簽.另外,對于setTimeout和setInterval的處理,也需要特殊對待.

綜合大量文獻發(fā)現(xiàn),溶血現(xiàn)象影響生化檢測項目主要表現(xiàn)在以下幾點:①對肝功能指標影響:研究報道,溶血現(xiàn)象對谷草轉氨酶、谷丙轉氨酶、總蛋白和白蛋白等檢測項目帶來正干擾,而對直接膽紅素和總膽紅素帶來負干擾[4];②對腎功能指標影響:文獻報道,溶血現(xiàn)象對腎功能檢測項目帶來的影響比對肝功能帶來的影響要小,因為溶血后的谷胱甘肽等紅細胞物質可吸收尿酸中的H2 O2;③對血脂血糖指標的影響:目前臨床上檢驗血糖的方法主要為葡萄糖氧化酶聯(lián)合H2 O2酶法,但血液樣本溶血后產生的血紅蛋白會不同程度的影響血糖檢測過程中的反應物,從而使得檢測結果出現(xiàn)誤差。

為了在函數(shù)調用過程中記錄并傳遞執(zhí)行軌跡(trace)信息,我們需要通過invokeFunPre中特定的函數(shù)參數(shù)記錄并追蹤trace.為此,我們設置了特定的trace信息結構.

如圖3所示,trace中記錄的document內廣告調用路徑P的信息結構為

%source%函數(shù)名稱,位置,文件名,函數(shù)調用的位置||(函數(shù)名稱,位置,文件名,函數(shù)調用的位置||)*插入元素的方式,插入的內容,插入內容的src,位置,文件名,函數(shù)調用的位置

其中,“%source%”表示廣告路徑P的開始節(jié)點S;“||”作為每次函數(shù)調用的分隔標識;“(函數(shù)名稱,位置,文件名||)*”表示0個或多個中間節(jié)點M;“插入元素的方式”表示結束節(jié)點的開始,包括了insertBefore、appendChild、document.write這3種方式.整個廣告調用路徑包括1個開始節(jié)點、0個或多個中間節(jié)點、1個結束節(jié)點.

由此構成document內的廣告調用路徑集合CS和所有document的廣告調用路徑集合CSS:CS的信息結構為keyvalue鍵值對,key為文件名,每個value為一個二維數(shù)組,第1維表示trace,第2維表示trace的每一項的具體信息;CSS的信息結構為(url,P)*,其中,url表示當前document所在的url,P表示當前document廣告調用路徑.

為了得到以上信息,我們需要在冗長、復雜、可能包含混淆代碼的JavaScript文件中識別出廣告相關的函數(shù),并確定調用路徑的起始點、更新以及終止點,具體處理過程如下所示.

3.4.1 廣告相關函數(shù)調用路徑初始化

需要說明的是,在引入的第三方腳本中,如果一個函數(shù)被網(wǎng)站服務商提供的腳本代碼調用,則這次函數(shù)調用不被認為有關廣告生成,而是第三方函數(shù)庫的調用行為,因為現(xiàn)今主流的廣告聯(lián)盟不要求網(wǎng)站開發(fā)者調用它們的接口以生成廣告.

圖 4是一個簡單的廣告調用路徑代碼示例:當用戶訪問網(wǎng)站www.A.com的主頁時,頁面主動加載了C.js文件,這段代碼來自于ads.B.com,即對于主頁面來說,這段代碼來自于第三方JavaScript庫.因此,符合我們設定的廣告調用路徑起始點(滿足條件2).經(jīng)過Jalangi插樁,可以記錄下trace:onload→A.

3.4.2 廣告相關的函數(shù)調用路徑更新

如果一個函數(shù)有調用者且調用者的參數(shù)對象中存在函數(shù)調用路徑,則說明它已被標記為潛在廣告路徑的一部分,所以我們可以將它的函數(shù)調用路徑和當前的函數(shù)調用相關信息拼接,形成更新后的函數(shù)調用路徑.

對于函數(shù)調用路徑更新,有一個特殊的情況是:當一個函數(shù)調用setTimeout延時執(zhí)行或調用setInterval定時延時另一個函數(shù)時,從后者的參數(shù)對象中獲取的調用者是 null,即從調用棧的角度來看,兩者沒有直接調用的關系.但是在調研中,我們發(fā)現(xiàn):廣告腳本中有很多地方使用了這種定時或延時執(zhí)行函數(shù).因此,需要捕獲這樣的調用關系.

如圖5所示,在加載執(zhí)行A函數(shù)時,使用setInterval每隔5s調用B函數(shù),在B函數(shù)中調用了C函數(shù),C函數(shù)又做了一些操作.因此,函數(shù)的調用路徑是A→setInterval→B→C.但是由于setInterval設置的延時,使得調用路徑在B之后發(fā)生中斷,導致無法獲取到C函數(shù)的調用信息.setTimeout的情況與此類似.

因此,使用 setTimeout或 setInterval函數(shù)阻斷了廣告調用路徑的傳播,需要對這兩個函數(shù)進行特殊處理.處理方法是:創(chuàng)建一個閉包,該閉包內存放著setTimeout函數(shù)或setInterval函數(shù)調用者參數(shù)對象的引用、要延時或定時執(zhí)行的目標函數(shù),其中,延時或定時執(zhí)行的對象不再是原目標函數(shù),而是這個閉包,這個閉包在運行時會先將setTimeout函數(shù)或setInterval函數(shù)調用者的參數(shù)對象傳遞給分析函數(shù)invokeFunPre,然后再執(zhí)行目標函數(shù).圖6展示了創(chuàng)建閉包的函數(shù)關鍵代碼,其中,J$.invokeFun函數(shù)會調用分析函數(shù) invokeFunPre,并調用目標函數(shù)fun;args里只有setTimeout函數(shù)或setInterval函數(shù)調用者的參數(shù)對象,但它不作為目標函數(shù)真正的參數(shù)對象.

經(jīng)過上述處理,在分析延時和定時的函數(shù)調用時,就可以獲取到存放在設置延時和定時執(zhí)行的函數(shù)的參數(shù)對象中的函數(shù)調用路徑,所以能夠捕獲非直接的調用關系.仍然使用圖4所示的例子,可以看到,A函數(shù)在調用B函數(shù)時使用setTimeout等待了5 000ms,這個操作會影響廣告路徑的延續(xù),因此Jalangi在這里對setTimeout進行特殊處理,即調用invokeFun函數(shù)直接執(zhí)行B,以此對路徑進行延續(xù),這樣獲得的trace路徑為onload→A→B,沒有丟失對B函數(shù)的調用.

3.4.3 廣告相關的函數(shù)調用路徑完成

廣告調用路徑可能會包含多次頁面跳轉(從一個JS文件鏈接到另一個JS文件),但最終會需要將包含廣告內容的頁面通過DOM操作插入到已有的HTML頁面中,插入元素的類型可能是腳本元素〈script〉、內聯(lián)框架元素〈iframe〉、超鏈接元素〈a〉以及圖片元素〈img〉,這是因為網(wǎng)頁廣告的生成包括以下幾種情況.

1) 廣告有可能通過插入〈script〉腳本來加載外部源的JS腳本文件;

2) 插入〈a〉標簽或〈img〉標簽,由于很多網(wǎng)絡廣告通過插入一段鏈接指向某個真正廣告內容的 url地址,所以需要進行標記;插入〈img〉標簽則為插入圖片,這時往往也是廣告生成的最后一步,即用圖片展示廣告內容,且可以起到與〈a〉標簽一樣的作用,因此也需要進行標記;

3) 插入〈iframe〉標簽,由于網(wǎng)頁上的廣告位通常為一個既定的區(qū)域,且保證不受頁面上其他腳本的DOM操作帶來的影響,常用一個iframe引入一個廣告頁面.

另外,一個廣告腳本可能會插入其他廣告腳本,也可能會插入iframe顯示廣告頁面,而且〈a〉和〈img〉元素都可以通過設置src屬性實現(xiàn)廣告鏈接.

使用 JavaScript語言在頁面 DOM 結構中插入 HTML元素的方法有以下幾種:調用 DOM 元素對象的insertBefore和appendChild方法、調用document.write函數(shù)和賦值DOM元素對象的innerHTML屬性.

1) 對insertBefore和appendChild函數(shù)的分析

對于使用insertBefore和appendChild函數(shù)插入iframe、script、a、img標簽的情況,我們認為該條路徑已經(jīng)到達了終止點,此時需要判斷其 caller的情況,如果有 caller屬性,即有調用者,而且其調用者不是事件處理函數(shù),則對該條路徑進行輸出;如果iframe、script、a標簽沒有調用者,或者調用者就是事件處理函數(shù),則對整條廣告?zhèn)鞑ヂ窂竭M行輸出.

在圖4中,B函數(shù)創(chuàng)建了一個script,然后用appendChild方法添加到網(wǎng)頁中.由于B函數(shù)的調用者A函數(shù)的參數(shù)中已經(jīng)添加過trace屬性,即A和B都在廣告調用路徑上,因此為B函數(shù)也添加調用路徑的屬性:onload→A→B→insertscript.appendChild.這就表示了該文件內廣告調用的結束,因此在控制臺對B函數(shù)所綁定的參數(shù)進行打印輸出.

2) 對document.write函數(shù)的分析

考慮到document.write函數(shù)接收的參數(shù)是字符串而非DOM元素對象,滿足HTML表達式規(guī)范的字符串會被解析為DOM對象,所以我們對document.write的參數(shù)進行字符串匹配,確定它是否插入了之前提到的4類元素.同樣,我們也要判斷寫入的script標簽有沒有src屬性.圖7所示例子說明了通過document.write插入元素的過程:第7行在A.js中使用document.write嵌入一個script標簽,script標簽執(zhí)行B.js.

3) 對innerHTML屬性的分析

向一個DOM元素的innerHTML屬性賦值一個合法的HTML表達式字符串,可以在其下面插入元素.使用Jalangi的putFieldPre分析回調函數(shù),可以分析任意對象屬性的寫入行為.當寫入一個對象的屬性時,判斷對象是否為DOM元素對象以及屬性名是否為innerHTML,且寫入了與廣告相關的標簽.

最后需要將函數(shù)調用路徑和DOM操作關聯(lián)起來,組成單條廣告路徑.在使用appendChild、insertBefore和document.write函數(shù)來插入廣告相關元素時,如果它們有調用者,則可以獲取它們的調用者參數(shù)對象里的函數(shù)調用路徑,并附上當前DOM操作的相關信息作為最后一項;而對于DOM元素對象的innerHTML屬性的寫入,我們擴展了Jalangi的代碼,使putFieldPre函數(shù)接收一個額外的參數(shù),即該條屬性賦值語句所在的函數(shù),從這個函數(shù)的參數(shù)對象里尋找函數(shù)調用路徑并拼接上該DOM操作的相關信息,作為最后一項.

4 廣告生成過程

4.1 document內的廣告生成過程

動態(tài)生成的廣告能夠在網(wǎng)頁廣告位中顯示來自于第三方廣告聯(lián)盟的廣告資源,這些廣告資源可能是圖片、視頻,甚至是一個URL鏈接.而根據(jù)JavaScript的同源策略,iframe引用的URL屬于不同域名網(wǎng)頁內的DOM是不可以被 iframe所在頁面內的 JavaScript代碼操作的,所以,為了不影響正常顯示,這些來自于第三方的圖片、視頻資源等,一般都嵌套在 iframe里,再放入網(wǎng)頁中.一個頁面和它的 iframe引用的頁面各自具有以 document節(jié)點為根節(jié)點的DOM樹.

在一個 document內,我們規(guī)定在兩條廣告路徑中,如果其中一條插入了一個〈script〉標簽,引用了某個 JS文件,而另一條的第1項對應的語句在該JS文件中,則兩者是關聯(lián)的,前者是后者的前繼.我們將獲取到的所有路徑都放在一個路徑集合中,方便之后獲取到新的廣告路徑時通過算法回溯它的所有前繼.

document內的廣告路徑回溯算法如算法1所示.該算法接受document內所有廣告路徑集合CS和需要回溯的路徑P,遍歷CS中的路徑,若找到一條插入script腳本且P對應的語句處于該腳本中,則遞歸回溯該條路徑的前繼,直到回溯完畢.

算法1.document內廣告路徑回溯算法.

4.2 跨documents的廣告生成過程

在某些情況下,一個頁面插入的 iframe引用的頁面里又會出現(xiàn)其他廣告相關元素的動態(tài)插入,我們將這些行為關聯(lián)在一起.在兩條廣告路徑中,如果其中一條路徑插入了一個iframe,另一條廣告路徑起源于該iframe引用的網(wǎng)頁中,則前者是后者的前繼.

每條廣告路徑都對應一個 document,即它的每一項對應的文件都是被該 document引用的.如算法 2所示,為了關聯(lián)跨documents的廣告路徑,遍歷其他document的廣告路徑集合里的路徑,并查看這些路徑的尾部是否插入了一個iframe且src屬性是否是被回溯路徑對應的document的url.如果存在這樣的路徑,則該路徑是這個待回溯路徑的前繼.與此同時,一個document對應的所有廣告路徑都與插入該document的路徑相關聯(lián).

算法2.跨documents廣告路徑回溯算法.

4.3 獲取廣告調用路徑中涉及的JS文件url

在圖8的示例中,A函數(shù)創(chuàng)建了一個iframe,用appendChild插入一個iframe標簽,作為廣告調用路徑的終止點.此時得到的廣告調用路徑為A→appendChild(ifr).在iframe內部又調用了B函數(shù),B函數(shù)又調用了C函數(shù),C函數(shù)插入一個圖片,使用appendChild插入img標簽,此時,這部分的廣告調用路徑結束,這部分的廣告調用路徑為appendChild(ifr)→B→C→appendChild(img).

通過使用算法3,可以將圖8所示的跨iframe的兩條廣告調用路徑進行拼接,從而獲得該廣告的完整調用路徑: A→appendChild(ifr)→B→C→appendChild(img).

算法3.獲取廣告調用路徑中涉及的JS文件url.

5 實驗分析

本節(jié)我們通過實驗來展示使用動態(tài)插樁方法獲得廣告代碼調用路徑,通過對比實驗來驗證本文方法的優(yōu)越性.

5.1 實驗目標和環(huán)境設置

為了說明本文方法的有效性,我們對動態(tài)插樁工具Jalangi進行了擴展并開展了以下實驗,以期動態(tài)追蹤廣告代碼調用路徑并獲取到調用路徑長度、廣告插入方式等特征信息,然后具體分析廣告相關的JavaScript腳本文件中原生函數(shù)insertBefore、appendChild、document.wirte、innerHTML所占的比重,從而更加明確廣告代碼的加載、傳播方式.另外,還與靜態(tài)分析方式進行了對比實驗,以說明我們的方法在惡意廣告的檢測精度上更具優(yōu)勢.

JavaScript的動態(tài)插樁工具Jalangi運行在Linux系統(tǒng)中,我們在代理服務器端使用OSX系統(tǒng)對網(wǎng)頁進行插樁,在Windows 7系統(tǒng)上用Firefox上對網(wǎng)頁進行瀏覽,并在控制臺獲取廣告相關的調用路徑,然后通過調用路徑分析廣告相關的JavaScript腳本文件.

5.2 實驗過程

我們隨機選取Alexa排名網(wǎng)站中的21個網(wǎng)站(包括13個國外網(wǎng)站和8個國內網(wǎng)站),作為實驗對象,以追蹤網(wǎng)站中廣告相關的JavaScript文件調用、傳遞的詳細過程.

本文實驗獲取的廣告相關 JavaScript函數(shù)調用路徑中插入標簽的方式包括:通過 JS函數(shù) insertBefore和appendChild分別插入script、img、a、iframe標簽;或通過document.write寫入一些標簽;或通過innerHTML插入iframe標簽.之后,統(tǒng)計各種插入方式的操作次數(shù).另外,我們還取到了廣告路徑中相關的JavaScript腳本文件,對每個文件解析其抽象語法樹,然后統(tǒng)計文件中insertBefore、appendChild、document.wirte、innerHTML出現(xiàn)的次數(shù).這種靜態(tài)方法只能獲取到各種操作的次數(shù),不能獲取到插入標簽的種類.實驗過程中,比較這兩種方式所獲取信息的差異,并給出具體的結論.

5.3 實驗結果

5.3.1 實驗數(shù)據(jù)及其分析

通過對網(wǎng)頁動態(tài)執(zhí)行過程的記錄和分析,我們不僅可以獲取廣告相關的函數(shù)調用路徑,還可以獲取網(wǎng)站 JS文件數(shù)量、廣告的插入方式.對于靜態(tài)分析方法,可以通過遍歷廣告相關的JS文件的抽象語法樹獲取廣告插入的操作方式,但是無法獲取操作標簽的種類.

表1中給出了網(wǎng)頁動態(tài)執(zhí)行中所涉及的JS文件、廣告相關JS文件和廣告相關JS片段數(shù)量,另外,還列出了插樁前后訪問時間的對比情況以及實際記錄的Trace長度情況.從平均數(shù)來看,這些網(wǎng)站平均要載入72個JS文件,其中廣告相關的JS文件有7個,這說明,在運行過程中會動態(tài)載入或生成相當多數(shù)量的JS文件或片段.如果只通過靜態(tài)方法分析網(wǎng)頁中的JS文件,則不能獲得動態(tài)執(zhí)行過程中載入的JS文件或片段,因而也就無法精確識別網(wǎng)頁中的廣告.另外,通過訪問時間的對比,我們發(fā)現(xiàn)本文方法的性能開銷通常是2~10X,處于用戶可以接受的范圍內.關于實際記錄的Trace長度情況,我們發(fā)現(xiàn)一個頁面上會包含多個廣告(通常有2~10個),且廣告代碼調用路徑的長度在 1~34之間,平均數(shù)在3~9之間,這表明,廣告的調用、傳播路徑還是比較長的,中間經(jīng)過了多次跳轉,這很大程度上增加了安全風險.

Table 1 Numbers of JS files, ads-related JS files and ads-related JS snippets表1 網(wǎng)頁動態(tài)執(zhí)行中所涉及的JS文件、廣告相關JS文件和廣告相關JS片段數(shù)量

圖9中顯示了網(wǎng)站JS腳本動態(tài)運行過程中appendChild、insertBefore、document.write和innerHTML的比例關系,可以看出,appendChild使用得最多(超過 40%),其次為 insertBefore(37%),而 document.write和innerHTML所占比例較少(分別為14%和6%).

我們同樣使用靜態(tài)分析方法統(tǒng)計了網(wǎng)站中 JS文件中 appendChild、insertBefore、document.write和innerHTML的比例關系(如圖10所示),可以看出,appendChild方法占比也是超過了40%,而insertBefore的比例有所減少(25%),innerHtml的數(shù)量大幅增加(25%).

通過比較圖9和圖10,我們發(fā)現(xiàn):通過innerHtml屬性來動態(tài)加載HTML網(wǎng)頁中廣告的方式比較少見(6%),而在網(wǎng)頁源代碼中經(jīng)常能看到 innerHtml屬性(25%),這表明,該屬性雖然常見,但大部分是與廣告加載無關的;與此相反,document.write在網(wǎng)頁源代碼中不算常見(2%),但還較多地用來動態(tài)加載HTML網(wǎng)頁中的廣告(14%),這表明,該屬性雖然不大常見,但大部分是與廣告加載相關的.

圖 11中給出了網(wǎng)頁JS腳本運行過程中動態(tài)生成 iframe、script、image和 a標簽所占的比例,可以看出,在這些含廣告的網(wǎng)站動態(tài)生成的標簽中 script(52%)和 iframe(28%)標簽占了大部分(80%),這說明,廣告腳本在運行過程中會動態(tài)生成很多腳本和網(wǎng)頁,這正是廣告分析的難點所在.作為廣告展示的image標簽占17%,這說明,廣告主要以圖片的形式進行展示,而從廣告網(wǎng)頁的加載開始到最終顯示出廣告,會經(jīng)歷多次的動態(tài)生成腳本和網(wǎng)頁的過程,有非常復雜的調用路徑,這使得惡意廣告的入侵成為可能.

我們的動態(tài)分析可以監(jiān)控到廣告加載的全過程,從而進行及時、有效的干預.而只進行靜態(tài)分析,是無法檢測到這些動態(tài)生成的惡意廣告代碼的.

5.3.2 實例分析

如圖12所示,匿名函數(shù)1中有一個三目運算,當條件(0===TRC.trkRequestStatus)不滿足時,調用函數(shù)_(函數(shù)2);函數(shù)_執(zhí)行了一系列操作之后,調用函數(shù)T(函數(shù)3);函數(shù)T調用了函數(shù)C(函數(shù)4);函數(shù)C中(https:"==ea?"https://sb":"http://b")+".scorecardresearch.com/beacon.js)為一個三目運算操作和一個字符串拼接操作,并把運算后的字符串作為參數(shù)傳遞給a,{async:!0}傳遞給參數(shù)c,在函數(shù)C中,創(chuàng)建script標簽e,然后設置e的src為a,即https://sb.scorecardresearch.com/beacon.js或者http://b.scorecardresearch.com/beacon.js,并且判斷c.async的值作為e的屬性設置的依據(jù),最后用insertBefore操作將script標簽寫入網(wǎng)頁中.

由此,我們使用擴展后的Jalangi進行插樁并記錄執(zhí)行軌跡,形成的函數(shù)調用路徑如下所示:

其中,“_”“T”“C”分別表示函數(shù)名,unnamed 是我們?yōu)槟涿瘮?shù)取的一個標識,cache/cdn.taboola.com/937d7f3e84aa424b9efca0a72b0ec608/loader.js表示loader.js在jalangi中存放的文件路徑,114:162298:114:162301表示當前函數(shù)在loader.js腳本中的位置為從第114行的162 298列~第114行的162 301列,因為腳本文件的內容是經(jīng)過壓縮的,所以列數(shù)多,代碼難理解.上述調用路徑為“unnamed→_→T→C→insertBeforescriptbeacon.js”.在beacon.js中還有一系列的函數(shù)調用.仔細觀察函數(shù)_,還調用了A函數(shù),此處又有另一條函數(shù)調用路徑.這表明,實際網(wǎng)頁中存在很多代碼壓縮的情況,并且函數(shù)之間的調用關系非常復雜,如果采用人工審查代碼的方式,是很難識別這些廣告文件中的函數(shù)調用關系的.

6 相關工作

6.1 JavaScript程序分析

JavaScript在 Web應用中發(fā)揮著重要作用,具有語法靈活性和高度動態(tài)性,易于使用,但代碼的可維護性不夠好.比如,JavaScript在運行時被廣泛用來和 DocumentObjectModel(DOM[6])元素進行異步交互[7],其動態(tài)性和松散性使JavaScript代碼易錯,且定位困難[8-11].

基于Jalangi動態(tài)分析框架[5],可以檢查JavaScript類型的一致性[12]或提高just-in-time(JIT)性能[13].另外,工具DLint[14]是在Jalangi的基礎上實現(xiàn)的,使用動態(tài)分析方法檢查JavaScript代碼質量,由一個通用框架和一組可擴展的地址和特定規(guī)則的檢查器組成,能夠解決被靜態(tài)方法遺漏的缺陷.

文獻[15]在文獻[16]的基礎上提出了一個自動定位技術,通過追蹤和后向切片,實現(xiàn)對 JavaScript的動態(tài)分析,解決了包括eval、匿名函數(shù)處理的困難.此外,HTML元素和JavaScript代碼之間通過瀏覽器相互作用,加劇了客戶端JavaScript代碼的維護問題.文獻[17]提出了一種JavaScript動態(tài)切片技術JS-Slicer,使得理解和調試客戶端JavaScript代碼變得容易.JS-Slicer在動態(tài)分析框架Jalangi的基礎上,結合動態(tài)和靜態(tài)分析所得結果,精確地捕獲運行時的依賴信息.

6.2 廣告代碼檢測

隨著互聯(lián)網(wǎng)的發(fā)展,在線廣告越來越多地被用于非法途徑,如傳播惡意軟件、詐騙、點擊詐騙行為等.為了理解這些惡意廣告活動的嚴重性,文獻[1-3]中研究了通過廣告聯(lián)盟所傳播廣告節(jié)點的拓撲結構,以此來獲得惡意廣告的傳播行為和特點,文獻[4]分析了3個月內爬取的廣告相關的網(wǎng)頁痕跡,揭示了惡意廣告的猖獗,進而從惡意廣告節(jié)點及其相關的內容傳遞路徑來識別出惡意廣告的特征,并構建了一個檢測系統(tǒng).

出于隱私、介入性和安全性等方面的考慮,現(xiàn)有一些技術和工具來攔截、屏蔽互聯(lián)網(wǎng)廣告,如:AdBlocke[18]、AdblockPlus[19]、Ghostery[20].這些工具通過維護一系列基于URL的正則表達式(EasyList[21]),將其與網(wǎng)頁上獲取的URL進行匹配而過濾廣告.文獻[22]使用針對JavaScript源代碼的靜態(tài)程序分析,識別用于加載并顯示廣告的JavaScript代碼,通過特征訓練,得到廣告相關腳本的分類器,從而實現(xiàn)廣告的攔截.與其相反,為了保障廣告商的合法權益,WebRanz[23]利用隨機化機制來使得廣告攔截器失效,通過使用 WebRanz,內容發(fā)布者可以不斷改變內部HTML元素ID以及元素屬性,而不會影響它們的視覺效果和功能.

現(xiàn)有互聯(lián)網(wǎng)廣告的檢測方法主要集中在靜態(tài)模式匹配、靜態(tài)特征匹配等,無法對混淆過后的域名和選擇器進行有效檢測,并且主要通過主觀判定來識別、確定廣告的特征,檢測精度低.相應地,本文工作的主要目的是獲取廣告代碼運行時的調用路徑,以得到廣告相關的JS文件并確定廣告插入的操作方式等信息,可以應用到廣告代碼(包括混淆代碼甚至惡意廣告代碼等)的識別中,并有效提高檢測精度,部分工作細節(jié)參加文獻[24].

7 總結與展望

作為互聯(lián)網(wǎng)最成熟的商業(yè)模式之一,在線廣告一方面有助于促進互聯(lián)網(wǎng)生態(tài)系統(tǒng)的健康發(fā)展,但也可能影響用戶的網(wǎng)頁瀏覽體驗以及帶來潛在的安全風險.現(xiàn)有的在線廣告屏蔽插件通過設置黑名單的方式實現(xiàn)對網(wǎng)絡廣告的檢測和屏蔽,但無法識別不在名單中的廣告,也無法獲取廣告代碼的調用路徑.

本文的研究對象是來自于廣告聯(lián)盟的動態(tài)廣告,這些廣告是目前在線廣告的主要存在形式.本文的工作是通過使用 JavaScript的動態(tài)插樁工具 Jalangi獲取自動執(zhí)行的廣告代碼第三方 JavaScript函數(shù)調用路徑.為此,我們?yōu)镴avaScript函數(shù)動態(tài)綁定了一個存儲調用路徑信息的屬性,分別識別廣告代碼調用路徑的起始、中間以及終止狀態(tài),并對于 setTimeout、setInterval等函數(shù)進行特殊處理以保證函數(shù)調用鏈的完整傳遞.另外,還對跨iframe的調用路徑進行拼接處理.此外,我們統(tǒng)計了廣告插入操作方式的類型(insertBefore、appendChild、document.wirte、innerHTML)和比例,并與遍歷抽象語法樹的靜態(tài)方法操作數(shù)量進行了對比,以此說明本文方法的有效性.

在實驗過程中,我們發(fā)現(xiàn)了一些用于分析用戶行為和記錄用戶 cookie的腳本文件,如 analytics.js,bkcoretag.js等.這些文件的特征和廣告代碼文件的特征比較相似,尤其體現(xiàn)在動態(tài)生成、傳播上.分析用戶行為和記錄用戶 cookie也會在一定程度上降低用戶的瀏覽體驗感受,實際上也是一種對用戶隱私的侵害,可以考慮將其一并作為廣告相關 JavaScript文件進行屏蔽.因此,在后續(xù)研究中,我們會通過追蹤代碼調用路徑的方式,進一步區(qū)分該類分析文件與廣告文件的特征,并應用于惡意廣告的檢測和屏蔽方面.

猜你喜歡
函數(shù)調用插樁調用
基于C語言的數(shù)學菜單的設計與實現(xiàn)
基于TXL的源代碼插樁技術研究
核電項目物項調用管理的應用研究
LabWindows/CVI下基于ActiveX技術的Excel調用
測控技術(2018年5期)2018-12-09 09:04:46
基于性能分析的自適應插樁框架
基于函數(shù)調用序列模式和函數(shù)調用圖的程序缺陷檢測方法*
基于記錄重播的嵌入式系統(tǒng)死鎖檢測方法
軟件導刊(2017年12期)2018-01-09 13:01:23
探討C++編程中避免代碼冗余的技巧
Unity3D項目腳本優(yōu)化分析與研究
中國新通信(2017年1期)2017-03-08 03:12:21
基于系統(tǒng)調用的惡意軟件檢測技術研究
龙川县| 沧源| 尼木县| 二连浩特市| 渑池县| 鄱阳县| 阿城市| 乌苏市| 尼木县| 福鼎市| 澎湖县| 佛冈县| 深州市| 博白县| 哈密市| 齐齐哈尔市| 正安县| 南江县| 台湾省| 石首市| 葫芦岛市| 中牟县| 乐业县| 汉寿县| 黄石市| 霍林郭勒市| 葫芦岛市| 清徐县| 崇信县| 习水县| 嘉兴市| 博乐市| 鄢陵县| 汾阳市| 丁青县| 敦化市| 弥勒县| 游戏| 苏尼特右旗| 岑巩县| 丰顺县|