ConDySTA: 上下文感知的動態輔助靜態污點分析
Introduction
污點分析技術是一種跟蹤并分析污點信息在程序中流動的技術,是分析代碼漏洞,檢測攻擊方式的重要手段。污點分析技術可分為動態污點分析與靜態污點分析兩大類。
- 靜態分析在不修改且不運行代碼的前提下,對所有可能的路徑進行污點傳播,從而檢測所有可能的污點信息流。靜態分析理論上是soundness的,因此也容易產生誤報。在真實世界的復雜場景下,靜態分析也可能會出現漏報的情況。
- 動態分析側重檢測程序在實際運行的過程中污點數據的傳播情況,因此會遺漏運行過程中未觸發的路徑,且資源開銷較大。
由于動態特性代碼(反射,動態加載/代碼生成,外部代碼執行等)只有在運行時才能獲得具體信息,傳統的靜態污點分析無法精確地分析出其中可能存在的安全問題,也就導致了漏報率的上升。而現有的靜態污點分析工具通常會忽略這些動態語言特性,不考慮流向數據庫或文件的污點流。面臨上述問題,作者采用了動態輔助靜態的方式進行污點分析,但是簡單對動態分析結果進行整合又會導致上下文不敏感,進而導致誤報率提高。因此作者提出了ConDySTA,通過將動態分析的結果插入到靜態分析對應上下文的變量中。
Approach Overview
作者首先展示了一個在缺少動態分析情況下所導致的漏報。假定在方法 foo() 中 blocker() 接受的參數 in 值可以可以通過方法 foo2() 中的 blocker2() 獲取,一種簡單的情況是與服務器進行交互。顯然在這種情況下,靜態污點分析技術無法對污點變量的傳遞進行追蹤。作者將這種情況產生新污點變量的污點源稱為 intermediate source。
在動態分析的輔助下,通過追蹤 blocker() 和 blocker2() 的數據流,此次分析會將 intermediate source 處生成的新變量標記為污點變量,因此也能成功識別 line 13 處的污點匯聚點。但是由于該情況并沒有考慮動態分析的調用上下文( line 14-15 ),在 intermediate source 會產生一個新的污點流,從而導致了誤報。作者在此基礎上進行改進,通過考慮動態調用上下文,與動態分析上下文不匹配的靜態污點傳播路徑將被自動排除。

ConDySTA采用了FlowDroid(基于IFDS)作為其靜態污點分析部分,動態部分采用了 value-based 動態污點分析技術。雖然 value-based 動態污點分析技術無法處理控制依賴以及加密數據,但是其在黑盒的處理場景下仍具備優勢。

value-based 動態污點分析技術需要污點源的值,作者采用了安卓設備的用戶信息作為其污點值。
作者通過軟件測試生成的系統日志記錄字符串類型的返回值以及函數調用棧,并將返回值與上表進行對比,收集了返回類型為 java.lang.String 的方法作為 intermediate source
Evaluation
作者使用REPRODROID(a large and up-to-date benchmark which combines multiple earlier benchmarks,whose dataset primarily consists of small apps with labeled taint flows)和從Google Play選取的下載量前100的APP。在REPRODROID的基準測試中,在其他六種最新的分析工具產生了28個漏報上,ConDySTA降至12。對于real-world的APP污點分析,ConDySTA在FLOWDROID檢測出的281條污點流的基礎上檢測出額外的39條污點流。
