利用GCC插件實現(xiàn)代碼分析和安全審計
GCC 4.5.0開始引入的一項插件功能,允許用戶通過插件來干預(yù)GCC的編譯過程,獲取到GCC編譯過程中的各種數(shù)據(jù),甚至可以修改編譯過程中生成的中間數(shù)據(jù),從而達到修改最終生成的二進制文件行為的目的(注:特別需要注意的是GCC-Plugin的API是會隨版本變化的)。此特性從程序員的角度來看,就相當(dāng)于把原來GCC的黑盒編譯過程一下子打開了,GCC編譯的過程數(shù)據(jù)可以“大白于天下”,可以清清楚楚的看個夠。
下圖為GCC編譯架構(gòu)****
GCC編譯過程與插件的交互流程
注:圖引自DragonEgg 在"Reimplementing llvm-gcc as a gcc plugin"
開源GCC插件列表**** (來自https://gcc.gnu.org/wiki/plugins):
基于GCC此插件特性,從安全測試的角度來看,可以用它來干什么呢?
A.可以把GCC編譯過程的內(nèi)部數(shù)據(jù)結(jié)構(gòu)圖形化,方便分析應(yīng)用程序。****
圖形化對象可以是控制流圖、函數(shù)調(diào)用圖、支配圖、Tree結(jié)構(gòu)、Gimple結(jié)構(gòu)、RTX結(jié)構(gòu)、Pass列表等等。
下圖是Gimple層次圖**** :
B、 利用可以修改中間數(shù)據(jù)的能力,可以不用修改源代碼就能添加新功能的功能,從而實現(xiàn)動態(tài)安全分析、安全加固的能力。
在安全測試中為了監(jiān)控程序執(zhí)行路徑情況,需要通過動態(tài)插裝來實現(xiàn),常見的插裝工具有Pin、Dynamo,但這些動態(tài)插裝會對程序的運行性能產(chǎn)生影響,降低程序運行效率,嚴(yán)重的會導(dǎo)致程序不能正常運行。但如果能預(yù)先在目標(biāo)程序中把插裝代碼編譯進去,這樣既兼顧到性能,有兼顧到實現(xiàn)插裝的目的,一般要實現(xiàn)這個目的都是在源代碼層面由開發(fā)人員增加插裝代碼,但增加的代碼只是為了測試的目的,在實際發(fā)布版本中是不需要的,因此直接在源代碼層面增加插裝代碼就給代碼維護帶來的不便,但如果我們應(yīng)用GCC編譯器的插件能力,在編譯構(gòu)建過程中自動添加插裝代碼到最終生成的二進制文件中,這樣只需根據(jù)需要重新編譯就能得到不同目的的應(yīng)用程序而不需要修改任何一行源代碼,既增加插裝代碼的動作對上層是透明的。
基于上述在編譯過程中自動增加插裝代碼,可以實現(xiàn)對測試活動的度量和提升測試效率,比如測試時代碼覆蓋率的統(tǒng)計與度量,基于執(zhí)行路徑來優(yōu)化測試用例提升fuzz效率等等功能。
總結(jié):
利用GCC的插件功能,可以利用編譯過程中的內(nèi)部數(shù)據(jù)來幫助安全分析人員對程序進行安全分析和安全加固等事情,提升程序分析效率和分析精準(zhǔn)度。
審核編輯:湯梓紅
-
GCC
+關(guān)注
關(guān)注
0文章
105瀏覽量
24806 -
代碼
+關(guān)注
關(guān)注
30文章
4723瀏覽量
68238 -
插件
+關(guān)注
關(guān)注
0文章
320瀏覽量
22398
發(fā)布評論請先 登錄
相關(guān)推薦
評論