董 健,馮瑩瑩
(1. 鄭州科技學院信息工程學院,河南 鄭州 450064;2. 阜陽師范大學信息工程學院,安徽 阜陽 236041)
軟件作為一種計算機語言和命令的集合組織,常規情況可分為三種:系統軟件、應用軟件和處于二者之間的中間件[1]。現階段計算機普及和發展離不開軟件的支持,其安全性和可用性對系統和用戶來說是極為重要的,若軟件內存在缺陷或漏洞,當非法者進行異常操作攻擊授權訪問模塊時,系統可用性和內部信息機密性會大幅度降低,并產生連鎖反應,嚴重會導致應用網絡癱瘓[2]。缺陷或漏洞被總稱為軟件脆弱性[3],軟件開發人員為提高其穩定程度,研究得出一系列嚴格安全設計準則和操作流程[4],但軟件本身組織程序就復雜,在多源應用環境中,漏洞總能從開發人員從未考慮的角度或維度涌出,嚴重威脅網絡系統安全。
為此相關人員提出如下解決方法,例如胡建偉[5]等人提出了一種改進ASTNN網絡的PHP代碼漏洞挖掘方法。針對漏洞挖掘規則單一問題,通過抽象語法樹深度分析軟件編碼語義,利用子樹分類,將分類結果輸入至深度神經網絡中層層迭代輸出挖掘結果;惠子青[6]等人提出了一種動態加權組合神經網絡模型的軟件測試方法。針對軟件程序的多樣性,設置動態加權組合模型,明確不同類型軟件漏洞所占比重,動態調節神經網絡網絡輸出結果,具有更好的泛化性能。但是這兩種方法均過于遵循全面挖掘規則,面對大規模軟件系統時系統開銷過大,難以實現多個軟件并行挖掘。
為此,本文引入機器學習算法,在海量數據中學習軟件編程規則,使漏洞挖掘方法能夠利用已有規則進行自決策、分類和全局預測,組建漏洞信息資源庫,最后根據歐式距離完成多類漏洞的并行挖掘工作。
若軟件存在漏洞則表示軟件系統不再可靠,所能產生的后果為:軟件錯誤,一般由在開發軟件過程中產生的人為錯誤引起;軟件差錯,描述軟件運行結果和設想結果不一致;軟件失效,表示軟件的部分或全部應用功能無法實現。
這些都會導致軟件無法正常運行,降低用戶體驗。但目前學術界并沒有統一定義能完全劃分多類漏洞,且軟件漏洞本身也跟隨科技發展不斷變化和細分,常用劃分等級和類型如表1所示。

表1 常用軟件漏洞等級和類型明細
為此,本文綜合表1觀點,從軟件漏洞的表象和本質出發[7],定義基于機器學習的軟件多類漏洞并行挖掘主要面向影響安全使用的部分,且該漏洞能夠被非法者攻擊和利用,導致系統機密性和用戶隱私受到威脅,產生嚴重非預期危害。以設計、開發、運行角度將軟件多類漏洞分為:
1)軟件設計漏洞,是指發開人員在軟件生成和組織過程中,未考慮到某部分規則或者從錯誤角度出發建立的規則,而形成的漏洞。
2)軟件編碼漏洞,是指編碼人員撰寫程序不規范、邏輯錯誤引發的安全漏洞,進一步可分為:打破內存漏洞,描述用戶能非預期進行訪問、執行權限不足的操作頁面等行為;混亂邏輯漏洞[8],描述編碼存在問題,程序沒有按照指令進行工作,部分安全機制和權限被繞過。
3)軟件配置漏洞,是指由于存在危險內在配置文件、外在不良硬件環境引發的安全漏洞。攻擊者可遠距離非法訪問和攻擊用戶隱私信息,導致機密數據被泄露。
基于軟件漏洞等級和類型可知,軟件多類漏洞定義是抽象意義上的值,無法作為量化數據輸入至機器學習算法中進行并行挖掘,為此,采集已有多類漏洞數據集,按序列映射到特征向量空間,明確不同類漏洞對應的屬性特征值。考慮到不同開發和編碼人員思想和行為的多樣性[9],將海量漏洞中代碼函數、參數、目標變量等信息進行歸一化預處理,憑借統一格式方便計算。
首先過濾樣本數據集合中與軟件漏洞無聯系的非ASⅡ字節,將代碼函數、參數、目標變量等信息一一映射到符號名稱中,統一編碼命名[10,11],經過歸一化處理后,投影到特征向量空間中。通過自然文本語言量化不同類型漏洞中關鍵區域出現頻率,即可得到對應特征值。
假設通過掃描系統得到任意軟件X存在的代碼函數序列為X={x1,x2,…,xn},對應任意源代碼文件的關鍵節點的結合表示為A,且能夠組建X詞典A={a1,a2,…,am},n、m均表示不為0的整數。映射過程表示為
ψ(x)=λ(x,a)·υa,A
(1)

(2)
式中,υa,A表示逆文檔的術語頻率參數,可消除一部分軟件漏洞序列的相似度,降低非發生漏洞的關鍵節點對漏洞特征提取影響。計算公式為

(3)
式中,dfa表示為節點a出現的文件次數,tfa,A描述在集合A中出現次數dfa與節點總數之間的比值。
以軟件漏洞信息的歸一化處理結果為基礎,引入機器學習,完成軟件數據特征的分類。軟件數據涵蓋了漏洞并行挖掘所需全部信息,但軟件編程復雜、信息維度高,為提高挖掘算法性能,使用機器學習中KNN(K-NearestNeighbor)深度聚類算法[12,13],明確樣本數據的鄰近函數域,融合自動編碼器壓縮特征。
深度聚類過程主要包括軟件特征提取、特征降維、特征聚類三步驟。特征提取的同時還要去除干擾噪聲和重復、缺失數據。若待挖掘軟件樣本數量是M,集合中第α個特征的值表示為Q=(qα1,qα2,…,qαM),樣本規范化表示為

(4)

深度學習規范化后特征內抽象信息,將高維數據重構到低維空間內,提高挖掘算法性能。這步驟分為:輸入層、輸出層、隱含層,降維過程為
z=fθ(q)=?(Wq+b)
(5)
p=gθ′(z)=?′(Wz+b′)
(6)
式中,q表示輸入特征,p表示降維后特征,fθ(q)表示輸入至隱含層中的非線性函數,用來處理輸入的無關聯特征,z表示輸入至隱含層的中間結果,gθ′(z)表示輸入至輸出層中的非線性函數,用來處理隱含層輸入的無關聯特征。?、?′描述不同層激活函數,W、W′描述特征編碼、解碼權重,b、b′描述不同層偏移向量。
考慮到本文為基于多類漏洞的并行挖掘算法,將低維特征以不同“特征源”進行深度聚類,以軟件代碼片段間的差異特征作為聚類指標。j為待挖掘樣本q中的任意特征種類集合,o表示聚類中心,深度聚類可描述為

(7)
式中,sim(q,oα)表示q和oα之間的余弦距離。
利用分類挖掘算法能夠分類并識別不同“特征源”的最近鄰居特征集合。
將軟件劃分為不同特征源后,使用相似性度量方法比較計算特征源和多類漏洞信息資源庫相似程度,即度量二者中任意數據pl和xk間歐式距離[14]為

(8)
式中,r=(1,2,…,j)。
由于不同特征源之間的量綱是一致的,所以難以度量出不同特征間細微差距,為此,使用式(4)規范化處理去除其量綱限制,并行挖掘出準確軟件漏洞問題解[15]。此時不同特征源間規范化歐式距離為

(9)


為驗證基于機器學習的軟件多類漏洞并行挖掘方法的有效性,進行仿真。選取來自開源數據庫Tera-PROMISE的4組NASA軟件多類漏洞數據集作為實驗樣本,任意數據集包含漏洞常量、干擾、重復等特征都不一致。具體如表2所示。

表2 實驗數據集
在軟件漏洞挖掘實現過程中,必須挑選指標來驗證所提方法挖掘性能。評價挖掘結果可描述為一個二分類問題,即挖掘無錯誤為正例、有錯誤為負例,各個指標的具體計算公式為:
1)精準度描述軟件漏洞被正確挖掘出的數量與所有被挖掘的數量的比值,計算公式為

(10)
2)召回率描述軟件漏洞被正確挖掘出的數量與真實軟件漏洞數量的比值,計算公式為

(11)
3)F1值描述召回率與精準度間的調和平均值,因為二者間存在非線性關系,會存在召回率高但精準度低的情況。這樣F1值越大,表示二者值不一致情況越小,計算過程為
(12)
式中,真正例TP(實際結果為漏洞且被挖掘出的數據)、真負例TN(實際結果為漏洞未被挖掘出的數據)、假正例FP(實際結果不是漏洞卻被挖掘出的數據)、假負例FN(實際結果不是漏洞也沒被挖掘出的數據)。
將4組實驗數據集內數據放置在低維空間內,完成特征深度聚類,文獻[5]提出的基于改進ASTNN網絡的軟件漏洞挖掘方法、文獻[6]提出的基于加權組合模型的軟件漏洞挖掘方法、研究方法分類結果如圖1所示。圖中,黑點為CM1數據集、白點為CM2數據集、黑矩形為KC2數據集、黑三角為MW1數據集。

圖1 不同方法的軟件特征聚類結果對比
觀察圖1可知,CM1、CM2軟件數據相似程度高,加權組合模型在分類過程中出現錯分情況,改進ASTNN網絡方法未發生錯分但二者聚類中心聚類過近,在后續多類漏洞挖掘中很難提供明確特征信息。相比之下,所提方法,不僅分類邊界清晰、聚集,CM1、CM2聚類中心距離最遠,最大程度避免了后期錯誤漏洞挖掘情況發生。
三種方法挖掘結果的F1值如圖2所示。

圖2 不同方法的F1值對比
根據圖2能夠看出,研究方法F1值隨著實驗次數增加出現了一定震蕩,總體穩定在[0.86,0.89]之間,文獻方法相比F1值低且更加穩定。說明所提方法召回率高且挖掘精準,二者值相差較小、均勻調和。
ROC曲線下面積為AUC,取值范圍在為比較挖掘方法在[0,1]之間,通常會大于0.5,值越大表示挖掘算法的錯誤負例越少,性能越好。三種方法挖掘結果AUC值如圖3所示。

圖3 不同方法的AUC值對比
根據圖3可知,能夠看出對于不同數據集,研究方法最終AUC值均高于文獻方法,且在特征數初期上升趨勢明顯,隨著特征數增加曲線趨于平穩,本次實驗結果可證明所提方法錯誤負例少、誤報率低。
提出一種基于機器學習的軟件多類漏洞并行挖掘方法。建立多類漏洞資源數據庫,通過深度聚類和歐式距離加快挖掘方法自學習速度,經過仿真證明所提方法面向大規模多類型軟件系統時,也能精準、快速挖掘出漏洞信息。可將研究方法應用于軟件開發設計、編碼程序、仿真測試以及發布使用等多個環節,全面考慮不同階段可能出現的漏洞問題。