天天看點

漏洞檢測方法如何選?詳解源代碼與二進制SCA檢測原理

摘要:本文探讨的是SCA具體的檢測原理,源代碼SCA檢測和二進制SCA檢測有哪些相同點和不同點,在進行安全審計、漏洞檢測上各自又有什麼樣的優勢和适用場景。

本文分享自華為雲社群《源代碼與二進制檔案SCA檢測原理》,作者:安全技術猿。

1、源代碼與二進制的關系和特點

SCA(Software Composition Analysis)軟體成分分析,通俗的了解就是通過分析軟體包含的一些資訊和特征來實作對該軟體的識别、管理、追蹤的技術。SCA具體的檢測原理又是如何實作的,源代碼和二進制檔案的SCA檢測又有哪些相同點和不同點,下面内容就來回答一下上述疑問。

對應編譯類型的語言(C/C++/Go/Rust),都是遵循:源代碼—>編譯—>連結—>二進制檔案的過程。影響二進制檔案的因素包括不同的CPU架構(ARM、X86、PPC、MIPS…),不同的作業系統(Wndows、Linux、iOS、Android…),不同的編譯優化選項(O0~O3),即使是同一套源代碼,最終編譯生成的二進制檔案之間也是差别非常大的。注:上述影響因素不涉及java語言

從上面可知源代碼和二進制檔案之間存在巨大的差别,源代碼是基于高階語言來編寫,是給人看的,人看了很友善了解其中語句的語義;而二進制是由流(指令流或位元組流)來構成的,是給計算機“看”的,對人來說是非常不友好,不好了解。

源代碼包含了變量符号類型、函數名稱、類名稱、代碼邏輯結構等大量豐富的代碼資訊,相反為保留二進制檔案的緊湊性,編譯生成的二進制檔案中會丢棄掉很多運作時用不到的資訊,隻保留程式正确運作必要的資訊,比如被丢棄的資訊有變量類型、變量名稱等符号資訊,可能被保留的有類名稱、函數名稱等資訊,一定會保留的有常量字元串資料。另外為了保證程式的正确運作,還會有保留一個相應的配置資訊,比如jar包中的manifest資訊、POM資訊、maven資訊、資源檔案等。基于這些特點源代碼SCA和二進制SCA的檢測原理也存在很大的不同。

2、源代碼SCA檢測原理

由于源代碼中包含有豐富的程式資訊,是以源代碼的SCA檢測既有大顆粒度的檢測方法,也有細顆粒度的檢測方法。

2.1 大顆粒度檢測方法:

根據源代碼檔案的相似度來判斷屬于什麼元件和版本;檔案相似度可以基于hash的嚴格比對方法,也可以根據文本相似度比對方法;這種比對方法的優點是效率高,比對速度極快,确定是也很明顯,基于hash的容易漏報,基于文本相似度的準确率低;

2.2 細顆粒度檢測方法:

經過源代碼—>詞法分析—>Token提取—>文法分析—>AST抽象文法樹—>語義分析過程來提取相應的資料,再通過機器學習、NLP、CFG調用圖、DFG資料流圖等等比對算法進行代碼相似度的檢測,這種基于語義的代碼相似度檢測與基于文本相似度檢測相比準确率高;

2.3 具備包管理機制的語言:

比如Java、Go,可以通過引用的開源軟體包資訊來實作開源軟體的關聯分析,這種方法可以幾乎可以100%準确的分析出引用的開源軟體名稱。

3、二進制SCA檢測原理

雖然好多源代碼中具有的資訊在二進制檔案中不存在,但是對于常量字元串、部分類名稱、函數名稱、以及一些配置資訊還是存在的,并且這些資訊具備一定的不變性,即受cpu架構、不同編譯優化選項的影響很小,是以二進制SCA主要從二進制檔案中提取這些方面的不同特征,再運用比對算法進行相似度計算,并根據相似度門限來檢測出引用的開源軟體名稱和版本号。

結合分析二進制代碼中的CFG調用圖、DFG資料流圖等資訊進行更加精準的檢測,但由于這些分析需要對二進制檔案進行指令反彙編,導緻分析時間非常的長,分析效率低下,是以這種SCA檢測方法不适合對大規模二進制檔案進行掃描。

4、源代碼SCA和二進制SCA功能對比

漏洞檢測方法如何選?詳解源代碼與二進制SCA檢測原理

可以試試下面的漏掃服務,看看系統是否存在安全風險:>>>漏洞掃描服務

點選關注,第一時間了解華為雲新鮮技術~

繼續閱讀