999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于污點分析的二進制程序漏洞檢測系統設計與實現*

2023-12-13 11:43:46羅治祥李樂言
網絡安全與數據管理 2023年11期
關鍵詞:程序分析檢測

羅治祥,向 棲,李樂言,3

(1.工業和信息化部電子第五研究所,廣東 廣州 511370;2.東北大學 軟件學院,遼寧 沈陽 110819;3.智能產品質量評價與可靠性保障技術工業和信息化部重點實驗室,廣東 廣州 511370)

0 引言

近年來,隨著計算機技術的不斷發展,軟件行業迅速發展,軟件的體量、種類不斷增大。同時,由于程序代碼編寫不規范,編寫過程存在疏忽,或者缺乏軟件安全方面的意識等,導致軟件的安全性承受巨大威脅。針對這一現狀,構建漏洞檢測系統對軟件進行安全檢測是最行之有效的辦法之一,可在一定程度上發現并且及時消除潛在的漏洞。

軟件的安全檢測方法通常可以分為動態測試[1]和靜態分析[2]兩大類,靜態分析這一方法相較于動態測試具有更高的覆蓋率以及性能效率。現有的靜態分析方案大多都基于源碼級別[3]進行分析,雖然可以在比較高的程度上滿足軟件安全需要,但是在許多真實的安全測試場景中,需要分析對象大多屬于常見的二進制文件,比如商業軟件、車機固件、嵌入式系統固件等。此時安全研究人員難以獲得相應的源代碼,源碼級靜態分析方案不再適用。現今商業化的二進制程序漏洞分析系統基本不具備可二次開發的擴展性,而開源的二進制程序漏洞分析系統,比如 angr[4]、 BAP[5]、 BinAbsInspector等優秀的靜態分析工具存在一些適用性問題。其中,angr 和 BAP 正逐步發展為通用分析框架,而不僅僅專注于二進制漏洞掃描,這使得內部分析算法變得復雜,不便于后續的擴展和優化。BinAbsInspector是基于Ghidra的插件,使用Java編寫開發,提供的API比較有限,在可擴展性上有所欠缺,普通的二進制安全研究員無法有效地基于該工具進行自定義開發。因此,構建一款在性能和可擴展性上較為突出,同時也滿足于真實場景需要的二進制程序漏洞檢測系統刻不容緩。

針對上述問題,Tan[6]等基于Java提出了一種較為簡易的指針分析[7]算法,該算法在使用Datalog[8]引擎支撐之后,在構建好的程序抽象數據上進行分析,使得性能得到較大的提升。對于獲取二進制程序抽象數據而言,普遍的做法是反編譯[9]二進制程序生成IR中間表示,進一步對其進行優化和轉換得到其AST語法樹,最后依據AST語法樹得到程序抽象數據,比較好的工具有IDA Pro、Ghidra、Binary Ninja等。本文設計系統選取了IDA Pro進行程序抽象數據獲取,使用IDA Pro特有的IDAPython,從原生角度適配了IDA Pro提供各項API接口,從可擴展性上兼具了Python腳本跨平臺、易擴展等優點;從性能方面,Python庫中的pyDatalog可以替代常見的Datalog引擎,且性能方面相差無幾。

1 方案設計

1.1 本文研究工作

本文將以污點分析為基礎,對IDA Pro中插件Hex-Rays反編譯時的語法樹AST中相關的變量賦值、函數調用等進行抽象解析,使之成為特定的數據結構。隨后使用Datalog對抽象之后的數據進行指針分析,在此基礎上加入污點分析,通過Datalog得到相關指針結果,依據用戶提供的污點source和定義的sink,結合緩沖區溢出[10]、格式化字符串[11]、堆內存使用不當等漏洞的特征,進一步檢測出二進制程序中的漏洞。由于依賴的底層數據是基于Hex-Rays反編譯出的語法樹,因此是否支持不同架構的二進制程序只會取決于Hex-Rays是否能夠對該架構程序進行反編譯。此外由于使用Datalog進行污點分析,其效率和準確度也會得到相應提高。綜上所述,本論文基于污點分析,結合Hex-Rays反編譯的語法樹以及Datalog對二進制程序進行漏洞檢測,更加具有應用價值和研究意義。

1.2 系統架構

依據上述的程序語言以及邏輯構思,本系統構建的整體數據流程業務如圖1所示。

圖1 系統架構圖

本系統采用C/S架構,并且以MVC設計模式進行設計,設計的系統架構如圖2所示,由上至下系統主要分為用戶交互層、數據處理層、指針/污點分析層、業務處理層四個主要層次。

圖2 系統架構圖

在用戶交互層中,依據IDA Pro提供的各種接口,利用IDAPython結合PyQt進行界面開發,旨在提供一個對用戶友好的界面處理。該視圖控制層中的主要功能有漏洞模式配置,用來選取漏洞分析模式以及管理污點數據庫。還有審閱界面,當分析完成時,可以在此界面對漏洞報告進行查看、導出,以及污點路徑的相關審閱工作。

在數據處理層中,將對程序進行一些預處理工作,獲取程序對應的語法樹方便后續進行分析。然后還需要對程序代碼進行數據抽象處理,分為New/Assign等多種數據,將程序解析成能夠使得數據分析引擎進行分析的各項數據。最后需要對這些程序代碼抽象出來的數據進行存儲。

指針/污點分析層是主要的漏洞分析模塊,獲取上述得到的程序代碼抽象數據,然后依據編寫的Datalog程序對程序抽象后的各類數據進行指針/污點分析,最終輸出相關的分析結果。

業務處理層主要依據指針/污點分析層得到的相關分析結果,建立相關的漏洞模式,依據漏洞模式的相關規則,嘗試檢測出漏洞,最后導出相關漏洞報告。針對污點數據Sources/Sinks處理,該層提供顯示污點路徑以及污點路徑表格化展示功能。

1.3 算法整體設計

1.3.1 功能模塊設計

本系統的功能模塊設計如圖3所示,主要包括程序輸入模塊、程序預處理模塊、污點分析模塊、漏洞檢測模塊四個部分。

圖3 功能模塊設計圖

1.3.2 詳細設計

(1)程序輸入模塊

在該模塊中,主要的功能為在IDA Pro中導入二進制程序文件,選取漏洞分析模式,配置污點數據庫Sources/Sinks。其中漏洞分析模式主要有如下三種:

① 漏洞分析模式

該模式將會自動分析當前二進制程序文件,依據指針分析結果和相關的漏洞模式來尋找漏洞,并且提供漏洞分析報告析。

② 僅Source分析

用戶可以在污點數據Sources/Sinks的管理界面使用下拉框選取污點數據。比如選取main函數中變量v1作為Source,均以數據下列框、按鈕等形式來選取。隨后即可進行污點分析,依據用戶給出的污點數據集合和指針分析結果,分析出污點數據可能的流向,并且提供相關的數據流報告。

③ Source/Sinks分析

用戶創建了對應的污點數據集合后,還可以選取用戶特定感興趣的函數放入Sinks集合中,比如選取main函數中的read函數作為Sink等。隨后開始進行污點分析,判斷在Sinks集合是否被污點數據污染,并且提供相關的污染報告。

(2)預處理模塊

該模塊的主要功能為獲取程序語法樹、程序數據抽象、抽象數據存儲。基于Tan[6]等提出指針分析算法改進的Datalog抽象數據規則算法如算法1所示。

算法1: Datalog抽象數據規則算法 1 New(x:V, o:O, m:M, c_x:C)2 Assign(x:V, y:V, c_x:C, c_y:C)3 Store(x:V, f:F, y:V, c_y:C)4 Load(y:V, x:V, f:F, c_y:C, c_x:C)5 Argument(l:S,i:N,ai:V,thisM:M)6 Parameter(m:M,i:N,pi:V)7 MethodReturn(m:M,ret:V)8 CallReturn(l:S,r:V,thisM:M)9 Methods(l:C,mName:M)10 VCall(l:S,x:V,k:M,thisM:M)

由于需要確定各個函數中對應的變量所指向對象,因此加入了thisM屬性來進行區分。

依據上述的數據抽象規則,使用IDAPython與IDA Pro提供的API進行交互,遍歷語法樹中所有可達函數,將對應的變量聲明、存儲、賦值、上下文等信息進行抽象,以csv格式保存在文件中。

(3)污點分析模塊

污點分析模塊中主要包含抽象數據存儲、指針分析、污點分析、指針分析結果存儲幾個功能。從文件中獲取到存儲的抽象數據之后,就可以按如下步驟進行分析。

① 指針分析

基于Tan[6]提出指針分析算法改進的Datalog指針分析規則算法如算法2所示。

算法2: Datalog指針分析規則算法 1 VarPointsTo( v:V,o:obj,c_var:C,c_obj:C,m:method).2 FieldPointsTo(Oi:obj,f:field,Oj:obj,c_Oi:C,c_Oj:C).3 Reachable(m:method).4 CallGraph(l:stmt,m:method,thisM:method).5 Reachable(m),CallGraph(l,m,thisM) <- VCall(l,m,thisM),Reachable(thisM).6 VarPointsTo(x,o,c_xo,c_xo,m) <- Reach-able(m),New(x,o,m,c_xo).7 VarPointsTo(x,o,c_x,c_o,m) <- Assign(x,y,c_x,c_y), VarPointsTo(y,o,c_y,c_o,m).8 VarPointsTo(y,Oj,c_y,c_Oj,m) <- Load(y,x,f,c_y,c_x), VarPointsTo(x,Oi,c_x,c_Oi,m), FieldPointsTo(Oi,f,Oj,c_Oi,c_Oj).9 FieldPointsTo(Oi,f,Oj,c_Oi,c_Oj) <- Store(x,f,y,c_y), VarPointsTo(x,Oi,c_x,c_Oi,m), VarPointsTo(y,Oj,c_y,c_Oj,m).10 VCall(l:stmt,m:method,thisM:method)11 Argument(l:stmt,i:number,ai:V,thisM:meth-od).12 Parameter(m:method,i:number,pi:V).13 Methods(label:C,mName:method).14 VarPointsTo(pi,o,label,c_o,m) <- Methods(label,m), CallGraph(l,m,thisM), Argument(l,i,ai,thisM), Parameter(m,i,pi), VarPointsTo(ai,o,c_ai,c_o,thisM).15 CallReturn(l:stmt,r:V,thisM:method).

將不再需要Tan[6]等提出的指針分析算法中的Dispatch/ThisVar變量,因為在反編譯得到的語法樹中,其函數名是唯一標識的,不存在相同的函數名稱。

由于Hex-Rays反編譯得到的語法樹較為復雜,所提供的API種類繁多,實際進行數據抽象的流程較為復雜,因此圖4展示的僅為數據抽象時的流程簡圖。

圖4 程序數據抽象流程簡圖

② 污點分析

同樣也是基于Tan[6]等提出指針分析算法改進的Datalog污點分析規則,對應有數據污染源Source(m:M),程序代碼關鍵關注點Sink(m:M,i:N),污染數據點Taint(l:S,t:T)。即把所有的污點數據產生點上下文`l:S′關聯到產生的污點數據tainted data,即t:T中。傳遞污點數據算法如算法3所示。

算法3: Datalog污點傳遞規則算法 1 VarPointsTo(r,t) <- CallGraph(l,m),Source(m),CallReturn(l,r),Taint(l,r).2 TaintFlow(j,l,i) <- CallGraph(l,m),Sink(m,i),Argument(l,i,ai),VarPointsTo(ai,t),Taint(j,t).

TaintFlow代表j點產生的污點數據在流向l點調用的函數,其參數位置為i。但是由于JAVA中一切即對象的思想,因此所有的函數過程傳遞都會用上污點傳遞,而在C中并不是很適合。所以,當指針分析結果中相關對象是被污染的對象,就將其加入到污點流動集合中。進而設計定義TaintVar(m:M,v:V),TaintVar依據用戶選定的污點數據集合進行構造,代表用戶選中函數m中的v變量作為污點Source。隨后依據污點數據集合,將對應變量指向的對象進行污染,方便后續進行指針分析時傳遞污點對象,具體設計如算法4所示。

算法4: Datalog污點對象流動算法 1 TaintObj(o:obj,c_obj:context,m:method)2 TaintObj(o,c_xo,m) <- Reachable(m),New(x,o,m,c_xo),TaintVar(m,x).3 TaintTranslate(v:var,c_v:context,o:obj,m:method)4 TaintTranslate(x,c_x,o,m) <- VarPointsTo(x,o,c_x,c_xo,m),TaintObj(o,c_xo,m).

通過TaintObj將對象進行污染,當指針分析結果中存在污點對象,則標注出對應指向污點對象的變量。在對應的IDAPython腳本中獲取到Sinks集合,判斷集合中調用的函數參數是否包含指向污點對象的變量即可。最后完成分析結果存儲工作,方便進行下一步的漏洞分析或者污點分析報告。

(4)漏洞檢測模塊

針對漏洞分析模塊通常需要設定一些常見漏洞模式,比如從IDA Pro提供的語法樹中獲取read函數列表,判斷調用read函數讀取字符時讀取數量是否大于當前緩沖區的大小,或者strcpy中的源字符串長度是否大于目標字符串長度等。

一旦緩沖區溢出、格式化字符串漏洞、堆內存使用不當等漏洞的模式規則被滿足,即生成對應格式的報告,以csv的格式展示,設計如表1所示。

表1 漏洞報告

在污點路徑顯示功能設計中,依據污點分析結果,以特定的格式生成對應的污點路徑表格,以便后續給用戶展示,設計如表2所示。

表2 污點路徑報告

如表2所示,能看出選中的污點對象Obj2在main函數中流經了b、c兩個變量,更加便于用戶著重分析污點數據的相關變更。最后將相關報告導出顯示完成所有的污點/漏洞分析。

2 系統測試與分析

2.1 測試環境

本文進行系統測試的測試環境如表3所示。

表3 系統測試環境

2.2 功能測試

本節將使用二進制程序漏洞檢測系統針對常見漏洞進行功能測試。在ubuntu20.04_x64平臺使用gcc_v9.4.0編譯代碼,使用命令為gcc ./test.c -o stackOverflow,得到程序stackOverflow,放入IDA Pro進行分析。

分析過程中在IDA Pro的輸出窗口會輸出過程數據,如圖5所示。點擊查看報告,如圖6所示。

圖5 分析過程輸出圖

圖6 棧溢出污點報告圖

其中v4-localObj污點對象流經了main.v4和vul.a1,符合程序的邏輯。切換分析模式,漏洞分析結果如圖7所示。

圖7 棧溢出漏洞報告圖

此外針對格式化字符串、二次釋放漏洞也進行了相關的測試,得到結果和棧溢出漏洞測試類似。

綜上所述,本節涉及的污點路徑探索測試、漏洞檢測測試,從整體上來說大致符合預期,能夠檢測出較為簡單的漏洞以及污點路徑。

2.3 性能測試

本文選取Juliet測試集,就x86、x64兩種架構與cwe_checker的測試結構進行比較對照。此外,由于本文實現的系統是漏洞檢測原型系統,在漏洞模式檢測上僅實現CWE-787、CWE-415、CWE-134三種CWE中指定函數造成的漏洞檢測,因此,本文從Juliet中隨機篩選了CWE-134中125個關于printf的格式化字符串漏洞,CWE-415中151個關于malloc-free的二次釋放漏洞,CWE-787中135個關于read函數的溢出寫漏洞測試用例進行測試。表4和表5展示的是x86和x64架構下的三種CWE的檢測能力與cwe_checker的對比結果,其中縮寫英文對應為VDT。本文實現的原型系統為vulDector,統計得到如圖8所示漏報率誤報率檢測對比統計圖。結果表明,本文設計的原型系統的性能測試結果在目前所支持的CWE類型上取得一定優勢。

表4 x86架構CWE檢測能力對比

表5 x64架構CWE檢測能力對比

圖8 ds x86/x64架構下的漏洞檢測漏報率/誤報率對比圖

3 結論

本文主要研究了基于污點分析的二進制程序漏洞檢測系統設計與實現,嘗試通過基于Hex-Rays反編譯的語法樹來進行指針分析,尋找漏洞以及實現污點路徑探索功能。

本文根據對目前二進制程序漏洞檢測系統的研究現狀的參考,首先確定了本系統的總體架構、數據業務流程,根據系統分析設計,對基于污點分析的二進制程序漏洞檢測系統進行實現。在實現過程中,采用IDAPython語言進行程序編寫,使用了Hex-Rays提供的相關接口,以及用于指針/污點分析的Datalog引擎pyDatalog。在系統實現之后,依據系統測試相關原理,使用簡單的漏洞代碼編寫的二進制程序對系統的各個功能模塊進行了測試。測試過程中,本系統實現的各個功能模塊能夠穩定運行并投入使用,檢測出較為簡單的棧溢出、格式化字符串、二次釋放等漏洞。

本文具有以下創新點:

(1)在Hex-Rays反編譯結果的基礎上進行指針/污點分析的相關研究還不是很多,在此基礎上實現完整可用的基于污點分析的二進制程序漏洞檢測系統。

(2)不同于使用Datalog進行C源代碼形式的指針/污點分析,本文使用Datalog對二進制源程序的語法樹形式進行指針/污點分析研究。

(3)本系統實現的編程語言全部為Python腳本,具有高度的可擴展性、兼容性、可移植性等。

系統實用性方面仍舊存在的不足:

(1)本系統的測試用例都是在Linux平臺下使用GCC進行編譯生成的,對于其他平臺是否適用還有待進一步檢驗。

(2)由于本系統只是依據程序中的一些數據結構以及函數調用等關系進行數據抽象,因此具備諸如循環、遞歸等復雜邏輯時的適用性有待檢驗。

(3)本系統暫時只實現了棧溢出漏洞、格式化字符串漏洞、二次釋放漏洞模式建立,適用范圍較小。后續將對基于污點分析的二進制程序漏洞檢測系統進行完善。

猜你喜歡
程序分析檢測
“不等式”檢測題
“一元一次不等式”檢測題
“一元一次不等式組”檢測題
隱蔽失效適航要求符合性驗證分析
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
電力系統不平衡分析
電子制作(2018年18期)2018-11-14 01:48:24
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
電力系統及其自動化發展趨勢分析
小波變換在PCB缺陷檢測中的應用
主站蜘蛛池模板: 热伊人99re久久精品最新地| 久久精品欧美一区二区| 欧美日在线观看| 精品久久久久久成人AV| 香蕉综合在线视频91| 国产欧美日韩专区发布| 一级毛片免费高清视频| 免费xxxxx在线观看网站| 中文字幕欧美日韩| 夜夜爽免费视频| 亚洲美女操| 女高中生自慰污污网站| 免费A级毛片无码无遮挡| 国内毛片视频| 国产超薄肉色丝袜网站| 成人午夜精品一级毛片| 亚洲人精品亚洲人成在线| 久久中文字幕2021精品| 欧美激情综合一区二区| 一本大道无码高清| 色精品视频| 日韩一级毛一欧美一国产| 国产精品网址在线观看你懂的| 亚洲一区二区精品无码久久久| 成人午夜免费观看| 成人在线天堂| 国产亚洲视频在线观看| 国产一区二区精品福利| 国产黄在线免费观看| 精品欧美日韩国产日漫一区不卡| 伊人无码视屏| 亚洲高清在线天堂精品| 亚洲男人天堂网址| 在线a网站| 免费在线a视频| 成人午夜亚洲影视在线观看| 毛片免费视频| 国产靠逼视频| 国产va欧美va在线观看| 999国产精品| 国产aⅴ无码专区亚洲av综合网| 国产91九色在线播放| 亚洲福利片无码最新在线播放| 这里只有精品免费视频| 国产午夜福利在线小视频| 国产一区二区人大臿蕉香蕉| 国产成人综合久久| 国产呦精品一区二区三区下载 | 久久久精品无码一二三区| 伊人激情综合网| 国产91在线|日本| 欧美成人精品高清在线下载| 成人午夜免费视频| 日本午夜精品一本在线观看| 日韩国产黄色网站| 97成人在线视频| 国产美女在线观看| 国产99欧美精品久久精品久久| 996免费视频国产在线播放| 91精品视频播放| 二级特黄绝大片免费视频大片| 亚洲中文无码h在线观看| 青青草国产一区二区三区| 在线精品自拍| 亚洲成在人线av品善网好看| 日韩成人在线网站| 亚洲a级在线观看| 欧美黄色网站在线看| 亚洲中文制服丝袜欧美精品| 国产一区二区三区精品欧美日韩| 国产91透明丝袜美腿在线| 日韩精品免费在线视频| 亚洲国产精品一区二区高清无码久久| 国产理论最新国产精品视频| 国产精品久久久久久搜索| 四虎精品国产永久在线观看| 精品自窥自偷在线看| 中文字幕在线播放不卡| 色婷婷啪啪| 乱系列中文字幕在线视频| 91午夜福利在线观看精品| 亚洲成人一区二区三区|