1. 污點分析的基本原理
污點分析可以抽象成一個三元組<sources, sinks, sanitizers>的形式。sources:污點源,代表直接引入不受信任的數據或者機密數據到系統中。sink:污點匯聚點,代表直接產生安全敏感操作或者泄露隱私數據到外界。sanitizer:無害處理,代表通過數據加密或者移除危害操作等手段使數據傳播不再對軟件系統的信息安全產生危害。
污點分析就是分析程序中由污點源引入的數據是否能夠不經無害處理,而直接傳播到污點匯聚點.如果不能,說明系統是信息流安全的;否則,說明系統產生了隱私數據泄露或危險數據操作等安全問題。
污點分析的處理過程可以分成 3 個階段: (1) 識別污點源和匯聚點; (2) 污點傳播分析; (3) 無害處理.
識別污點源和匯聚點:(1)使用啟發式的策略進行標記,例如把來自程序外部輸入的數據統稱為“污點”數據,保守地認為這些數據有可能包含惡意的攻擊數據。(2)根據具體應用程序調用的 API 或者重要的數據類型,手工標記源和匯聚點。(3)使用統計或機器學習技術自動地識別和標記污點源及匯聚點
污點傳播分析:顯示流分析:分析污點標記如何隨程序中變量之間的數據依賴關系傳播。即數據流傳播。隱式流分析:分析污點標記如何隨程序中變量之間的控制依賴關系傳播,也就是分析污點標記如何從條件指令傳播到其所控制的語句。即控制流傳播。
無害處理:污點數據經過該模塊的處理后,數據本身不再攜帶敏感信息或者針對該數據的操作不會再對系統產生危害。 正確地使用無害處理可以降低系統中污點標記的數量,提高污點分析的效率,並且避免由於污點擴散導致的分析結果不精確的問題。例如,加密庫函數應該被識別成無害處理模塊。
2. 污點傳播分析的關鍵技術
2.1 顯示流分析
靜態分析技術: 分析對象一般是源碼或者中間表示。 首先根據函數調用關系構建調用圖(call graph);然后在函數內部或者函數間根據不同的程序特性進行具體的數據流傳播分析。常見的污點傳播方式包括:直接賦值傳播、通過函數調(過程)用傳播以及通過別名(指針)傳播。
動態分析技術:首先需要為污點數據擴展一個污點標記(tainted tag)的標簽並將其存儲在存儲單元(內存、寄存器、緩存等)中,然后根據指令類型和指令操作數設計相應的傳播邏輯傳播污點標記。動態污點傳播分析按照實現層次被分為基於硬件、基於軟件以及混合型的污點傳播分析3類.
2.2 隱式流分析
靜態隱式流分析:路徑敏感的數據流分析往往會產生路徑爆炸問題。為了降低開銷,一種簡單的靜態傳播(標記)分支語句的污點標記方法是將控制依賴於它的語句全部進行污點標記,但該方法會導致過污染。
動態隱式流分析:首要問題是如何確定污點控制條件下需要標記的語句的范圍;第2個問題是由於部分泄漏(partially leaked)導致的漏報;第3個問題是如何選擇合適的污點標記分支進行污點傳播。
2.3
目前通用污點傳播分析技術面臨的主要問題和代表性技術:
3 實際應用
如分析Android的隱私泄露問題。
4 參考資料:
王蕾, 李豐, 李煉,等. 污點分析技術的原理和實踐應用[J]. 軟件學報, 2017, 28(004):860-882.
CMU污點分析課程PDF,Taint Analysis
北京大學軟件分析 課件
博客: