版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Web瀏覽器安全是用戶在網(wǎng)絡(luò)環(huán)境中至關(guān)重要的一環(huán),而JavaScript引擎是瀏覽器中的重要組件,攻擊者可以通過釣魚網(wǎng)頁輕易地讓用戶觸發(fā)JavaScript引擎漏洞。JavaScript引擎又是內(nèi)存危險(xiǎn)的,觸發(fā)漏洞后攻擊者可以構(gòu)造特殊的原語來實(shí)現(xiàn)內(nèi)存的任意讀寫,從而控制被攻擊者的設(shè)備。JavaScript引擎漏洞在近幾年頻繁出現(xiàn),伴隨的利用腳本都僅僅需要遠(yuǎn)程瀏覽器訪問,范圍覆蓋Windows、MacOS、iOS、Android各種操作系統(tǒng),故JavaScript引擎的安全問題已經(jīng)是安全研究的重點(diǎn)對(duì)象。近幾年來,JavaScript引擎漏洞中JIT編譯器的漏洞占據(jù)了越來越大的比重。JIT編譯器,全稱(Just-In-Time)是一種程序語言提高運(yùn)行效率的方法。如圖1所示,JavaScript引擎解釋執(zhí)行JavaScript的流程為:先通過詞法和語法分析將JavaScript腳本轉(zhuǎn)化為AST樹,然后編譯為中間語言字節(jié)碼,接著進(jìn)行逐步解釋執(zhí)行,當(dāng)執(zhí)行的過程出現(xiàn)多次循環(huán)或者多次函數(shù)調(diào)用時(shí),JIT編譯器會(huì)將該部分字節(jié)碼重新編譯,通過編譯優(yōu)化提升運(yùn)行效率,最終轉(zhuǎn)化為符合操作系統(tǒng)的機(jī)器碼并執(zhí)行。圖1?解釋執(zhí)行JavaScript流程JIT優(yōu)化階段,JIT會(huì)將優(yōu)化拆分成為多個(gè)步驟(如常數(shù)折疊、循環(huán)不變量提升等),這些步驟即為每一個(gè)具體的JIT優(yōu)化階段。JIT優(yōu)化時(shí)會(huì)將需要優(yōu)化的代碼進(jìn)行分析,當(dāng)其滿足優(yōu)化階段的條件時(shí),進(jìn)行優(yōu)化。JIT編譯器漏洞,主要包含的是JIT優(yōu)化相關(guān)的漏洞,優(yōu)化漏洞通常在JIT編譯優(yōu)化過程中利用錯(cuò)誤預(yù)測或繞過檢查而達(dá)到利用。其中包含繞過邊界檢查,如CVE-2015-0817、CVE-2017-2547和CVE-2018-0769;繞過類型檢查,如CVE-2017-11802、CVE-2018-17463和CVE-2018-4233;以及各類其他類型漏洞。模糊測試是一種自動(dòng)化漏洞挖掘技術(shù)。尤其在針對(duì)瀏覽器引擎這類復(fù)雜的系統(tǒng)時(shí),模糊測試相比代碼審計(jì)等其他方式有著更高的挖掘漏洞效率。其核心思想是將隨機(jī)生成的輸入重復(fù)提供給應(yīng)用程序,然后在處理輸入直至程序退出期間,監(jiān)視程序是否出現(xiàn)錯(cuò)誤情況。模糊測試主要分為兩類,基于生成的方法和基于變異的方法。分述如下:基于生成的模糊測試方法,每個(gè)輸入文件都是從頭開始生成的,通常遵循一組預(yù)定義的規(guī)則。該規(guī)則將是上下文無關(guān)并會(huì)限定所有輸入的集合。在生成的過程中,通過隨機(jī)選擇實(shí)現(xiàn)隨機(jī)生成?;谧儺惖哪:郎y試方法,是從一組已知良好的種子文件開始,然后以隨機(jī)方式對(duì)它們進(jìn)行變異??赡艿淖儺惏忍睾妥止?jié)翻轉(zhuǎn)、遞增和遞減整數(shù)值、插入預(yù)定義的特殊整數(shù)和字符串值等。在模糊測試程序運(yùn)行后便會(huì)不斷生成測試樣本,讓目標(biāo)程序執(zhí)行,獲取執(zhí)行結(jié)果并統(tǒng)計(jì)。衡量模糊測試對(duì)目標(biāo)程序漏洞挖掘的進(jìn)度,通常使用的是覆蓋率指標(biāo)。覆蓋率是通過樁來計(jì)算的,樁存在于目標(biāo)程序的分支跳轉(zhuǎn)和函數(shù)調(diào)用處,通常都是在編譯目標(biāo)程序時(shí)由編譯器完成插樁工作。每次執(zhí)行目標(biāo)程序后,模糊測試工具可以獲得執(zhí)行過程中抵達(dá)的樁信息,計(jì)算抵達(dá)過的樁數(shù)量相對(duì)于總數(shù)的占比,即為覆蓋率指標(biāo)。為了能盡快提高覆蓋率,提出了基于覆蓋率為導(dǎo)向的模糊測試方法,當(dāng)樣本抵達(dá)了新的樁,則將其確定為“有趣”的樣本保留,在未來繼續(xù)對(duì)其進(jìn)行變異,如此往復(fù),逐漸遍歷系統(tǒng)的所有空間。01研究現(xiàn)狀在現(xiàn)今針對(duì)JavaScript引擎的模糊測試工具中,有基于規(guī)則生成的,也有基于變異生成的,本節(jié)會(huì)介紹當(dāng)今主流的幾款針對(duì)JavaScript引擎的模糊測試工具,并分析其使用的模糊測試技術(shù)。1.1?CodeAlchemist這是一款基于語料庫的生成模糊測試工具,從JavaScript種子文件中分解出代碼單元片段,對(duì)其進(jìn)行變量重命名、數(shù)據(jù)流分析、類型分析后并放入代碼塊池中,然后對(duì)代碼塊池中的片段進(jìn)行隨機(jī)選擇,組合生成JavaScript測試樣本。CodeAlchemist在組合代碼片段時(shí),會(huì)考慮上下文約束,從符合變量類型和數(shù)量的代碼片段中隨機(jī)選擇。該方法成功提高了模糊測試樣本的成功率。1.2?Fuzzilli這是一款基于中間語言的模糊測試工具,F(xiàn)uzzilli定義了一種新的中間語言FuzzIL并在其上進(jìn)行生成和變異,在組合了一系列中間語言后,統(tǒng)一將其提升為JavaScript測試樣本。提升過程時(shí)基于上下文和類型系統(tǒng),測試樣本有著較高的JavaScript語義正確性,并且變異過程是基于覆蓋率導(dǎo)向的,可以達(dá)到較高的覆蓋率。1.3?DIE這是一款基于類型語法樹的變異模糊測試工具,將JavaScript種子文件轉(zhuǎn)為語法樹,然后通過類型分析,產(chǎn)生包含類型標(biāo)識(shí)的語法樹(TypedAST)。DIE基于類型語法樹并保留種子文件結(jié)構(gòu)和類型特征進(jìn)行變異,優(yōu)質(zhì)的樣本對(duì)于DIE非常重要,故其選擇了大量以往的JavaScript崩潰樣本。1.4?分析對(duì)于現(xiàn)今針對(duì)JavaScript引擎的模糊測試工具而言,測試樣本的成功率和覆蓋率是重要的衡量指標(biāo)。對(duì)于JavaScript引擎中的JIT編譯器,測試樣本成功率和覆蓋率同樣是衡量模糊測試性能的重要指標(biāo)。其中測試樣本成功率指成功進(jìn)行JIT優(yōu)化并執(zhí)行優(yōu)化代碼的樣本的比例,而覆蓋率指JIT編譯器部分的覆蓋率。當(dāng)今針對(duì)JavaScript引擎的模糊測試工具對(duì)JIT引擎的測試樣本成功率不高。原因?yàn)椋海?)JIT引擎需要特殊的條件進(jìn)行觸發(fā),并不是所有測試樣本都會(huì)觸發(fā)JIT優(yōu)化;(2)JIT代碼會(huì)出現(xiàn)優(yōu)化退出的情況,而以一個(gè)會(huì)產(chǎn)生優(yōu)化退出的樣本作為種子文件時(shí),會(huì)產(chǎn)生許多不成功的測試樣本;(3)生成過長的樣本會(huì)影響JIT的運(yùn)行時(shí)間而導(dǎo)致超時(shí)。當(dāng)今針對(duì)JavaScript引擎的模糊測試工具對(duì)JIT引擎的覆蓋率也不高。原因?yàn)椋海?)需要擁有優(yōu)質(zhì)的JIT種子文件作為變異樣本;(2)在模糊測試JIT優(yōu)化階段時(shí)較為盲目,無法針對(duì)某一JIT優(yōu)化階段進(jìn)行專一的探索。02設(shè)計(jì)思路該節(jié)會(huì)介紹本模糊測試引擎的設(shè)計(jì)思路,包含生成JIT種子文件、檢測和變異三個(gè)部分。2.1?生成JIT種子文件從觸發(fā)JIT優(yōu)化條件而言,需要一個(gè)循環(huán)被多次執(zhí)行,這樣在循環(huán)內(nèi)部的代碼將會(huì)被JIT優(yōu)化。故設(shè)計(jì)了一個(gè)JIT種子文件的模板,包含:(1)一個(gè)將要被優(yōu)化的opt函數(shù)內(nèi)部;(2)觸發(fā)JIT優(yōu)化的循環(huán);(3)外部不被優(yōu)化的代碼。如圖2所示,在修改了JavaScript引擎的運(yùn)行參數(shù)后,可以將多次調(diào)用的數(shù)量減少為10~1000次。在生成JIT種子文件時(shí),采用基于中間語言的生成方式。相比基于語法或基本塊的生成方式,中間語言可以構(gòu)造更為泛型和復(fù)雜的句法結(jié)構(gòu)。另外在從中間語言提升為JavaScript的過程中會(huì)考慮上下文約束,每一個(gè)變量不僅保存類型信息,還有方法、屬性、原型鏈信息,相比基于類型語法樹的方法能夠生成語義正確性更高的樣本。如圖3顯示了如果只通過類型語法樹進(jìn)行生成可能導(dǎo)致的語義錯(cuò)誤,由于未考慮到原型鏈,會(huì)認(rèn)為變量a作為數(shù)組類型仍擁有splice方法。圖2?種子文件生成結(jié)構(gòu)圖3?單一的類型系統(tǒng)可能發(fā)生的語義錯(cuò)誤2.2?檢測在檢測上,除了崩潰捕獲、運(yùn)行時(shí)長和覆蓋率信息,還需要檢測JIT優(yōu)化是否成功執(zhí)行。JIT編譯后會(huì)在代碼中插入一些檢查來確保JIT優(yōu)化的正確執(zhí)行,而當(dāng)檢查不被通過時(shí),JIT優(yōu)化將會(huì)被退出,返回到原本的字節(jié)碼進(jìn)行逐步解釋執(zhí)行。在這種情況下,該測試樣本并沒有對(duì)JIT編譯器進(jìn)行有效的模糊測試。JIT種子文件在生成后需要被執(zhí)行一次,統(tǒng)計(jì)其運(yùn)行時(shí)長、覆蓋率和JIT執(zhí)行情況,并以此決定其是否被設(shè)置優(yōu)先級(jí)放入變異隊(duì)列中。如果生成的JIT種子文件沒有觸發(fā)JIT優(yōu)化或退出JIT優(yōu)化,則認(rèn)為對(duì)該種子文件的變異無法有效地對(duì)JIT進(jìn)行模糊測試,將會(huì)拋棄該種子文件。當(dāng)一個(gè)JIT種子文件抵達(dá)了新的樁,成功執(zhí)行了JIT優(yōu)化,并且有較短的運(yùn)行時(shí)長后,該種子文件將會(huì)被設(shè)置一個(gè)較高的優(yōu)先級(jí)放入變異隊(duì)列中。2.3?變異變異會(huì)選擇一個(gè)JIT種子文件,在不改變其中間語言結(jié)構(gòu)的情況下,重新生成中間語言中可替換的變量,產(chǎn)生新的測試樣本。使用該方法的原因是觸發(fā)JIT優(yōu)化每個(gè)階段的條件和每一條JIT優(yōu)化的JavaScript語句都有較大的關(guān)系。如果如Fuzzilli在每次變異進(jìn)行插入、合并等細(xì)粒度較大的變異操作,將會(huì)大幅修改測試樣本結(jié)構(gòu),從而改變已觸發(fā)的JIT優(yōu)化階段,導(dǎo)致盲目地對(duì)JIT優(yōu)化階段進(jìn)行模糊測試。而本方法保持了中間語言結(jié)構(gòu),并在此之上進(jìn)行的變異能大概率確保觸發(fā)的測試樣本的JIT優(yōu)化階段和JIT種子文件的JIT優(yōu)化階段相同,從而能更深入地探索JIT優(yōu)化階段,以達(dá)到更高的覆蓋率。種子文件的能量分配規(guī)則類似主流的模糊測試工具。但對(duì)于優(yōu)化函數(shù)內(nèi)部和外部的能量分配和變異方式卻是不同的。每次對(duì)一個(gè)種子文件進(jìn)行變異會(huì)執(zhí)行數(shù)次基于中間語言的變異操作,每次操作在優(yōu)化函數(shù)內(nèi)部的概率會(huì)大于在外部的概率。在JIT優(yōu)化函數(shù)內(nèi)部會(huì)采用保留中間語言結(jié)構(gòu)的變異方式,而在優(yōu)化函數(shù)外部則會(huì)細(xì)粒度大的變異方式。03實(shí)現(xiàn)本節(jié)會(huì)分別敘述本模糊測試工具實(shí)現(xiàn)上較為核心的幾個(gè)部分。3.1?中間語言中間語言是一種抽象的操作,本方法定義了如LoadProperty,StoreElement,CallMethod,BeginIf等中間語言,中間語言需要盡可能涵蓋JavaScript的各種語言特征,如變量聲明、賦值語句、一元操作符、二元操作符、函數(shù)調(diào)用、方法調(diào)用、創(chuàng)建對(duì)象、控制流等,如圖4所示。在生成中間語言后,對(duì)其逐條分析其上下文環(huán)境,從已有的上下文容器中獲取合適的變量,然后再分析該條中間語言生成的返回值變量,將其存入上下文容器中,最終提升為JavaScript語句。圖4?中間語言描述3.2?上下文容器系統(tǒng)需要知道每一條中間語言執(zhí)行后,上下文變量的情況,來確保語義的正確性。通過維持一個(gè)容器,在分析中間語言的過程中實(shí)時(shí)地將上下文變量存儲(chǔ)在容器中。容器中存儲(chǔ)著JavaScript內(nèi)置的構(gòu)造器對(duì)象,也會(huì)將全局變量和局部變量存儲(chǔ)其中。在逐條分析中間語言時(shí),當(dāng)遇到if-else、for循環(huán)、函數(shù)聲明等會(huì)產(chǎn)生新作用域的中間語言,會(huì)生成一個(gè)新的域環(huán)境,在新作用域中生成的變量會(huì)被存儲(chǔ)在新域環(huán)境中。當(dāng)退出該作用域時(shí),會(huì)將該域環(huán)境以及其中的變量全部刪除。容器同時(shí)為系統(tǒng)提供獲取當(dāng)前上下文環(huán)境下各種類型的變量接口。3.3?變量每一個(gè)變量都繼承于Variable類,該類包含了變量名、類型、方法、屬性、原型鏈和函數(shù)簽名。在JavaScript中的內(nèi)置類型有許多,本方法將其分類為基礎(chǔ)的Undefined、Int、Float、String、Object、Boolean、Function、Constructor。另外針對(duì)Object對(duì)象再根據(jù)不同的構(gòu)造器劃分,包含Symbol、Map、Set、ArrayBuffer等。每一種類型都存儲(chǔ)了屬性名和方法名以及原型鏈的上一個(gè)對(duì)象指針。對(duì)于內(nèi)置對(duì)象的方法或者自定義的函數(shù),會(huì)存儲(chǔ)定義方法所需參數(shù)和返回值的類型作為函數(shù)簽名,以便在調(diào)用方法時(shí)準(zhǔn)確地從上下文容器中取出可用的變量。值得注意的是,在調(diào)用方法的過程中,需要考慮原型鏈的規(guī)則,優(yōu)先尋找當(dāng)前對(duì)象的方法是否被定義,然后是構(gòu)造器的方法是否被定義,再尋找內(nèi)置的方法。如果沒有則去尋找原型鏈上一個(gè)對(duì)象的構(gòu)造器方法直至到達(dá)原型鏈頭節(jié)點(diǎn)。如圖5所示,定義了JavaScript中Array的內(nèi)置方法,在該對(duì)象中,鍵名對(duì)應(yīng)著方法名,值對(duì)應(yīng)著參數(shù)列表的類型,數(shù)組最后一項(xiàng)為返回值類型。圖5?系統(tǒng)對(duì)JavaScript內(nèi)置方法的描述
3.4?程序執(zhí)行生成測試樣本算法如圖6所示。圖6?生成測試樣本算法
模糊測試對(duì)于運(yùn)行效率有著很高的要求,所以系統(tǒng)應(yīng)盡可能提高運(yùn)行效率。系統(tǒng)的限速瓶頸在于JavaScript代碼的執(zhí)行時(shí)長,故參考了AFL的思路,使用了ForkServer來節(jié)約進(jìn)程的創(chuàng)建開銷。系統(tǒng)架構(gòu)如圖7所示,模糊測試系統(tǒng)在選擇了一個(gè)種子文件后會(huì)進(jìn)行變異并生成JavaScript測試樣本,而在另一處,F(xiàn)orkServer在解釋執(zhí)行JavaScript代碼前等待信號(hào),接收到信號(hào)后fork進(jìn)程執(zhí)行樣本,獲得結(jié)果并統(tǒng)計(jì)執(zhí)行結(jié)果(崩潰、運(yùn)行錯(cuò)誤、超時(shí)、運(yùn)行成功)。圖7?系統(tǒng)運(yùn)行模糊測試流程04測試與分析本模糊測試工具JITFuzz使用Python3開發(fā),實(shí)現(xiàn)生成種子文件和變異功能,F(xiàn)orkServer和執(zhí)行結(jié)果統(tǒng)計(jì)使用C語言編寫。4.1?實(shí)驗(yàn)指標(biāo)采用成功率、超時(shí)率、JIT成功率、JIT覆蓋率作為評(píng)價(jià)本模糊測試系統(tǒng)的主要指標(biāo),描述如下。成功率:執(zhí)行成功的測試樣本數(shù)量/測試樣本總數(shù)。超時(shí)率:執(zhí)行超時(shí)的測試樣本數(shù)量/測試樣本總數(shù)。JIT成功率:執(zhí)行成功并成功觸發(fā)JIT優(yōu)化的測試樣本數(shù)量/測試樣本總數(shù)。JIT覆蓋率:抵達(dá)的樁的數(shù)量/JIT編譯器的樁的總數(shù)。4.2?實(shí)驗(yàn)結(jié)果圖8?測試樣本成功率和超時(shí)率統(tǒng)計(jì)如圖8所示,說明本方法采用了基于中間語言的生成和變異算法,并考慮了上下文和變量特性,有效地提升了測試樣本的JavaScript語義正確性,能夠生成正確性更高的測試樣本。考慮在所有測試樣本中,成功觸發(fā)JIT優(yōu)化的比例,統(tǒng)計(jì)結(jié)果如圖9所示,JITFuzz相比CodeAlchemist、DIE、Fuzzilli都有更高的JIT成功率。這說明本方法采用生成JIT種子文件和基于中間語言結(jié)構(gòu)的變異方法所產(chǎn)生的樣
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《骨腫瘤x線表現(xiàn)》課件
- 《城市工程改造倫理》課件
- 合伙開臺(tái)球廳合同協(xié)議書
- 《顯像管電路-習(xí)題》課件
- 2025年淮安貨運(yùn)資格證考題
- 2025年寧德貨運(yùn)從業(yè)資格證模擬考試題
- 2025年成都貨運(yùn)從業(yè)資格證考題500道題
- 2025年南京貨運(yùn)從業(yè)資格試題答案解析
- 第七單元 語文園地七-人教部編版(含答案)
- 醫(yī)院建設(shè)變更協(xié)議
- PICC和CVC規(guī)范化維護(hù)及注意事項(xiàng)
- 人教部編版三年級(jí)上冊(cè)語文【選擇題】專項(xiàng)復(fù)習(xí)訓(xùn)練練習(xí)100題
- 停車場車牌識(shí)別道閘系統(tǒng)施工安裝
- 巴以沖突課件
- 法定代表人身份證明書-模板
- 酒店監(jiān)控室管理制度
- 工程部研發(fā)部KPI績效考核指標(biāo)匯總(定性)
- 光伏斜屋頂計(jì)算書屋頂光伏電站項(xiàng)目荷載計(jì)算書
- 新蘇教版四年級(jí)上冊(cè)科學(xué)第三單元《常見的力》全部課件(含4課時(shí))
- 建筑垃圾再生利用方案PPT模板
- 醫(yī)用氧氣使用檢查記錄表
評(píng)論
0/150
提交評(píng)論