本發明屬于數據處理,具體涉及一種基于機器學習的代碼漏洞檢測方法和系統。
背景技術:
1、軟件作為信息化社會中不可或缺的一部分發揮著越來越重要的作用,它不僅與個人的日常生活密不可分,也與社會的發展息息相關。然而軟件是一把雙刃劍,它在為個人和社會提供便利服務的同時,其所潛在的漏洞也可能會對個人和社會造成極大的損失。軟件中的漏洞往往是不可避免的,一方面是由于軟件在設計、開發和部署過程中很難做到不存在問題,另一方面則是由于商業效益原因導致軟件開發周期不能太長,進一步增加了軟件存在漏洞的風險。為了減少軟件中的漏洞,提高軟件質量,軟件漏洞檢測技術應運而生。漏洞檢測技術就是通過檢查軟件的源代碼或者軟件的執行過程,根據經驗、已知的漏洞模式以及軟件的執行結果等判斷軟件是否存在漏洞。
2、源代碼漏洞檢測技術是提升軟件質量與安全性,以及減少漏洞數和降低漏洞修復成本的重要手段,并按照是否需要執行軟件分為如下兩種方式:(1)靜態分析,即在不運行軟件的情況下對源代碼進行分析,以便檢測出代碼缺陷,但這依賴于專家制定規則,存在主觀性較強和規則不完善等問題;(2)動態測試分析,即執行目標程序并監控其運行狀況,以便挖掘出漏洞,但其存在因分析效率低和代碼覆蓋率低而導致的漏報率高、資源消耗大和復雜漏洞難以發現等問題。
3、目前,雖然有諸如《cn116541843a-一種基于機器學習的代碼漏洞檢測方法》、《cn111259394a-一種基于圖神經網絡的細粒度源代碼漏洞檢測方法》和《cn117272309a-一種基于圖神經網絡和可解釋模型的源代碼漏洞檢測方法及裝置》等實現靜態分析的現有源代碼漏洞檢測技術,但是這些技術普遍忽略了代碼的上下文內容對漏洞存在性的影響,導致代碼漏洞檢測結果的準確性仍有待提高。
技術實現思路
1、本發明的目的是提供一種基于機器學習的代碼漏洞檢測方法和系統,用以解決現有源代碼漏洞檢測技術因普遍忽略代碼上下文內容對漏洞存在性的影響而導致代碼漏洞檢測結果的準確性提高受限的問題。
2、為了實現上述目的,本發明采用以下技術方案:
3、第一方面,提供了一種基于機器學習的代碼漏洞檢測方法,包括:
4、獲取源代碼,并從所述源代碼中提取出至少一個代碼語句的語句源代碼;
5、針對在所述至少一個代碼語句中的各個代碼語句,從所述源代碼中還提取出對應的上下文源代碼;
6、針對所述各個代碼語句,采用數據采集算法從與對應語句匹配的同類型代碼語句的所有歷史測試樣本數據中采集所述歷史測試樣本數據,并將采集結果添加到對應的樣本數據集中,其中,所述歷史測試樣本數據包含有用于作為模型輸入項的所述同類型代碼語句的代碼特征和用于作為模型輸出項的所述同類型代碼語句的歷史測試后代碼漏洞分類標簽值,所述代碼特征是指基于相應語句的語句源代碼及上下文源代碼轉換而得的數值化特征;
7、針對所述各個代碼語句,應用對應的所述樣本數據集,對基于機器學習算法的人工智能模型進行率定驗證建模,得到對應的代碼漏洞檢測模型,其中,所述代碼漏洞檢測模型用于在輸入相應語句的語句源代碼及上下文源代碼后輸出相應語句的測試后代碼漏洞分類標簽預測值;
8、針對所述各個代碼語句,將對應的語句源代碼及上下文源代碼轉換為對應的所述代碼特征,然后將該代碼特征輸入對應的所述代碼漏洞檢測模型,輸出得到對應的測試后代碼漏洞分類標簽預測值;
9、匯總用于指示相應代碼語句存在代碼漏洞情況的所述測試后代碼漏洞分類標簽預測值以及與該測試后代碼漏洞分類標簽預測值對應的代碼語句,得到所述源代碼的漏洞檢測結果并予以報警提醒。
10、基于上述
技術實現要素:
,提供了一種基于語句源代碼及上下文源代碼進行測試后代碼漏洞分類標簽預測的新方案,即先從源代碼中提取出各個代碼語句的語句源代碼和上下文源代碼,然后針對各個語句,采用數據采集算法從對應的所有歷史測試樣本數據中采集樣本數據,并將采集結果添加到對應的樣本數據集中,再然后針對各個語句,應用對應的數據集對基于機器學習算法的人工智能模型進行率定驗證建模,得到對應的代碼漏洞檢測模型,并應用模型,基于對應的語句源代碼及上下文源代碼預測得到對應的測試后代碼漏洞分類標簽預測值,最后匯總漏洞檢測結果并予以報警提醒,如此通過在代碼漏洞檢測過程中兼顧代碼上下文內容對漏洞存在性的影響,可以有效提高代碼漏洞檢測結果的準確性,便于實際應用和推廣。
11、在一個可能的設計中,所述至少一個代碼語句包括有用于輸出文本的第一代碼語句、用于獲取用戶輸入的第二代碼語句、用于根據不同條件執行不同代碼塊的第三代碼語句、用于循環遍歷可迭代對象中的元素的第四代碼語句、用于在條件為真時不斷循環執行代碼塊的第五代碼語句、用于導入可用程序模塊以便使用該可用程序模塊中的函數/類的第六代碼語句和/或用于暫時不執行任何操作的第七代碼語句。
12、在一個可能的設計中,針對所述各個代碼語句,采用數據采集算法從與對應語句匹配的同類型代碼語句的所有歷史測試樣本數據中采集所述歷史測試樣本數據,并將采集結果添加到對應的樣本數據集中,包括:
13、針對在所述至少一個代碼語句中的某個代碼語句,從與對應語句匹配的同類型代碼語句的所有歷史測試樣本數據中隨機采集若干個所述歷史測試樣本數據,并將隨機采集所得的若干個所述歷史測試樣本數據添加到對應且初始為空集的樣本數據集中,其中,所述歷史測試樣本數據包含有用于作為模型輸入項的所述同類型代碼語句的代碼特征和用于作為模型輸出項的所述同類型代碼語句的歷史測試后代碼漏洞分類標簽值,所述代碼特征是指基于相應語句的語句源代碼及上下文源代碼轉換而得的數值化特征;
14、對與所述某個代碼語句對應的所述樣本數據集進行處理分析,確定與所述某個代碼語句對應的樣本數據缺口方向;
15、根據所述樣本數據缺口方向配置數據采集算法,并采用所述數據采集算法從與所述某個代碼語句匹配的同類型代碼語句的所有歷史測試樣本數據中采集所述歷史測試樣本數據;
16、判斷新采集所得的所述歷史測試樣本數據是否匹配所述樣本數據缺口方向,若是,則將新采集所得的所述歷史測試樣本數據添加到與所述某個代碼語句對應所述樣本數據集中,否則放棄將新采集所得的所述歷史測試樣本數據添加到與所述某個代碼語句對應的所述樣本數據集中。
17、在一個可能的設計中,根據所述樣本數據缺口方向配置數據采集算法,并采用所述數據采集算法從與所述某個代碼語句匹配的同類型代碼語句的所有歷史測試樣本數據中采集所述歷史測試樣本數據,包括有如下步驟s331~s339:
18、s331.根據所述樣本數據缺口方向,將與所述代碼特征的初始特征值對應的初始位置初始化在數據缺口周邊位置,然后執行步驟s332,其中,所述初始位置和所述數據缺口周邊位置分別位于基于所述代碼特征構建而得的多維特征空間中,所述數據缺口周邊位置根據所述樣本數據缺口方向確定;
19、s332.根據所述代碼特征的初始特征值,采用直接二進制搜索算法從與所述某個代碼語句匹配的同類型代碼語句的所有歷史測試樣本數據中搜索到模型輸入項與該初始特征值匹配的第一歷史測試樣本數據,然后執行步驟s333;
20、s333.將特征序號變量初始化為1,然后執行步驟s334;
21、s334.基于所述代碼特征的當前特征值,改變在所述代碼特征中的第個特征的特征值,得到所述代碼特征的新特征值,然后執行步驟s335;
22、s335.根據所述代碼特征的新特征值,采用所述直接二進制搜索算法從與所述某個代碼語句匹配的同類型代碼語句的所有歷史測試樣本數據中搜索到模型輸入項與該新特征值匹配的第二歷史測試樣本數據,然后執行步驟s336;
23、s336.比較在所述第二歷史測試樣本數據與所述第一歷史測試樣本數據中且用于作為模型輸出項的歷史測試后代碼漏洞分類標簽值,若在所述第二歷史測試樣本數據中的歷史測試后代碼漏洞分類標簽值不同于在所述第一歷史測試樣本數據中的歷史測試后代碼漏洞分類標簽值,則執行步驟s337,否則執行步驟s338;
24、s337.將所述第一歷史測試樣本數據更新為所述第二歷史測試樣本數據,并若所述特征序號變量小于所述代碼特征的維度總數,則使所述特征序號變量自加1,然后返回執行步驟s334,否則執行步驟s339;
25、s338.將所述第個特征的特征值恢復為改變前的值,并若所述特征序號變量小于所述代碼特征的維度總數,則使所述特征序號變量自加1,然后返回執行步驟s334,否則執行步驟s339;
26、s339.將所述第一歷史測試樣本數據作為采集結果,并結束本次采集。
27、在一個可能的設計中,對與所述某個代碼語句對應的所述樣本數據集進行處理分析,確定與所述某個代碼語句對應的樣本數據缺口方向,包括:
28、根據與所述某個代碼語句匹配的同類型代碼語句的測試后代碼漏洞分類標簽值的定義域,對與所述某個代碼語句對應的所述樣本數據集進行統計分析,確定位于該樣本數據集中的測試后代碼漏洞分類標簽值在所述定義域中的分布區間;
29、在所述定義域中剔除所述分布區間,得到在所述定義域中的分布缺失區間;
30、根據所述分布缺失區間,確定與所述某個代碼語句對應的樣本數據缺口方向。
31、在一個可能的設計中,針對所述各個代碼語句,應用對應的所述樣本數據集,對基于機器學習算法的人工智能模型進行率定驗證建模,得到對應的代碼漏洞檢測模型,包括:
32、獲取基于不同機器學習算法的多個人工智能模型;
33、針對在所述至少一個代碼語句以及所述多個人工智能模型中的某對語句與模型,應用對應語句的所述樣本數據集,基于優化算法對相應模型的超參數進行優化,得到對應的模型超參數且用于使目標函數最小化的最優化搜索結果,其中,所述目標函數的計算公式如下:
34、
35、式中,表示人工智能模型的輸出誤差情況指標值,表示人工智能模型的計算所需時長指標值;
36、從所述多個人工智能模型中選出具有最小的所述目標函數的某個人工智能模型;
37、將所述某個人工智能模型的超參數的最優化搜索結果以及在優化過程中所得且與該最優化搜索結果對應的模型參數導入所述某個人工智能模型,得到與在所述某對語句與模型中的代碼語句對應的代碼漏洞檢測模型,其中,所述代碼漏洞檢測模型用于在輸入相應語句的語句源代碼及上下文源代碼后輸出相應語句的測試后代碼漏洞分類標簽預測值。
38、在一個可能的設計中,針對在所述至少一個代碼語句以及所述多個人工智能模型中的某對語句與模型,應用對應語句的所述樣本數據集,基于優化算法對相應模型的超參數進行優化,得到對應的模型超參數且用于使目標函數最小化的最優化搜索結果,包括有如下步驟s421~s429:
39、s421.針對在所述至少一個代碼語句以及所述多個人工智能模型中的某對語句與模型,初始化對應且包含有最大迭代次數的優化算法參數,并隨機生成待優化參數集合的初始搜索值數組,然后執行步驟s422,其中,所述待優化參數集合包含有在所述某對語句與模型中的人工智能模型的所有超參數,所述待優化參數集合的初始搜索值數組表示如下:
40、
41、式中,表示小于等于的正整數,表示所述待優化參數集合的參數總數,表示與在所述待優化參數集合中的第個參數對應的初始搜索值,表示與所述第個參數對應的參數搜索空間上限,表示與所述第個參數對應的參數搜索空間下限,表示純小數隨機生成函數;
42、s422.將所述待優化參數集合的初始搜索值數組作為模型超參數導入在所述某對語句與模型中的人工智能模型,得到第一人工智能模型,然后應用與在所述某對語句與模型中的代碼語句對應的所述樣本數據集,對所述第一人工智能模型進行模型訓練及測試,得到第一輸出誤差情況指標值和第一計算所需時長指標值,最后將所述第一輸出誤差情況指標值和所述第一計算所需時長指標值導入目標函數,并將輸出結果作為與所述初始搜索值數組對應的適應度,然后執行步驟s423,其中,所述目標函數的計算公式如下:
43、
44、式中,表示人工智能模型的輸出誤差情況指標值,表示人工智能模型的計算所需時長指標值;
45、s423.將所述待優化參數集合的初始搜索值數組作為當前最優搜索值數組,并初始化設置當前迭代次數,以及還初始化設置在所述待優化參數集合中的各個參數的禁變倒計數值為零,然后執行步驟s424;
46、s424.基于所述當前最優搜索值數組,分別對在所述待優化參數集合中且當前禁變倒計數值為零的各個參數進行獨立的增加處理和減少處理,得到所述待優化參數集合的個新搜索值數組,然后執行步驟s425,其中,表示在所述待優化參數集合中且當前禁變倒計數值為零的參數的總數,并有;
47、s425.針對在所述個新搜索值數組中的各個數組,將對應數組作為模型超參數導入在所述某對語句與模型中的人工智能模型,得到對應數組的第二人工智能模型,然后應用與在所述某對語句與模型中的代碼語句對應的所述樣本數據集,對所述第二人工智能模型進行模型訓練及測試,得到對應數組的第二輸出誤差情況指標值和第二計算所需時長指標值,最后將所述第二輸出誤差情況指標值和所述第二計算所需時長指標值導入所述目標函數,并將輸出結果作為對應數組的適應度,然后執行步驟s426;
48、s426.針對所述各個數組,使與所述當前最優搜索值數組對應的適應度減去對應數組的適應度,得到對應數組的適應度相差值,并在該適應度相差值大于零且為本次最大的適應度相差值時,將對應的唯一變動參數的禁變倒計數值更新為一個與該適應度相差值正相關的正整數值,然后執行步驟s427,其中,所述唯一變動參數是指在所述待優化參數集合中且用于通過增加處理或減少處理以得到相應數組的參數;
49、s427.判斷在所述待優化參數集合中是否存在當前禁變倒計數值為零的任一參數,若否,則使在所述待優化參數集合中的各個參數的當前禁變倒計數值自減1,然后返回執行步驟s427,否則執行步驟s428;
50、s428.判斷在所述各個數組的適應度相差值中是否存在大于零的任一適應度相差值,若是,則將所述當前最優搜索值數組更新為在所述個新搜索值數組中且與最小適應度對應的數組,然后執行步驟s429,否則直接執行步驟s429;
51、s429.使所述當前迭代次數自加1,并判斷所述當前迭代次數是否達到所述最大迭代次數,若是,則將所述當前最優搜索值數組作為與所述某對語句與模型對應的模型超參數且用于使所述目標函數最小化的最優化搜索結果,否則返回執行步驟s424。
52、在一個可能的設計中,所述多個人工智能模型包括有基于圖神經網絡、支持向量機、k最鄰近法、隨機梯度下降法、多變量線性回歸、多層感知機、決策樹、反向傳播神經網絡和/或徑向基函數網絡的人工智能模型。
53、第二方面,提供了一種基于機器學習的代碼漏洞檢測裝置,包括有語句代碼提取單元、上下文代碼提取單元、樣本數據采集單元、漏洞檢測建模單元、檢測模型應用單元和檢測結果匯總單元;
54、所述語句代碼提取單元,用于獲取源代碼,并從所述源代碼中提取出至少一個代碼語句的語句源代碼;
55、所述上下文代碼提取單元,通信連接所述語句代碼提取單元,用于針對在所述至少一個代碼語句中的各個代碼語句,從所述源代碼中還提取出對應的上下文源代碼;
56、所述樣本數據采集單元,通信連接所述語句代碼提取單元,用于針對所述各個代碼語句,采用數據采集算法從與對應語句匹配的同類型代碼語句的所有歷史測試樣本數據中采集所述歷史測試樣本數據,并將采集結果添加到對應的樣本數據集中,其中,所述歷史測試樣本數據包含有用于作為模型輸入項的所述同類型代碼語句的代碼特征和用于作為模型輸出項的所述同類型代碼語句的歷史測試后代碼漏洞分類標簽值,所述代碼特征是指基于相應語句的語句源代碼及上下文源代碼轉換而得的數值化特征;
57、所述漏洞檢測建模單元,通信連接所述樣本數據采集單元,用于針對所述各個代碼語句,應用對應的所述樣本數據集,對基于機器學習算法的人工智能模型進行率定驗證建模,得到對應的代碼漏洞檢測模型,其中,所述代碼漏洞檢測模型用于在輸入相應語句的語句源代碼及上下文源代碼后輸出相應語句的測試后代碼漏洞分類標簽預測值;
58、所述檢測模型應用單元,分別通信連接所述語句代碼提取單元、所述上下文代碼提取單元和所述漏洞檢測建模單元,用于針對所述各個代碼語句,將對應的語句源代碼及上下文源代碼轉換為對應的所述代碼特征,然后將該代碼特征輸入對應的所述代碼漏洞檢測模型,輸出得到對應的測試后代碼漏洞分類標簽預測值;
59、所述檢測結果匯總單元,通信連接所述檢測模型應用單元,用于匯總用于指示相應代碼語句存在代碼漏洞情況的所述測試后代碼漏洞分類標簽預測值以及與該測試后代碼漏洞分類標簽預測值對應的代碼語句,得到所述源代碼的漏洞檢測結果并予以報警提醒。
60、第三方面,本發明提供了一種計算機系統,包括有依次通信連接的存儲器、處理器和收發器,其中,所述存儲器用于存儲計算機程序,所述收發器用于收發消息,所述處理器用于讀取所述計算機程序,執行如第一方面或第一方面中任意可能設計所述的基于機器學習的代碼漏洞檢測方法。
61、第四方面,本發明提供了一種計算機可讀存儲介質,所述計算機可讀存儲介質上存儲有指令,當所述指令在計算機上運行時,執行如第一方面或第一方面中任意可能設計所述的基于機器學習的代碼漏洞檢測方法。
62、第五方面,本發明提供了一種計算機程序產品,包括計算機程序或指令,所述計算機程序或所述指令在被計算機執行時實現如第一方面或第一方面中任意可能設計所述的基于機器學習的代碼漏洞檢測方法。
63、上述方案的有益效果:
64、(1)本發明創造性提供了一種基于語句源代碼及上下文源代碼進行測試后代碼漏洞分類標簽預測的新方案,即先從源代碼中提取出各個代碼語句的語句源代碼和上下文源代碼,然后針對各個語句,采用數據采集算法從對應的所有歷史測試樣本數據中采集樣本數據,并將采集結果添加到對應的樣本數據集中,再然后針對各個語句,應用對應的數據集對基于機器學習算法的人工智能模型進行率定驗證建模,得到對應的代碼漏洞檢測模型,并應用模型,基于對應的語句源代碼及上下文源代碼預測得到對應的測試后代碼漏洞分類標簽預測值,最后匯總漏洞檢測結果并予以報警提醒,如此通過在代碼漏洞檢測過程中兼顧代碼上下文內容對漏洞存在性的影響,可以有效提高代碼漏洞檢測結果的準確性;
65、(2)通過前述的新型啟發式算法步驟來對模型超參數進行優化,可以在優化過程中基于不同的適應度相差值來對在每次最佳鄰域搜索方向上的搜索成果進行不同迭代次數的臨時鎖定,進而利于快速搜索到最優的模型超參數,并通過先對待調參數進行定量的步進增加/減少再進行不定量的隨機增加/減少的參數調整方式,還可以避免陷入局部最優解,進一步利于快速且準確得到最優化搜索結果,便于實際應用和推廣。