從源碼分析快速實現對新開源軟件的檢測

語言: CN / TW / HK
摘要:本文簡單闡述如何基於源碼來生成二進制SCA特徵。

本文分享自華為雲社區《基於源碼的二進制SCA特徵生成技術》,作者: 安全技術猿。

在二進制SCA檢測原理中提到對於常量字符串、部分類名稱、函數名稱、以及一些配置信息還是存在的,並且這些信息具備一定的不變性;因此二進制SCA工具其中的一部分特徵來源就包含這些信息。因此在特徵庫保存有每個開源軟件的特徵,二進制SCA工具在檢測時會從待檢測二進制文件中提取出特徵,通過算法和特徵庫的保存的開源軟件特徵進行相似度計算,從而判斷該二進制文件中引用了哪些開源軟件及對應的版本號。

二進制SCA檢測處理流程:

從檢測流程和方法中可以看出特徵庫中保存的特徵來源並沒有規定一定從二進制文件中生成,而是隻要滿足特徵庫中的特徵必須和二進制中生成的特徵要一致,因為計算相似度時其中一個輸入的特徵是從二進制文件中提取到的。很明顯特徵庫中特徵來源無非就2條路徑:一條來自二進制文件,另外一條那就是來自生成二進制的源代碼。

不同特徵來源優缺點比較:

1. 二進制文件特徵提取優點:

基於二進制文件來提取特徵具有提取方便,和檢測時提取方法一致,不需要額外開發提取工具和提取算法。

2. 二進制文件特徵提取缺點:

  • a. 二進制文件首先需要由源代碼編譯出來,而搭建構建編譯環境可能會很複雜,需要很多額外的工作量,效率低;
  • b.由於編譯宏的原因,由源代碼生成的二進制文件並不一定是全量源代碼都包含中其中的,可能只有部分源代碼參與生成最終的二進制文件;
  • c.由於構建依賴的原因,二進制文件中包含有依賴對象的信息,也就是説包含有源代碼之外對象的信息,這會導致提取到的特徵純度不足,直接影響到檢測結果的準確性;

3. 源碼特徵提取優點:

正好可以解決從二進制文件中生成特徵的短板問題,不需要編譯可以大大提升自動化出來水平和提取效率,提取到的特徵只限於源代碼中的特徵和其他無關,提取到的特徵純度很高。

4. 源碼特徵提取缺點:

針對不同語言類型需要額外開發相應的特徵提取工具來實現特徵提取,開發工作量大,且不同語言的特徵提取工具開的發難度也不一樣,對開發者是一個挑戰。

基於源碼的特徵生成方法:

不同語言具有不同的特點,在考慮基於源碼的特徵生成方法時需要考慮到語言特點來採用針對性的方法來解決,這樣可以起到事半功倍的作用。下面針對不同語言分別來説明對應的解決方法:

  • C語言:沒有類的複雜性,在構建時只要用到的源碼文件,該文件中的所有函數信息都會被一起編譯進二進制文件中。
  • C++語言:引入了類的複雜性,在構建時只要引用了類的實例,該類信息才會被編譯到二進制文件中,而不像C語言一個源代碼文件是一個整體來處理的。另外類中的構造函數和析構函數會被編譯器自動引入在二進制文件中,從而出現源代碼和二進制文件不一致情況。
  • Java語言:也存在類的複雜性,特別是嵌套類和內部類的情況,這也導致源代碼特徵和二進制特徵之間的處理難點。
  • Go語言:具備依賴管理機制,但編譯出來的二進制文件卻和C、C++一樣具有PE、ELF格式,go語言的模塊特性也帶來了源碼提取的特徵和二進制之間的差別,此外go語言相比C、C++來説更容易生成對應源代碼的抽象語法樹AST。
  • Python語言:也具備依賴管理機制,但pyc和pyd之間差別很大,pyc是字節碼格式可以很方便的進行反編譯,但pyd則像C、C++一樣是指令碼式文件,因此特徵提取方法完全不一樣,同樣也帶來了源代碼提取特徵和二進制提取特徵之間的不一致問題需要解決,比如:1. python源碼在編譯成pyc時有一些編譯優化,在源碼提取特徵時要加入編譯優化,且不同版本編譯優化有差異,統一使用最多的編譯優化提取源碼特徵並且pyc文件提取特徵時也需要進行適當的優化;2. python不同版本同一代碼翻譯成的指令序列不一樣,pyc提取特徵時要兼容多個版本;3. py2、py3的pyc中字符串的編碼方式不一樣,而且unicode的支持範圍不一樣,需要保證字符串特徵提取一致;同樣Python源代碼也相對容易的可以生成對應源代碼的抽象語法樹AST。
  • 另外對於C、C++源代碼由於存在依賴和構建環境的原因而導致源代碼無法編譯,而很多工具需要能編譯成功才能獲取到AST的,比如CDT、Clang等,在這種情況下就沒法使用了,必須使用具備詞法分析和語法分析能力的工具來獲取特徵相關一些數據,比如cppcheck工具。不管是基於AST還是詞法、語法分析輸出數據,都需要自己在此數據的基礎上開發相應的數據分析工具來提取到最終的開源軟件特徵,並且該特徵數據和從二進制文件中提取到的特徵數據具有很好的一致性要求。

總結

只有具備從源碼中生成上述特徵,才能充分利用源碼特徵提取優點,進行自動化的特徵提取,提升特徵提取效率,快速實現對新出現開源軟件的檢測能力。

 

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