1. 程式人生 > 其它 >讓資料大白於天下:GCC外掛實現程式碼分析和安全審計

讓資料大白於天下:GCC外掛實現程式碼分析和安全審計

摘要:如何利用GCC的外掛功能,輔助安全分析人員實現對程式的安全審計、漏洞檢測、安全加固等自動化處理能力,提升分析效率和精準度。

本文分享自華為雲社群《利用GCC外掛實現程式碼分析和安全審計》,作者:安全技術猿 。

GCC 4.5.0開始引入的一項外掛功能,允許使用者通過外掛來干預GCC的編譯過程,獲取到GCC編譯過程中的各種資料,甚至可以修改編譯過程中生成的中間資料,從而達到修改最終生成的二進位制檔案行為的目的(注:特別需要注意的是GCC-Plugin的API是會隨版本變化的)。此特性從程式設計師的角度來看,就相當於把原來GCC的黑盒編譯過程一下子打開了,GCC編譯的過程資料可以“大白於天下”,可以清清楚楚的看個夠。

下圖為GCC編譯架構

GCC編譯過程與外掛的互動流程

注:圖引自DragonEgg 在"Reimplementing llvm-gcc as a gcc plugin"

開源GCC外掛列表

(來自):

基於GCC此外掛特性,從安全測試的角度來看,可以用它來幹什麼呢?

A、可以把GCC編譯過程的內部資料結構圖形化,方便分析應用程式。

圖形化物件可以是控制流圖、函式呼叫圖、支配圖、Tree結構、Gimple結構、RTX結構、Pass列表等等。GCC VCG Plugin就是一個實現該功能的GCC外掛(參考連結資訊:

)。

下圖是Gimple層次圖:

B、利用可以修改中間資料的能力,可以不用修改原始碼就能新增新功能的功能,從而實現動態安全分析、安全加固的能力。

在安全測試中為了監控程式執行路徑情況,需要通過動態插裝來實現,常見的插裝工具有Pin、Dynamo,但這些動態插裝會對程式的執行效能產生影響,降低程式執行效率,嚴重的會導致程式不能正常執行。但如果能預先在目標程式中把插裝程式碼編譯進去,這樣既兼顧到效能,有兼顧到實現插裝的目的,一般要實現這個目的都是在原始碼層面由開發人員增加插裝程式碼,但增加的程式碼只是為了測試的目的,在實際釋出版本中是不需要的,因此直接在原始碼層面增加插裝程式碼就給程式碼維護帶來的不便,但如果我們應用GCC編譯器的外掛能力,在編譯構建過程中自動新增插裝程式碼到最終生成的二進位制檔案中,這樣只需根據需要重新編譯就能得到不同目的的應用程式而不需要修改任何一行原始碼,既增加插裝程式碼的動作對上層是透明的。

基於上述在編譯過程中自動增加插裝程式碼,可以實現對測試活動的度量和提升測試效率,比如測試時程式碼覆蓋率的統計與度量,基於執行路徑來優化測試用例提升fuzz效率等等功能。

總結:

利用GCC的外掛功能,可以利用編譯過程中的內部資料來幫助安全分析人員對程式進行安全分析和安全加固等事情,提升程式分析效率和分析精準度。

可以試試下面的漏掃服務,看看系統是否存在安全風險:>>>漏洞掃描服務

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