摘要:本文探討的是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功能對比
可以試試下面的漏掃服務,看看系統是否存在安全風險:>>>漏洞掃描服務