Android漏洞挖掘技術
靜态分析(控制流分析、資料流分析、結構分析)、動态分析、污點傳播分析
過程内分析、過程間分析(函數調用)
漏洞挖掘開源工具:FlowDroid、AppAduit 、TaintDroid、AppIntent

反編譯:Apk=>僞代碼=>三位址碼
Apktool(apk轉換為smali)-dex2jar(dex轉換為jar)-smali/baksmali(dex轉換為smali)
aDFAer:基于過程間分析的Android程式隐私洩露檢測的研究
Android作業系統結構:應用程式結構-安全機制(權限管理機制,沙箱機制)
隐私資料PII:日志資訊,裝置相關資訊IMEI/SIM,通訊錄和通話記錄,短消息紀錄,地理位置資訊
隐私洩露:網絡連接配接洩露,短資訊發送洩露,向手機内部洩露
自動化隐私洩露檢測工具:預處理(位元組碼>僞代碼)、控制流分析(控制流圖|調用資訊圖)、資料流分析(到達-定值分析、常量分析、别名分析、類型分析)、污點分析、傳播路徑(源點,錨點)
控制流分析(邏輯控制關系):控制流圖CFG(基本塊起始語句>生成基本塊>添加控制流邊)-調用關系圖(Worklist算法)
基本塊起始語句:第一條語句,調轉語句的跳轉目标,所有跳轉語句的下一條語句
資料流分析(程式資料傳遞關系):
污點分析:源點(發送程式的資料點)-錨點(接收資料的程式點)-傳播路徑
動态污點分析:污點資料(對源點的資料加上特定标記)->運作程式->檢測錨點的資料中是否包含有污點資料->隻覆寫主要資料傳播路徑)
靜态污點分析:正向污點分析(所有依賴污點源點的資料全都标記為被污染的資料)、逆向污點分析(可能污點錨點的資料标記為污點資料)
檢測技術架構
靜态程式分析檢測技術:預處理、控制流和資料流分析、污點分析
過程内分析:每一個函數的到達定值、常量、别名和類型進行分析
過程間分析(函數調用之間的資料流合并):自底向上重複操作語句 S<-> IN [S](輸入)-OUT [S](輸出)-GEN [S](産生集)-KILL [S](消除集)
污點檢測規則:API比對規則statement、API危險程度risklevel(0,1,2)、API功能描述state-description
檢測工具靜态邏輯視圖:Analyzer(總控子產品,圖形化顯示界面|檢測工具的驅動類)、Dedexer
(僞代碼反編譯子產品)、EntryPointAnalyzer(分析入口提取子產品)、InterAnalyzer(過程間分析子產品)、ControlFlowAnalyzer(控制流分析子產品) 、DataFlowAnalyzer(資料流分析子產品:常量分析、别名分析、反射分析、資料依賴分析、類型分析子子產品)、TaintAnalyzer(污點分析子產品)、TaintGraphBuilder(可視化生成子產品)
APPAudit:基于靜态程式分析方法的ANDROID應用程式行為審計
敏感資訊:短信、通話記錄、位置資訊、浏覽器曆史記錄
AppAudit系統:Dalvik位元組碼和Manifest檔案=>函數調用圖,擴充函數調用圖=>API分析=>可疑路徑(過高分析)->執行器(記憶體對象模型)、污點分析
AppAudit系統架構和工作流程:
第一階段:APK檔案-調用方法(invoke) 基本函數調用圖 擴充函數調用圖(包含所有顯示/隐式控制流) 廣度優先搜尋算法 可疑路徑集合
第二階段:可疑路徑集合(Dalvik位元組碼指令) 可疑代碼路徑p與源函數Fs和目标函數Ft的距離之和δ(p, Fs) + 條可疑代碼建立全新上下
AppAudit執行器的狀态機:
執行exec模式(執行規則)
檢查check模式(遇到目标函數)
正常終止end模式
模糊fuzzy模式(遇到操作數未知而無法繼續執行的指令)
異常終止fail模式(未知值過多或執行上下文不足而無法恢複執行)
系統實作:反彙編引擎的接口層、基于API分析的可疑路徑選取、對象模型、執行器、污點分析、模糊執行、Android系統和裝置模拟子產品
APPAudit:http://appaudit.io/、https://github.com/mingyuan-xia/PATDroid
patdroid.core:類classes,屬性fields和原始Java類型值的抽象
patdroid.permission: 指定每個Android API需要的Android權限
patdroid.fs: 一個模拟和簡化的Android檔案系統
patdroid.dalvik: Android Dalvik JVM指令和表示
patdroid.smali: 使用SMALI從APK中提取類,方法,字段和說明
patdroid.util:參數設定、日志、資料輸出
Android位元組碼動态分析分布式架構
靜态分析-動态分析
事件機制(虛拟機事件-Binder分析事件)
JVM
ShadowVM影子虛拟機
DiSL注入架構(JVMTI工具接口)
DVM
安卓應用組成(四大元件)
程序間通信Binder機制
匿名共享記憶體Ashmem
修改Dalvik虛拟機實作->安卓系統提供JVMTI接口->動态分析需要的虛拟機事件
位元組碼注入
dex2jar工具(DVM位元組碼>JVM位元組碼>DisL架構注入>DVM位元組碼)
目标虛拟機
通信(系統服務ACS-替換JavaAgent)
分析服務
分布式動态架構:
架構因素(複雜的控制流,資源有限)
架構設計(分析通信服務ACS、Zygote程序、應用程式程序、System server程序)
TaintDroid
隐私資料 污點标記-污染源
截取-拼裝-加密-傳遞
污點傳播
Dalvik層五種類型的變量存儲: 局部方法變量,方法的參數,類的靜态變量,類執行個體的字段-數組
污點标記的傳播技術:解釋代碼污點傳播(指派,參數傳遞,傳回值)、原生代碼污點傳播(JNI機制)、二級存儲污點傳播、IPC污點傳播
FlowDroid:精确的上下文,流,字段, 對象敏感和生存周期感覺的污染分析
Attacker Model攻擊者模型:
1 public class LeakageApp extends Activity {
2 private User user = null ;
3 protected void onRestart (){
4 EditText usernameText = ( EditText ) findViewById (R.id. username );
5 EditText passwordText =
( EditText )findViewById(R.id.pwdString);//source
6 String uname = usernameText . toString ();
7 String pwd = passwordText . toString ();
8 if (! uname . isEmpty () && ! pwd . isEmpty ())
9 this . user = new User (uname , pwd );
10 }
11 // Callback method in xml file
12 public void sendMessage ( View view ){
13 if( user == null ) return ;
14 Password pwd = user . getpwd ();
15 String pwdString = pwd . getPassword ();
16 String obfPwd = "";
17 // must track primitives :
18 for ( char c : pwdString . toCharArray ())
19 obfPwd += c + "_"; // String concat .
20
21 String message = " User : " +
22 user . getName () + " | Pwd: " + obfPwd ;
23 SmsManager sms = SmsManager . getDefault ();
24 sms.sendTextMessage(" +44 020 7321 0905 ", //sink
25 null , message , null , null );
26 }
Precise Modelling of Lifecycle生命周期精确模組化
入口、異步執行元件、回調Callbacks
CFG for dummy main method:
Precise Flow-Sensitive Analysis精确流敏感分析
Taint analysis污點分析:
x.f -> z.g.f -> a.g.f -> b.f
On-demand alias analysis 按需别名分析:基于IFDS算法
向前分析:
向後分析:
維護上下文敏感度:
Listing 2: Example for context injection
1 void main () {
2 Data p = new ... , p2 = new ...
3 taintIt (source() , p);
4 sink(p.f);
5 taintIt (" public ", p2);//僅傳播字元串public,x.f别名不包括
6 sink(p2.f);//不報告
7 }
8 void taintIt ( String in , Data out ) {
9 x = out ;
10 x.f = in;
11 sink( out .f);
12 }
問題:source-> in -> x.f ->out.f -> Line6 sink->p.f -> Line4 sink
解決:向後向分析注入前向分析的上下文
維持流量敏感度:activation statements激活語句
Listing 3: Example for activation statements
1 Data p = new ... , p2 = p;
2 sink(p2.f);
3 p.f = source();//設為激活語句:前向分析時污點激活,後向分析污點不激活
4 sink(p2.f);//不報告
問題:第一次調用sink絕對發生在p2.f變為污染之前,後向分析p.f->p2.f,前向分析報告任何p2.f洩露,導緻了line2的誤報
FlowDroid解決方法:activation statements
Implementation
FLOWDROID的體系結構:
- 解析各種Android特定檔案(布局XML檔案,包含可執行代碼和清單的dex檔案
定義活動,服務,廣播接收者的檔案,應用程式中的内容提供者)
- FLOWDROID生成虛拟主方法從生命周期清單和回調方法。然後,該主要方法用于生成調用圖和一個程式間控制流程圖(ICFG)
- 污染分析:source->sink,報告包括完整的路徑資訊
FlowDroid源碼結構:
https://blogs.uni-paderborn.de/sse/tools/flowdroid/
https://github.com/StevenArzt
- Jasmin
- Soot
- Heros
- soot-infoflow – contains a generic taint analysis通用的污點分析
- soot-infoflow-android – This models the Android lifecycle 生命周期模組化
- some configuration files for FlowDroid (sources and sinks, taint wrappers, callback lists)
Soot架構
Class類别:argument classes(給soot指定的classes)、application classes(被soot架構分析轉換輸出的那些類),library classes(被application classes引用的類,被用于轉換分析過程中的類)
Soot對象:Scene(完整的分析環境)、SootClass(soot加載的待分析的類或者soot建立的類)、SootMethod(SootClass中的單個方法)、SootField(SootClass中的字段)、Body(方法主體)
Soot的中間語言:grimple、shimple、jimple、baf
Soot的執行流:
過程内分析的執行流:不存在函數調用
一般每種語言都有:transformation(轉換)、optimizations(優化)、annotion(注釋)三步
過程間分析的執行流:存在函數調用
soot會增加三個階段:cg(call-graph generation)、wjtp(whole jimple transformation pack)、wjap(whole jimple annotation pack)。