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

?

基于執(zhí)行域敏感屬性圖的指針類漏洞檢測

2024-11-29 00:00:00陶韜王偉杰唐成華
電腦知識與技術 2024年27期

摘要:針對同內存空間操作的多指針變量關系和跨函數(shù)調用的指針特征,文章提出一種基于執(zhí)行域敏感屬性圖的指針類漏洞檢測方法。文章采用語法、控制流、指針關系和函數(shù)調用來刻畫程序及其指針變量的執(zhí)行過程并構建執(zhí)行域敏感屬性圖,聚焦于指針行為特征及與內存域的聯(lián)系,通過圖遍歷得到與指針類漏洞相關的節(jié)點與邊,并基于漏洞特征實現(xiàn)指針類漏洞的檢測。實驗結果表明,提出的方法在漏洞發(fā)現(xiàn)的準確率、誤報率和漏報率上均有較好表現(xiàn),為執(zhí)行域敏感屬性應用于軟件漏洞檢測提供了新的可靠途徑。

關鍵詞: 指針漏洞;指針依賴;函數(shù)調用;敏感屬性圖;漏洞檢測

中圖分類號:TP393.08 文獻標識碼:A

文章編號:1009-3044(2024)27-0004-04

0 引言

由錯誤使用內存所引發(fā)的安全漏洞是軟件開發(fā)的安全隱患之一,主要涉及對內存管理的錯誤或不當使用。常見的內存相關漏洞包括緩沖區(qū)溢出、已釋放內存重用、內存泄漏等,通常發(fā)生在程序未正確驗證輸入數(shù)據(jù)的長度或類型,導致數(shù)據(jù)超過分配的內存空間或者內存數(shù)據(jù)被篡改,并可能被攻擊者利用來執(zhí)行任意代碼、繞過安全檢查、拒絕服務等。典型的如微軟披露的涉及25個嚴重內存分配漏洞的家族“BadAl?loc”,源于易受攻擊的內存功能相關的指針使用,攻擊者可以利用這些漏洞繞過安全控制,以執(zhí)行惡意代碼或導致系統(tǒng)崩潰。深信服科技《2022漏洞威脅分析報告》指出[1],漏洞數(shù)量持續(xù)增長,由漏洞引發(fā)的主要威脅有未授權的信息泄露和管理訪問權限獲取,網(wǎng)絡攻擊趨于破壞性攻擊。Fortinet《2023上半年全球威脅態(tài)勢報告(1H 2023 Global Threat Landscape report) 》指出[2],過去五年間檢測到特定漏洞被利用次數(shù)增加了68%,潛在威脅者往往使用轉入捕獲技術攔截用戶輸入以非法竊取憑據(jù)信息或通過在內存中查找憑據(jù)并收集數(shù)據(jù)。在眾多漏洞類型中,與內存相關漏洞的危害性不容小覷,其中,“釋放后重用”(Use-After-Free) 更是成為2023年CWE TOP 5之一。

鑒于軟件開發(fā)中的安全左移原則,靜態(tài)分析在檢測指針類漏洞方面已取得一定成果,其判定依據(jù)主要包括數(shù)據(jù)流分析中指針的位置與精度以及內存數(shù)據(jù)的變化情況。然而,當前方法仍面臨諸多挑戰(zhàn)。一方面,由于與內存相關聯(lián)的多指針變量之間的復雜關系由內存區(qū)域決定,若多個指針對同一內存空間進行操作,簡單的別名分析方法難以準確判定指針間的實際關系,從而可能導致漏洞的誤報或漏報[3]。另一方面,靜態(tài)分析指針類漏洞的過程需跨越函數(shù)或過程的界限,全面考慮函數(shù)調用時參數(shù)與其他變量的相互影響、內存共享以及指針運算時的內存指向信息,否則將忽略過程間行為或上下文信息,降低漏洞檢測的準確性。

1 基于執(zhí)行域敏感屬性圖的漏洞檢測模型

基于代碼屬性圖(CPG) 的生成[4],通過指針關系依賴和函數(shù)調用等子圖構建執(zhí)行域敏感屬性圖并用于指針類漏洞檢測的模型(EDSPG) ,如圖1所示。首先,構建源代碼的執(zhí)行域敏感屬性圖,包含多個角度檢測漏洞所需的語義信息,其關鍵在于通過定義指針與內存區(qū)域之間的抽象關系和函數(shù)調用的規(guī)則[5],旨在獲取指針變量之間基于內存區(qū)域的精確聯(lián)系,并用于構建屬性圖的指針關系子圖和函數(shù)調用子圖。其中,前者通過指針變量所分配的內存域體現(xiàn)它們之間的關系,并用于刻畫程序的執(zhí)行過程,尤其是涉及指針變量的部分。其次,建立基于特定標簽或屬性的遍歷規(guī)則,用于指導沿圖的邊和節(jié)點的移動策略,目的在于獲得與指針類漏洞相關的部分,該過程涉及識別和跟蹤關鍵的節(jié)點和邊,用于漏洞的準確定位。第三,基于漏洞特征建立漏洞判定規(guī)則,基于漏洞的特征形式化描述,針對執(zhí)行域敏感屬性圖實現(xiàn)指針類漏洞的檢測。

執(zhí)行域敏感屬性圖展示了程序相關語義和執(zhí)行流程,包括運行時為指針分配的動態(tài)內存域以及指針指向的內存域變化。圖的結構由源代碼抽象語法樹、程序控制流圖、指針關系依賴圖和函數(shù)調用圖聚合而成,聚焦于指針的行為特征及與內存聯(lián)系,并用于檢測指針類漏洞。

2 指針關系依賴圖

指針描述內存單元的地址,指針變量間的關系體現(xiàn)指針所指向內存的關聯(lián)性。采用基本變量的數(shù)據(jù)流分析方法不能有效檢測出由內存狀態(tài)引發(fā)的漏洞。因此,建立面向指針變量的抽象內存模型,通過記錄程序路徑中各個程序點的指針變量并形成相應的抽象內存模型記錄,以獲得指針變量與內存的關聯(lián),進而通過分析抽象內存模型獲得指針之間的依賴關系,構建指針關系依賴圖。

定義1 指針抽象內存模型可描述為Mp=。其中,Var表示指針變量名稱;Type表示指針變量定義的類型;Region表示指針變量關聯(lián)的抽象內存區(qū)域屬性,描述為(typex,byte,offset),這里typex為指針指向抽象內存區(qū)域的唯一編號,byte表示指針變量指向內存區(qū)域占用的字節(jié)數(shù);offset表示指針的偏移量;Scope表示指針變量的作用域;State代表指針變量的狀態(tài);LineN為代碼行號。

定義2 指針運算是包含指針和地址的操作,用于對表達式左值的指針賦值,可描述為pointer opera?tion ::= p+offset| array+offset| array[j]+ offset。

指針運算的形式包括指針變量對于分配基本變量類、數(shù)組類、數(shù)組元素類等內存后的偏移量運算等。每種運算形式可能會改變左值變量指針指向的內存域,從而導致左值指針變量的指針抽象內存模型發(fā)生變化。

通過定義指針抽象內存模型以及指針運算,可得到程序中具體指針變量的六元組及指針變量指向內存的狀態(tài)變化。圖2為一段能引發(fā)Use-After-Free漏洞的代碼實例,可用定義第2行指針變量q,用 表示第3行狀態(tài)更新后的指針變量q,用定義第7行指針變量p,使用公式np=p+offset計算第8行的op()操作,形如(np:p) = (p:q)+(offset:0),可將指針變量p的指針抽象內存模型更新為,計算出指針變量p 和q 指向同一塊內存區(qū)域int1,為指針變量p 和q之間依賴關系的定義提供條件。

為了捕獲指針變量基于內存域的聯(lián)系,通過抽象內存模型獲取指針變量分配的內存域信息,并基于指針運算規(guī)則更新抽象內存模型六元組以更新指針變量指向內存域的變化信息。通過抽象內存模型六元組描述指針變量的依賴關系,基于指針變量的依賴關系建立指針關系依賴圖。

3 函數(shù)調用圖

通過函數(shù)調用圖獲得本體函數(shù)到被調用函數(shù)的可達路徑,實現(xiàn)跨函數(shù)的路徑分析。當變量的值取決于其他函數(shù)的輸出時,通過追蹤這些依賴關系,可準確地獲取這些變量的信息,提高代碼分析的精度。在源代碼抽象語法樹中,一個函數(shù)體內調用的其他函數(shù)方法被表示為這個函數(shù)體形成的源代碼抽象語法樹中的一個節(jié)點,它對應于被調用函數(shù)的源代碼抽象語法樹的根節(jié)點。因此,基于源代碼抽象語法樹,合并同名方法的函數(shù)調用節(jié)點和函數(shù)定義節(jié)點,形成函數(shù)調用邊并最終得到函數(shù)調用圖。

圖2漏洞代碼實例的函數(shù)調用圖構建過程如圖3 所示。首先遍歷函數(shù)體內調用函數(shù)類型的節(jié)點,主函數(shù)中調用了名為op的函數(shù),表現(xiàn)為主函數(shù)的源代碼抽象語法樹中有一個類型為“FunctionExpression”的名為op的節(jié)點,再遍歷找到根節(jié)點與其同名的源代碼抽象語法樹,添加一條函數(shù)調用邊將主函數(shù)調用語句節(jié)點與被調用函數(shù)根節(jié)點連接。

4 執(zhí)行域敏感屬性圖及其遍歷

執(zhí)行域敏感屬性圖由源代碼抽象語法樹、程序控制流圖、指針關系依賴圖和函數(shù)調用圖取并集建立,Computer Knowledge and Technology 電腦知識與技術第20 卷第27 期 (2024 年9 月)不同子圖表示不同的代碼語義信息。對執(zhí)行域敏感屬性圖遍歷,是按一定的規(guī)則檢索圖中節(jié)點和邊,即從任一節(jié)點或邊開始,匹配屬性和邊的類型,沿邊正向或者逆向搜索到與之相鄰的下一組節(jié)點或邊,終止于符合條件的節(jié)點或邊。

圖2 代碼實例在執(zhí)行printf 函數(shù)時引發(fā)Use-After-Free 漏洞,其中,指針變量q和p、malloc 函數(shù)、free函數(shù)等構成漏洞的詞法特征。實際上,與指針類漏洞相關的詞法特征包括指針變量與指針運算符、內存分配函數(shù)(如malloc、calloc、realloc、new等)、內存釋放函數(shù)(如free、delete等)、內存區(qū)域操作行為運算符等。將漏洞的詞法特征定義為敏感因子s,它是漏洞出現(xiàn)的必要條件。由于屬性圖節(jié)點由源代碼抽象語法樹節(jié)點構成,因此屬性圖包含源代碼抽象語法樹的全部信息,這些信息可以描述程序的詞法和語法結構信息,通過語法結構找到漏洞敏感因子。

圖2代碼實例漏洞的出現(xiàn)依賴于對指針變量分配內存的操作、對指針指向的內存區(qū)域進行操作以及釋放指針所指向內存的操作等3個關鍵語法特征。因此,與指針類漏洞相關的語法特征包括為指針變量分配內存的語句、釋放所分配內存的語句、內存區(qū)域操作的語句等。顯然,漏洞的語法特征包含了漏洞敏感因子。將包含敏感因子的語句定義為漏洞敏感點Ns。

除了漏洞敏感點,還需分析其語義特征才能判定是否存在漏洞。在圖2代碼實例中,因為op函數(shù)為指針變量q分配內存后進行了釋放內存的操作,之后又通過指針p訪問了該內存域,表現(xiàn)為程序中存在漏洞敏感點,且漏洞敏感點按一定順序執(zhí)行。這一特征構成了Use-After-Free漏洞的語義特征,稱為漏洞約束,記為R。

定義3 漏洞特征C 可描述為C(VType)={Ns, R}。其中:VType為漏洞類型;Ns為漏洞敏感點;R為漏洞約束。

定義3 具有性質{Prog}CVType{VulVTypeProg},即對于程序Prog,若滿足漏洞類型VType的漏洞特征CVType,則Pro47e50379a2c962015116d6ddba14844fdd3255a9cd178e1706c29192168fd77fg存在狀態(tài)為VulVTypeProg,類型為VType的漏洞。

5 實驗結果與分析

實驗選取C/CPP 的Juliet Test Suite for C/C++ 1.3 作為測試數(shù)據(jù)集,選取CWE-401(Memory Leak) 、CWE-415(Double-Free) 、CWE-416(Use-After-Free) 和CWE-762(Mismatched Memory Management Rou?tines) 4種指針類漏洞用于測試。使用Cloc工具獲得數(shù)據(jù)集信息如表1所示。

將本文方法EDSPG 與Cppcheck[6]、Flawfinder[7]、Splint[8]、MRVDAVE[9]、CPG等模型進行對比,采用誤報率FPR、漏報率FNR和準確率Acc作為評估指標。

用不同檢測方法對數(shù)據(jù)集開展漏洞檢測實驗,其中與CWE-416漏洞有關的檢測情況如表2所示,表中,DVN為相應方法或模型檢測出的漏洞數(shù)量,DVT 為檢測出的正確漏洞數(shù)量,DVF為誤報漏洞數(shù)量。針對CWE-416 漏洞,Cppcheck 和Flawfinder 出現(xiàn)100% 誤報率,主要因為Cppcheck專注語法和代碼質量檢查,不能深入分析內存使用的狀態(tài)變化,而Flawfinder 基于文本搜索和模式匹配,無法理解內存生命周期。相比之下,MRVDAF和EDSPG方法通過內存分配、使用及釋放等語義規(guī)則,能更準確地追蹤和理解內存周期,均提高了正確漏洞識別的數(shù)量。

誤報率情況如圖4所示。由于Cppcheck和Flaw?finder不進行數(shù)據(jù)流深度分析,檢測存在較高誤報率。Splint雖然增加了語義分析,但誤報率也較高。而具有數(shù)據(jù)流分析能力的MRVDAF和聚合了多種層次語義的聯(lián)合圖結構的CPG,誤報率均較低。EDSPG構建了指針變量之間的關系依賴邊,表達了更為精確的指針變量關系語義,同時基于執(zhí)行域敏感屬性圖對這4 種漏洞類型進行形式化描述,在指針類漏洞檢測上具有更低的誤報率。

漏報率情況如圖5所示。Cppcheck和Flawfinder 由于沒有涉及語義分析,對于含較復雜語義程序的漏報率很高。Splint只匹配了基本程序語義,對于深層程序行為無法分析,導致漏報率也較高。MRVDAF因為定義了漏洞的形式化信息并用于程序分析,較低了漏報率。CPG由于結構是單一函數(shù)且缺少過程間分析,導致漏報率偏高。EDSPG通過關系依賴邊獲得指針變量的精確語義,并具備程序過程間分析,實現(xiàn)了更低的指針類漏洞漏報率。

準確率情況如圖6所示。在需要語義分析的漏洞中,Cppcheck和Flawfinder均無法準確檢測出漏洞,僅依賴數(shù)據(jù)流分析的Splint和依賴各層圖語義的CPG在漏洞檢測準確性上表現(xiàn)不佳。MRVDAF在數(shù)據(jù)流分析的基礎上增加了漏洞的形式化信息,提升了漏洞檢測準確率。EDSPG方法包含了與指針有關的行為信息,通過定義圖的遍歷與指針的行為描述,實現(xiàn)了較為全面的基于模型的漏洞分析,進一步提升了漏洞檢測準確率。

6 結束語

不同漏洞類型蘊含不同的特征,本文提出基于執(zhí)行域敏感屬性圖的指針類漏洞檢測方法,通過分析指針與內存關系,定義模型的子圖并使方法具備過程間分析的能力。實驗表明,EDSPG在Juliet數(shù)據(jù)集上對于4種指針類漏洞的檢測能力更好,漏洞檢測的準確率上升,誤報率與漏報率降低。由于本文未考慮指向函數(shù)的指針變量情況,某些特殊的調用過程是通過函數(shù)指針調用并引發(fā)漏洞問題,且本文提出模型未考慮程序路徑的可達性問題。下一工作,將進一步完善指針規(guī)則描述和可達性判斷,提升方法的有效性。

參考文獻:

[1] Sangfor. 2022 漏洞威脅分析報告[EB/OL]. [2023-11-16]https://www.sangfor.com.cn/document/.

[2] FORTINET. FortiGuard Labs 1H 2023 Global Threat Land?scape Report[EB/OL]. [2023-09-28] https://www.fortinet.com/demand/gated/threat-report-1h-2023.

[3] JIN W H,ULLAH S,YOO D,et al.NPDHunter:efficient null pointer dereference vulnerability detection in binary[J]. IEEE Access,2021,9:90153-90169.

[4] YAMAGUCHI F,GOLDE N,ARP D,et al.Modeling and discov?ering vulnerabilities with code property graphs[C]//2014 IEEE Symposium on Security and Privacy.May 18-21,2014,Berkeley,CA,USA.IEEE,2014:590-604.

[5] 陳濤清,范廣生,尹幫虎,等.基于抽象解釋的函數(shù)內聯(lián)過程間分析優(yōu)化方法[J].軟件學報,2022,33(8):2964-2979.

[6] Cppcheck-2.12[CP/OL]. [2023-09-10] http://cppcheck.source?forge.net.

[7] Flawfinder-2.0.19[CP/OL].[2023-09-06]https://www.dwheeler.com/flawfinder.

[8] Splint-3.1.2[CP/OL]. [2023-9-6] https://www.splint.org.[9] HU J C,CHEN J F,ZHANG L,et al.A memory-related vulner?ability detection approach based on vulnerability features[J].Ts?inghua Science and Technology,2020,25(5):604-613.

【通聯(lián)編輯:代影】

基金項目:國家自然科學基金(項目編號:62062028) ;廣西可信軟件重點實驗室基金(項目編號:202320) ;廣西研究生教育創(chuàng)新計劃項目(項目編號:YCSW2023295)

汕尾市| 修文县| 喀什市| 盘山县| 连山| 梁平县| 孝义市| 龙陵县| 象山县| 石阡县| 太谷县| 许昌县| 施秉县| 应用必备| 新沂市| 集贤县| 苏州市| 沭阳县| 晋城| 甘洛县| 龙川县| 普安县| 汕头市| 磐石市| 墨竹工卡县| 台南市| 白河县| 河源市| 北京市| 天等县| 邯郸市| 六安市| 安国市| 寻乌县| 新龙县| 长子县| 葫芦岛市| 叶城县| 玛曲县| 右玉县| 乌拉特前旗|