源代碼與二進(jìn)制文件SCA檢測(cè)原理
1、源代碼與二進(jìn)制的關(guān)系和特點(diǎn)
SCA(Software Composition Analysis)軟件成分分析,通俗的理解就是通過(guò)分析軟件包含的一些信息和特征來(lái)實(shí)現(xiàn)對(duì)該軟件的識(shí)別、管理、追蹤的技術(shù)。SCA具體的檢測(cè)原理又是如何實(shí)現(xiàn)的,源代碼和二進(jìn)制文件的SCA檢測(cè)又有哪些相同點(diǎn)和不同點(diǎn),下面內(nèi)容就來(lái)回答一下上述疑問(wèn)。
對(duì)應(yīng)編譯類型的語(yǔ)言(C/C++/Go/Rust),都是遵循:源代碼—>編譯—>鏈接—>二進(jìn)制文件的過(guò)程。影響二進(jìn)制文件的因素包括不同的CPU架構(gòu)(ARM、X86、PPC、MIPS…),不同的操作系統(tǒng)(Wndows、Linux、iOS、Android…),不同的編譯優(yōu)化選項(xiàng)(O0~O3),即使是同一套源代碼,最終編譯生成的二進(jìn)制文件之間也是差別非常大的。注:上述影響因素不涉及java語(yǔ)言
從上面可知源代碼和二進(jìn)制文件之間存在巨大的差別,源代碼是基于高階語(yǔ)言來(lái)編寫,是給人看的,人看了很方便理解其中語(yǔ)句的語(yǔ)義;而二進(jìn)制是由流(指令流或字節(jié)流)來(lái)構(gòu)成的,是給計(jì)算機(jī)“看”的,對(duì)人來(lái)說(shuō)是非常不友好,不好理解。
源代碼包含了變量符號(hào)類型、函數(shù)名稱、類名稱、代碼邏輯結(jié)構(gòu)等大量豐富的代碼信息,相反為保留二進(jìn)制文件的緊湊性,編譯生成的二進(jìn)制文件中會(huì)丟棄掉很多運(yùn)行時(shí)用不到的信息,只保留程序正確運(yùn)行必要的信息,比如被丟棄的信息有變量類型、變量名稱等符號(hào)信息,可能被保留的有類名稱、函數(shù)名稱等信息,一定會(huì)保留的有常量字符串?dāng)?shù)據(jù)。另外為了保證程序的正確運(yùn)行,還會(huì)有保留一個(gè)相應(yīng)的配置信息,比如jar包中的manifest信息、POM信息、maven信息、資源文件等。基于這些特點(diǎn)源代碼SCA和二進(jìn)制SCA的檢測(cè)原理也存在很大的不同。
2、源代碼SCA檢測(cè)原理
由于源代碼中包含有豐富的程序信息,因此源代碼的SCA檢測(cè)既有大顆粒度的檢測(cè)方法,也有細(xì)顆粒度的檢測(cè)方法。
2.1 大顆粒度檢測(cè)方法:根據(jù)源代碼文件的相似度來(lái)判斷屬于什么組件和版本;文件相似度可以基于hash的嚴(yán)格匹配方法,也可以根據(jù)文本相似度匹配方法;這種匹配方法的優(yōu)點(diǎn)是效率高,匹配速度極快,確定是也很明顯,基于hash的容易漏報(bào),基于文本相似度的準(zhǔn)確率低;
2.2 細(xì)顆粒度檢測(cè)方法:經(jīng)過(guò)源代碼—>詞法分析—>Token提取—>語(yǔ)法分析—>AST抽象語(yǔ)法樹—>語(yǔ)義分析過(guò)程來(lái)提取相應(yīng)的數(shù)據(jù),再通過(guò)機(jī)器學(xué)習(xí)、NLP、CFG調(diào)用圖、DFG數(shù)據(jù)流圖等等匹配算法進(jìn)行代碼相似度的檢測(cè),這種基于語(yǔ)義的代碼相似度檢測(cè)與基于文本相似度檢測(cè)相比準(zhǔn)確率高;
2.3 具備包管理機(jī)制的語(yǔ)言,比如Java、Go,可以通過(guò)引用的開(kāi)源軟件包信息來(lái)實(shí)現(xiàn)開(kāi)源軟件的關(guān)聯(lián)分析,這種方法可以幾乎可以100%準(zhǔn)確的分析出引用的開(kāi)源軟件名稱。
3、二進(jìn)制SCA檢測(cè)原理
3.1 雖然好多源代碼中具有的信息在二進(jìn)制文件中不存在,但是對(duì)于常量字符串、部分類名稱、函數(shù)名稱、以及一些配置信息還是存在的,并且這些信息具備一定的不變性,即受cpu架構(gòu)、不同編譯優(yōu)化選項(xiàng)的影響很小,因此二進(jìn)制SCA主要從二進(jìn)制文件中提取這些方面的不同特征,再運(yùn)用匹配算法進(jìn)行相似度計(jì)算,并根據(jù)相似度門限來(lái)檢測(cè)出引用的開(kāi)源軟件名稱和版本號(hào)。
3.2 結(jié)合分析二進(jìn)制代碼中的CFG調(diào)用圖、DFG數(shù)據(jù)流圖等信息進(jìn)行更加精準(zhǔn)的檢測(cè),但由于這些分析需要對(duì)二進(jìn)制文件進(jìn)行指令反匯編,導(dǎo)致分析時(shí)間非常的長(zhǎng),分析效率低下,因此這種SCA檢測(cè)方法不適合對(duì)大規(guī)模二進(jìn)制文件進(jìn)行掃描。
4、源代碼SCA和二進(jìn)制SCA功能對(duì)比
比較項(xiàng) | 源代碼SCA | 二進(jìn)制SCA | 備注 |
---|---|---|---|
檢測(cè)對(duì)象 | 源代碼 | 二進(jìn)制 | |
檢測(cè)效率 | 高 | 高 | |
檢測(cè)準(zhǔn)確率 | 稍高 | 高 | 檢測(cè)準(zhǔn)確率和目標(biāo)程序引用開(kāi)源軟件功能多少相關(guān) |
嵌套組件檢測(cè)能力 | 弱 | 強(qiáng) | 二進(jìn)制中不會(huì)遺漏所有引入的開(kāi)源軟件功能特征信息 |
檢測(cè)語(yǔ)言種類 | 多 | 少 | 二進(jìn)制SCA只支持能夠編譯出指令流或字節(jié)流二進(jìn)制文件的語(yǔ)言 |
文件格式 | 簡(jiǎn)單 | 復(fù)雜 | 源代碼都可看作文本格式,二進(jìn)制文件存在pe、elf、coff、jar、apk… |
文件特點(diǎn) | 一個(gè)開(kāi)源軟件包含N源碼文件 | 一個(gè)二進(jìn)制文件包含N個(gè)開(kāi)源軟件 | 一個(gè)開(kāi)源軟件由N>=1個(gè)源碼文件;一個(gè)二進(jìn)制文件包含N>=1個(gè)開(kāi)源軟件 |
檢測(cè)階段 | 開(kāi)發(fā)階段 | 測(cè)試階段 | |
檢測(cè)繞過(guò) | 存在 | 不存在 | 源碼在構(gòu)建環(huán)境中引入或鏈接靜態(tài)庫(kù)引入的開(kāi)源軟件存在繞過(guò)源代碼SCA檢測(cè) |
樣本特征構(gòu)建難度 | 低 | 高 | 需要編譯構(gòu)建出二進(jìn)制 |
人工確認(rèn)分析難度 | 低 | 高 | 源代碼人工對(duì)比分析容易 |
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
807瀏覽量
42314 -
SCA
+關(guān)注
關(guān)注
1文章
37瀏覽量
12189 -
源代碼
+關(guān)注
關(guān)注
96文章
2953瀏覽量
68339
發(fā)布評(píng)論請(qǐng)先 登錄
偏移二進(jìn)制和二進(jìn)制補(bǔ)碼如何和實(shí)際數(shù)據(jù)對(duì)應(yīng),如何轉(zhuǎn)換?
bcd編碼的應(yīng)用 bcd與二進(jìn)制的區(qū)別
hex格式和二進(jìn)制的區(qū)別
在線二進(jìn)制編碼器:數(shù)據(jù)轉(zhuǎn)換的快捷通道
base64字符串轉(zhuǎn)換為二進(jìn)制文件
ASCII碼和二進(jìn)制的轉(zhuǎn)換關(guān)系
二進(jìn)制編碼器的精度與分辨率
二進(jìn)制編碼器在自動(dòng)化領(lǐng)域的作用
二進(jìn)制編碼器在機(jī)器人中的應(yīng)用
二進(jìn)制編碼器的種類及特點(diǎn)
二進(jìn)制編碼器應(yīng)用場(chǎng)景 二進(jìn)制編碼器與模擬編碼器比較
二進(jìn)制編碼器工作原理 如何選擇二進(jìn)制編碼器
C語(yǔ)言生成可執(zhí)行二進(jìn)制文件的具體過(guò)程

評(píng)論