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的体系结构:
定义活动,服务,广播接收者的文件,应用程序中的内容提供者)
FlowDroid源码结构:
https://blogs.uni-paderborn.de/sse/tools/flowdroid/
https://github.com/StevenArzt
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)。