論文閲讀

Ruiguo Yang, Jiajin Cai, and Xinhui Han. 2022. Poster: TaintGrep: A Static Analysis Tool for Detecting Vulnerabilities of Android Apps Supporting User-defined Rules. In Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communications Security (CCS ‘22). Association for Computing Machinery, New York, NY, USA, 3507–3509. https://doi.org/10.1145/3548606.3563527

Introduction

作者描述說大部分的安卓漏洞都屬於邏輯漏洞(指的應該是應用層的漏洞),可以大部分分爲兩部分,第一部分數據,第二部分是對數據的處理。第一部分的不可靠的數據我們可以通過數據流分析得到,而對不可靠的數據進行操作則需要語義分析。

當前的安全研究者需要手動的去審計可能的漏洞點,然而由於第三方庫和大量的安卓程序的基礎設施和邏輯設計(具體有哪些呢),這非常消耗時間,也就需要高效的自動化的方式去分析。

有兩種,動態分析比如 Droidfuzzer,靜態分析如 Amandroid,DroidSafe,OAuthLint,但是由於這些分析大部分都缺少語義信息,面對如 try catch 處理不了,就會產生非常多的關於 Dos 的 false positive 報錯。

而有一些可以進行語義模式匹配的工具比如説 CodeQL 和 Semgrep,CodeQL 的缺點是他依賴於完整的代碼和編譯環境,然而這對於安全研究者而言可遇不可求。Semgrep 的缺點是它不能識別安卓的應用的組件(沒用過,不清楚這裏説的是什麽意思),也就不可能獲得那些可以有 vulnerable input 的組件。

綜上作者就提出了這種,既結合靜態分析中的污點追蹤,又結合語義匹配分析,還可以分析組件的(未開源的,逃)靜態分析工具。

image-20231005160301135

METHODLOGY

程序接收三個輸入,程序的 java 代碼、manifest files (應該是前文説的 components 分析) 、用戶自定義的規則,作爲輸入,報告可以的代碼片段。由於程序並不需要對源代碼進行處理,所以對於加殼的程序也只要脫殼了就能用。這個系統包含了兩個模塊,analysis module 與 filter module,如圖所示,寫作給出最後的報告。

System Design

analysis module 是爲了獲得基本的程式信息,對於 manifest 文件,提取了 enabled,exported,name,permission 和 intent-filter。對於應用程式,作者使用了 jeb 生成 call graph,並以 DFS 的方式生產了滿足後端規則的調用鏈。然後把這個調用鏈傳給 filter module。

filter module 的規則是由一開始的規則生成的,從 cross-function rules 變成 intra-function rules (這裏有點不清楚,什麽是 intra-function rules),然後子模塊迭代函數然後拿規則去匹配代碼,剔除不匹配的函數鏈。如果開啓了污點追蹤,就可以計算輸入最終能否影響到最終的 sink function。最後把這個調用鏈傳給輸出,由安全研究者手動的檢查是否是漏洞。作者這個模塊的實現是基於 Semgrep (沒用過,mark 一下)

Rules Description

作者抽象出了大部分安卓應用的漏洞特徵。

  • 存在 source function 到 sink function 的調用鏈
  • 攻擊者能控制 source function 的輸入
  • 在調用鏈中存在不當的或者不完整的 parameter filters

對於第一點和第二點,作者清楚的定義了分析路徑的 endpoints 和路徑上需要滿足的條件,比如函數名,能接受的 intents 以及是否對其他的 app 開放。對於第三個特徵,作者描述了數據流信息和模式信息。data-flow information 用來決定輸入是否能影響 end function,而 pattern information 用來決定是否調用鏈能否滿足相應的條件。

PRELIMINARY EXPERIMENT

作者定義了幾個漏洞規則,包括hard coded secret key,arbitrary file read/write/delete/reproduce,generic DoS,unsafe URL load。後文介紹了他們的兩種規則(主要是沒有源碼,這規則就很難想象)

Generic DoS

定義了 endpoint 是 getExtras 函數,并且用語義規則描述了不能被 try…catch 包裹。

這是他們定義的規則

(a) customized rules
1 semi-public components ^onCreate$
2 arbitrary components Landroid/content/Intent; ->getExtras()Landroid/os/Bundle; 
3 semantic matching on 
4 semantic rules file rules.txt 
5 taint tracking off 
6 1 getIntent 

(b) rules.txt
NOT: | $TYPE $START(...) {
	... 
	try { 
		... 
		$END(...); 
		... 
	} catch (...) { 
		... 
	} 
	... 
}

作者發現了70多個 Dos 的0day,還是蠻有價值的。

Arbitrary File Read/Write

endpoint 為 setResult 函數。這個函數可以傳回帶有 flag 的 intent,可能存在任意文件讀寫的漏洞。

和剛才的規則非常相似,就不 Ctrl CV 了。

因爲惡意程序需要能夠控制 intent 的 data 和 flag 部分,此處的語義規則需要找到所有能對 intent 的 data 和 flag 有一些的系統函數。(這裏有一些不知所云,可能安卓的洞瞭解的比較少)

最後作者找到了 6 个任意文件讀寫的漏洞,

CONCLUSION

作者基於污點追蹤語義分析实现了自定義規則的漏洞挖掘

作者沒有開源代碼,并且只有寥寥3頁 倒是非常節省閲讀論文的時間

PS

還有很多細節,相關的論文和工具,可以深入瞭解。