自動檢測軟件漏洞是一個引起學術(shù)界廣泛關(guān)注的重要問題,然而現(xiàn)有的漏洞檢測方法均無法達到實際應用所需的漏洞檢測能力和定位精度。本研究提出了一個基于深度學習的可以同時實現(xiàn)高檢測能力和高定位精度的漏洞檢測器VulDeeLocator。主要針對以下問題:如何容納跨文件中類型和宏定義之間的語義關(guān)系,如何容納精確的控制流和變量的定義-使用關(guān)系,以及如何實現(xiàn)高定位精度。VulDeeLocator采用兩個創(chuàng)新的想法解決了上述問題:(i)利用中間代碼來容納額外的語義信息,以及 (ii)使用粒度細化的概念來確定漏洞的位置。當應用到3個實際軟件產(chǎn)品中隨機選擇的200個文件時,VulDeeLocator檢測到18個漏洞。其中,16個漏洞對應已知漏洞;其他兩個未在美國國家漏洞庫( NVD) 中報告,但在發(fā)布新版本時已由 Libav 供應商默默修補。
該成果“VulDeeLocator: A Deep Learning-Based Fine-Grained Vulnerability Detector”于2022年發(fā)表在IEEE Transactions on Dependable and Secure Computing的第19卷4期上,是實驗室在軟件安全領(lǐng)域的研究成果。IEEE Transactions on Dependable and Secure Computing主要關(guān)注計算機及網(wǎng)絡安全、可信計算等領(lǐng)域的前沿研究,是中國計算機學會CCF推薦的A類期刊。
背景與動機
盡管學術(shù)界和工業(yè)界在不斷提高軟件質(zhì)量,在追求安全編程方面投入了大量精力,但軟件漏洞仍然廣泛存在,成為網(wǎng)絡攻擊的主要原因。消除漏洞的一種重要方法是設計漏洞檢測器來檢測它們,一個理想的漏洞檢測器應該同時具有高檢測能力和高定位精度,以精確定位包含漏洞的代碼行。
最近,基于機器學習的漏洞檢測器開始采用深度學習技術(shù),在程序切片級別檢測漏洞。這類漏洞檢測器可以緩解手動定義特征的問題,然而目前仍然不能提供較高的檢測能力和定位精度。目前先進的漏洞檢測器SySeVR不能提供較高的檢測能力,主要原因可以歸于以下兩點:①無法捕獲跨程序文件的語義相關(guān)語句之間的關(guān)系;②無法容納準確的控制流和變量的“定義-使用”關(guān)系。然而,這兩點原因均通過直接分析源代碼無法很好解決,由于目前基于深度學習的漏洞檢測器不能獲取足夠的語義信息,導致漏洞檢測效果不佳。
在定位精度方面,由于對程序切片進行操作,而一個程序切片可以有許多行代碼,因此即使在切片粒度上進行漏洞檢測,其定位精度也比較低。粗粒度漏洞檢測只是漏洞評估的一個前置步驟,不能精確定位漏洞。
設計與實現(xiàn)
為了解決上述問題,我們?yōu)镃語言源代碼軟件設計了一個基于深度學習的細粒度漏洞檢測器VulDeeLocator。VulDeeLocator的基本思想是充分利用程序分析和深度學習技術(shù):利用程序分析技術(shù)生成候選漏洞,利用深度學習技術(shù)消除程序分析引起的誤報。具體來說,VulDeeLocator根據(jù)給定的一組漏洞語法特征從程序源代碼中提取一些標記(例如標識符、運算符、常量和關(guān)鍵字),然后利用中間代碼來容納與這些標記相關(guān)語句的語義。這些語句被編碼成向量,作為訓練神經(jīng)網(wǎng)絡的輸入來進行漏洞檢測。測試階段的輸出比相應的輸入具有更細的粒度。
VulDeeLocator的結(jié)構(gòu)框架如圖1所示,可以使用特定的中間代碼表示和深度學習模型對其進行實例化。VulDeeLocator的輸入是用于學習神經(jīng)網(wǎng)絡的訓練程序源代碼或用于漏洞檢測的目標程序。具體來說,訓練階段的輸入包括C語言程序的源代碼,它可能包含漏洞也可能不包含漏洞。訓練使用的C語言程序的源代碼應滿足以下條件:①可以被編譯成中間代碼,如LLVM中間代碼;②含有漏洞的程序需附有對其漏洞位置的描述,這將用于定位程序中的漏洞。在較高層次上,VulDeeLocator包含兩個組件,第一個組件生成訓練程序和目標程序的中間代碼表示,第二個組件使用基于中間代碼的表示來進行細粒度漏洞檢測。
圖1 ?VulDeeLocator框架
在基于中間代碼的漏洞候選表征組件中,VulDeeLocator從輸入源代碼中提取sSyVC,sSyVC是根據(jù)某些漏洞語法特征從程序中提取的一段代碼。我們利用已知漏洞的語法特征,并通過程序源代碼的抽象語法樹來表示這些特征,具體來說,定義了以下四種漏洞語法特征:庫/API函數(shù)調(diào)用、數(shù)組定義、指針定義以及算術(shù)表達式。給定程序的源代碼,可以生成其抽象語法樹,通過識別與某些漏洞語法特征匹配的節(jié)點的類型和代碼,可以從中提取sSyVC。圖2(a) 展示了一個程序中sSyVC的示例(紅色矩形框部分)。在提取sSyVC后,VulDeeLocator會生成其中間表示(IR)切片iSeVC。具體來說,VulDeeLocator使用Clang編譯器為原程序文件生成IR文件,并根據(jù)依賴關(guān)系鏈接IR文件。通過從鏈接的IR文件中提取控制和數(shù)據(jù)依賴關(guān)系來生成依賴關(guān)系圖,根據(jù)sSyVC對依賴圖進行切片,即可得到IR切片。在生成iSeVCs的過程中,VulDeeLocator會考慮函數(shù)調(diào)用關(guān)系,根據(jù)控制依賴或數(shù)據(jù)依賴關(guān)系,盡可能保留屬于不同函數(shù)但彼此相關(guān)的語句。生成的iSeVC則是細粒度漏洞檢測的輸入。
圖2 ?sSyVC和iSeVC的生成示例
在細粒度漏洞檢測組件中,首先需要標注生成的iSeVC。VulDeeLocator按以下方式標注iSeVC:如果iSeVC包含已知漏洞,則會標記漏洞所在行號,否則,iSeVC會被標記為“0”,即不包含已知漏洞。由于漏洞數(shù)據(jù)集應提供源程序中間代碼中漏洞的位置,因此源程序中漏洞的這些行號需要映射到中間代碼中的行號,這可以通過利用調(diào)試信息附帶的文本LLVM文件來完成。標注完畢后,每個iSeVC都需要編碼成一個向量,該向量用作神經(jīng)網(wǎng)絡的輸入。為了使iSeVC在捕獲程序語義信息時獨立于用戶定義的函數(shù)名稱,我們將用戶定義的函數(shù)名稱映射到統(tǒng)一的符號名稱(例如,“FUN1”,“FUN2”),使用詞嵌入技術(shù)將其編碼為向量。在神經(jīng)網(wǎng)絡模型上,VulDeeLocator使用了如圖3所示的BRNN-vdl結(jié)構(gòu),在標準BRNN架構(gòu)上增加了三個額外的層,即multiple層、k-max池化層和平均池化層,來實現(xiàn)粒度細化和注意力機制。BRNN-vdl的輸入包括iSeVC的表征向量以及表示每個iSeVC漏洞位置的矩陣。
圖3 ?BRNN-vdl模型
實驗結(jié)果
實驗主要針對VulDeeLocator引入的基于中間代碼的漏洞候選表示和BRNN-vdl模型來探究VulDeeLocator各改進方法在漏洞檢測和定位上的提升效果。同時,VulDeeLocator也在測試數(shù)據(jù)集和真實軟件上與具有代表性的漏洞檢測工具進行對比,驗證了VulDeeLocator在漏洞檢測和定位上的有效性和先進性。
VulDeeLocator首先比較了使用基于源代碼的漏洞候選表示sSeVC與基于中間代碼的漏洞候選表示iSeVC的漏洞檢測效果。實驗使用了誤報率FPR、漏報率FNR、準確率A、精確率P和F1分數(shù)等深度學習常見指標作為漏洞檢測能力的評價指標,定位精度采用漏洞行IoU交并比和平均檢測漏洞行數(shù)目 |V|指標進行衡量。實驗結(jié)果如表1所示,可以看出,在使用相同模型的情況下,iSeVC能夠有效提升漏洞檢測效果。對于同一種漏洞候選表示,使用BRNN-vdl模型相較于BRNN模型也能對漏洞檢測效果有較大提升。因此,實驗證明了VulDeeLocator引入的iSeVC和BRNN-vdl模型的有效性。
表1 ?使用不同漏洞候選表示與深度學習模型的效果對比
在驗證了VulDeeLocator有效性后,VulDeeLocator使用了兩種不同的BRNN模型:BLSTM和BGRU,與先進的具有代表性的漏洞檢測器進行了對比。在基于源代碼和規(guī)則的漏洞檢測器中,選取了開源工具Flawfinder和商業(yè)產(chǎn)品Checkmarx進行對比;在基于中間代碼和規(guī)則的漏洞檢測器中,選取了商業(yè)產(chǎn)品Fortify進行對比;在基于二進制代碼和規(guī)則的漏洞檢測器中,選取了開源的污點式漏洞檢測器Saluki進行對比;實驗還選取了兩個基于深度學習的漏洞檢測器VulDeePecker和SySeVR。實驗結(jié)果如表2所示,表明了VulDeeLocator在測試數(shù)據(jù)集上的檢測能力和定位精度相較于現(xiàn)有工具均有較大提升,且VulDeeLocator-BGRU優(yōu)于VulDeeLocator-BLSTM。
表2 ?VulDeeLocator與先進的漏洞檢測器的實驗結(jié)果對比
最后,論文在三個真實軟件產(chǎn)品(FFmpeg 2.8.2、Wireshark 2.0.5、Libav 9.10)的主要模塊中隨機選擇了200個程序文件與5個具有代表性的漏洞檢測工具進行了實驗對比,實驗結(jié)果如表3所示。通過實驗驗證,展現(xiàn)了VulDeeLocator-BGRU在真實軟件產(chǎn)品中檢測和定位漏洞的有效性和精確性。表4描述了VulDeeLocator-BGRU確認或遺漏的漏洞,在18個已確認的漏洞中,VulDeeLocator-BGRU發(fā)現(xiàn)了有兩個Libav 9.10中漏洞,但其并未在美國國家漏洞庫NVD中報告,卻在軟件供應商發(fā)布新版本時被“默默”修補。
表3 ?VulDeeLocator在3個真實軟件產(chǎn)品上的檢測效果
表4 ?VulDeeLocator在真實軟件產(chǎn)品上識別的漏洞
詳細內(nèi)容請參見:
Zhen Li, Deqing Zou, Shouhuai Xu, Zhaoxuan Chen, Yawei Zhu, Hai Jin. VulDeeLocator: A Deep Learning-Based Fine-Grained Vulnerability Detector. IEEE Transactions on Dependable and Secure Computing, 2022, 19(4): 2821-2837.
https://ieeexplore.ieee.org/document/9416836
來源:穿過叢林