我們針對C/C++語言的程式進行資訊流追蹤。C/C++可被解構為數個procedure,procedure內由數個basic block組成,程式運作主要由basic block排列組合來完成各種功能需求,此操作背後由程式控制流進行操作。
動態資訊流追蹤為常見的偵測漏洞並預防惡意行為的方法,常見的漏洞像是透過Buffer overflow, format string以非法權限竊取資料,或非法注入程式碼使其跳轉到非預期的位址,而動態資訊流追蹤可以透過汙染機制追蹤潛在敏感資料以預防前者,後者則可透過監控執行期間控制流是否有被改變,從而判斷是否遭受攻擊。
我們在此提供了一種資訊流追蹤機制,方法為將C/C++轉譯為LLVM IR,在編譯時期在各basic block插入監控程式碼,此作法與過去的動態資訊流追蹤不同的是,無須依賴於特殊系統架構,可廣泛地應用於bare-metal嵌入式系統平台。
在應用程式編譯過程中,除了植入監控程式碼進行動態分析,我們同時基於靜態程式分析萃取程式參照地圖記錄程式內部固定的程式碼序列資訊,用以平衡動態資訊流追蹤易產生的overhead增加的問題。在分析階段,系統透過程式執行時期basic block的紀錄及程式參照地圖建構程式控制流,透過模擬呼叫堆疊及污染傳播的方式來重播污染傳播語意,我們可以進一步實作異常偵測機制來偵測應用程式是否有發生偏離原始設計的運作情形。