­

漏洞檢測方法如何選?詳解源代碼與二進制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功能對比

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

 

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