數字經濟時代,隨着開源應用軟件開發方式的使用度越來越高,開源組件逐漸成為軟件開發的核心基礎設施,但同時也帶來了一些風險和安全隱患。為了解決這些問題,二進制軟件成分分析技術成為了一種有效的手段之一。通過對二進制軟件進行成分分析,可以檢測其中的潛在風險,並提供對用户有價值的信息。
本文將從二進制軟件成分分析誕生背景、二進制文件可以分析哪些安全風險、二進制技術原理以及實踐應用等維度深度剖析二進制軟件成分分析關鍵技術。
01 為什麼需要二進制軟件成分分析
在工業系統、車聯網系統、銀行券商系統和嵌入式系統中,有無數的二進制程序和庫,這些源程序可能長期丟失或是私有的,這意味着無法使用常規方法對這些程序和庫進行修補或在源代碼級別上評估其安全性。
供應鏈場景下,對於採購的交付件製品,大多無法提供源碼,對於此類採購產品需要上線,或者需要集成到自研產品中的,則需要提前進行二進制製品的檢測,進行安全評估。
在整個數字供應鏈的場景下,二進制檢測的需求越發重要。
SCA的二進制檢測可以對源代碼檢測起到很好的補充:
- 二進制 SCA 檢測對象為二進制構建產物,無需源碼。
- 二進制 SCA 和源代碼 SCA 檢測階段不同,源代碼 SCA 在開發階段檢測,二進制 SCA 在測試、交付階段檢測。
- 在語言支持上互補,對 C++、C、Java、Go 等語言良好支持。
- 在檢測結果上給予補充,可檢測靜態鏈接庫和在構建過程中引入的開源軟件。
當然二進制成分分析也存在一些技術挑戰:
- 無法準確地確定程序中的變量和函數名。
- 分析過程可能會因為一些代碼混淆和程序加固技術而變得困難或無法進行。
二進制軟件成分分析和源代碼成分分析都不可或缺,在不同的階段和場景下具備各自的優勢。
02 二進制文件可以分析哪些風險
高級語言和二進制機器語言之間存在很大的語義鴻溝,因此很難知道它們如何進行聯繫。編譯後的程序不一定會符合開發者的意圖。存在二進制級別的後門程序和惡意代碼植入等可能被忽視的風險。
二進制軟件成分分析可以對提供的軟件包/固件進行全面分析,通過解壓獲取包中所有待分析文件,基於組件特徵識別技術以及各種風險檢測規則,獲得相關被測對象的組件SBOM清單和潛在風險清單。
主要包括以下幾類:
- 開源軟件風險:檢測包中的開源軟件風險,如已知漏洞、License合規等。
- 安全配置風險:檢測包中配置類風險,如硬編碼憑證、敏感文件(如密鑰、證書、調試工具等)問題、OS認證和訪問控制類問題等。
- 信息泄露風險:檢測包中信息泄露風險,如IP泄露、硬編碼密鑰、弱口令、GIT/SVN倉泄露等風險。
- 安全編譯選項:支持檢測包中二進制文件編譯過程中相關選項是否存在風險。
在瞭解二進制成分分析是如何分析出上述風險項之前,需要對二進制文件的定義,二進制文件的生成過程,以及二進制文件的基本結構和運行時的內存結構進行了解。
03 什麼是二進制文件
二進制文件通常指將屬於每個程序的所有二進制代碼(機器指令) 和數據(變量、常量等) 存儲在一個自包含文件中。這些文件包含可在對應系統直接運行執行的二進制文件,所以它們被稱為二進制可執行文件,或者二進制文件。
狹義的二進制文件被定義為除文本文件以外的文件。即:文件內容由0、1組成,均可被稱為二進制文件。
ELF格式和PE格式是Linux和Windows操作系統上使用最廣泛的二進制格式。
PE格式(Portable Executable):應用於Windows操作系統,包括可執行文件“EXE、SCR”、動態鏈接庫“DLL、OCX、CPL、DRV”、驅動“SYS、VXD”、對象文件“OBJ”;
ELF格式(Executable and Linkable Format):應用於Unix、Linux系統,包括可執行文件、動態鏈接庫“so”、可重定位文件“o”、內核模塊“ko”;
Mach-O格式(Mach Object File Format):應用於MacOS系統,類似於 Linux 和大部分 UNIX 的原生格式 ELF(Extensible Firmware Interface);
其他格式:移動設備應用程序“APK、IPA”,壓縮文件“lzma、xz、zip、bz、tar、arj、lzo 、tar.gz、rar、7z、rpm、deb”,固件鏡像“uimage、fit image、zimage、IMG0、TR”,文件系統“cramfs、yaffs、jffs2、cpio、squashfs、ubi”等。
04 二進制文件是如何生成的
圖1 二進制文件生成流程
二進制文件生成主要有四個步驟,以C語言為例:
- 預處理: 使用預處理器(cpp) 處理C語言文件中的預處理命令。這時候C語言文件還是一個.c文件;
- 編譯: 使用C編譯器gcc,將C語言源碼文件編譯成彙編文件file.s.;
- 彙編: 使用匯編器as將彙編代碼彙編成二進制的.o文件 (又稱目標文件);
- 鏈接:最後使用鏈接器ld將目標文件和目標文件中用到的一些庫文件進行鏈接生成Linux下elf格式的可執行文件a.out,這個可執行文件才可以在Linux平台下面運行。
05 代碼二進制文件基本結構
在開始分析二進制文件之前,我們需要先了解二進制文件的基本結構。一個ELF二進制文件通常包括以下幾個部分:
.data:已經初始化的全局變量/局部靜態變量;
.bss:未初始化的全局變量/局部靜態變量;
.got.plt:全局偏移量表,保存全局變量引用的地址;
.rodata:只讀數據;
.text:代碼節,保存了程序執行的代碼二進制指令;
.init:程序初始化和終止的代碼;
Header:包含程序的基本信息,如入口地址、代碼段的起始地址、數據段的起始地址等。
圖2 二進制文件結構和運行內存結構關係
當運行可執行文件時,OS會fork一個進程,execve把可執行文件加載到進程的用户態內存,然後從內核返回,再跳轉到ELF文件的入口地址_start,調用main()函數,進入代碼段。
進程的內存段包括:
stack:棧,向低地址生長;
heap:堆,向高地址生長;
data:讀寫權限的數據段;
code:具有執行權限的數據段。
可以看到和源碼相關的是代碼段,對應二進制文件的.rodata節,.text節,.init節,header。其中rodata(read-only-data)段存儲常量數據,比如程序中定義為const的全局變量,#define定義的常量,以及諸如“Hello World”的常量。
06 二進制軟件成分分析原理
二進制檢測技術分類
圖3 懸鏡SCA檢測能力分類樹形結構
可以將二進制成分分析技術分為兩類,或是這兩類的組合,具體如下。
靜態分析:靜態分析技術可在不運行二進制文件的情況下對二進制文件進行分析。這種方法有兩個優點: 可以一次性分析整個二進制文件,且不需要特定的CPU來運行二進制文件。可以在x86計算機上靜態分析ARM二進制文件。
靜態分析一般有兩種方式:靜態反彙編、基於多維特徵提取的比對。
靜態反彙編:涉及在非執行情況下提取二進制文件的指令。靜態反彙編的目標是將二進制代碼轉換為彙編代碼的過程。一些反彙編工具可以將二進制文件轉換為彙編指令序列,以幫助分析程序的代碼結構和控制流。通過反彙編可以還原程序的指令序列、跳轉指令、條件分支等控制結構,從而構建控制流圖。
源碼->編譯->二進制程序->反彙編-> 控制流圖(CFG)有向圖 G(V,E) 。
在生成控制流圖後,可以結合語法相似特徵,圖相似性特徵,函數相似特徵,以及常量字符串和立即數進行綜合分析,計算和開源組件的相似度和排名,來確定引入的成分信息。
但是反彙編也有一定的挑戰,對於不同編譯器,編譯安全配置,編譯優化等級,CPU架構等等都會導致彙編代碼的巨大差異,這對分析會造成很大的不確定性。
基於多維特徵提取的比對分析:從二進制文件中提取各類靜態特徵,並且從開源組件項目中也提取項目內部的多維度特徵。通過比對二進制製品中的多維度特徵和已知組件的特徵,來建立相似度和排序分析,最終過濾出符合條件的開源組件成分。
動態分析:與靜態分析相反,動態分析會運行二進制文件並在執行時對其進行分析。這種方法通常比靜態分析更簡單,因為可以瞭解整個運行時狀態,包括變量的值和條件分支的結果。
在應用執行過程中,利用運行時插樁檢測技術,檢測應用真實運行加載的第三方組件,可排除未執行加載冗餘的組件,檢測精度高。
相對的,僅能看到執行的代碼,因此這種方法可能會遺漏程序中一部分。但是遺漏的部分也可能是程序永遠不會觸達的部分,就算有風險也是可以忽略。具體需要結合漏洞可達性進行進一步分析。
圖4 運行時SCA技術基本原理實現
基於多維特徵二進制成分分析技術方案
二進制檢測流程如下圖所示:
圖5 二進制成分分析-檢測流程
對要檢測的包文件先進行遞歸解包和解壓縮,然後對解出的文件進行格式識別,判斷所屬的二進制文件格式。對不同格式的文件執行相應邏輯提取多維度特徵,再運用相似度算法,結合開源組件知識庫的靜態特徵進行相似度計算,過濾和排名,最終確定引入的開源組件名稱和版本。
二進制文件風險分析
從二進制文件中提取開源組件漏洞風險、許可證風險、安全配置、敏感信息。
漏洞風險:通過相似度算法確認組件GAV信息後,通過組件漏洞風險庫,可以確認是否有漏洞影響當前使用的軟件版本,如果當前使用的軟件版本不在影響範圍內,則初步説明漏洞可能不涉及。如果當前使用的軟件版本存在漏洞,可通過升級軟件版本至推薦版本解決。緊急情況下也可以通過產品中收集的社區或者廠商給出的patch修復方式臨時解決。
圖6 源鑑SCA工具-二進制成分分析組件詳情
許可證風險:基於組件GAV信息,可以分析出開源軟件及對應的License。可分析軟件是否合規,滿足准入要求。如果使用的軟件存在合規風險,則需要尋找相似功能且合規的開源軟件進行替代或者有針對性的規避觸發合規條款。
圖7 源鑑SCA工具-二進制成分分析許可證詳情
檢測安全配置:二進制文件頭裏面有一些字段參數的配置信息可以提取出編譯器上的不同編譯選項。檢測可執行二進制的編譯選項,比如PIE, RELRO, Canaries, ASLR。識別二進制文件有哪些保護是沒有開的。
檢測敏感信息:密鑰敏感信息、設備敏感信息、商業敏感數據、通用敏感信息檢查可以有效避免打包過程中無意引入的敏感信息,避免信息泄漏。每種敏感信息類型都有特定的格式,通過正則或其他方式設計匹配規則,提取符合規則的信息。比如 郵箱,電話號碼,用户密碼,身份證號,IPv4,IPv6,URI,TOKEN, 私鑰,公鑰,MAC地址,GIT/SVN倉庫弱口令、硬編碼密鑰等風險等等。
檢測敏感文件:對用户上傳的軟件包/固件中存在的敏感文件如(密鑰文件,證書文件,源碼文件, 調試工具等)進行識別。
圖8 源鑑SCA工具-二進制成分分析敏感信息詳情
07 二進制軟件成分分析實踐應用
開發安全檢測
源碼級SCA結合二進制SCA的能力,預防開發流水線過程管控的疏漏,即使中途更換組件版本或配置錯誤的編譯選項,仍可在編譯構建和製品打包活動結束後進行二次檢測。
圖9 軟件生產二進制檢測階段
無論在CI/CD Pipeline中自動拉取或手動上傳,在檢測後均可為軟件製品的安全上線提供安全檢測分析報告。
圖10 豐富的接入二進制檢測場景
供應鏈安全檢測
利用二進制分析,將不同供應商的系統、自研應用集成之後進行統一的系統安全測試,釐清責任歸屬,發現問題及時通知供應商進行修復。
圖11 二進制製品引入檢測
源鑑SCA結合運用豐富的知識庫指紋樣本:文件結構特徵、文件hash分析、各類靜態特徵等融合分析能力,全面提升掃描精度:
基於豐富的知識庫特徵樣本:知識庫覆蓋主流的代碼託管平台GitHub、GitLab、BitBucket、Gitee、Codeberg等,覆蓋C C++開源項目數超過8W+,JAVA開源項目數5KW+,生成的指紋特徵2億+;
二進制基於多維特徵的相似度檢測算法:算法穩定高效,可以做到覆蓋全面的CPU架構x86/x64,ARM/ARM64,PowerPC,MIPS;主流的操系統Linux,Android,Windows,MacOS,QNX;支持官方的文件格式APK文件,固件,鏡像,文件系統等的檢測;
精準定位:根據相似度算法的執行結果,能夠準確定位到具體的開源項目、版本,並關聯分析出子依賴的組件信息以及漏洞和許可的風險信息;
靈活的自適應:相似度閾值可動態調節,減少誤報和漏報的概率。
源鑑SCA在滿足實現源碼級檢測技術的基礎上,結合二進制SCA技術、運行時SCA技術及漏洞可達性分析等技術,有效幫助開發人員更好地管理和維護軟件成分,減少無效漏洞的運營幹擾,提高軟件的安全性和可靠性,助力企業建立並有效落地數字供應鏈安全治理體系,保障數字供應鏈安全。