程序分析:Android漏洞挖掘技术

           

Android漏洞挖掘技术

静态分析(控制流分析、数据流分析、结构分析)、动态分析、污点传播分析

过程内分析、过程间分析(函数调用)

漏洞挖掘开源工具:FlowDroid、AppAduit  、TaintDroid、AppIntent

程序分析:Android漏洞挖掘技术_第1张图片

反编译:Apk=>伪代码=>三地址码

Apktool(apk转换为smali)-dex2jar(dex转换为jar)-smali/baksmali(dex转换为smali)

aDFAer:基于过程间分析的Android程序隐私泄露检测的研究

Android操作系统结构:应用程序结构-安全机制(权限管理机制,沙箱机制)

隐私数据PII:日志信息,设备相关信息IMEI/SIM,通讯录和通话记录,短消息纪录,地理位置信息

隐私泄露:网络连接泄露,短信息发送泄露,向手机内部泄露

自动化隐私泄露检测工具预处理(字节码>伪代码)、控制流分析(控制流图|调用信息图)、数据流分析(到达-定值分析、常量分析、别名分析、类型分析)、污点分析传播路径(源点,锚点)

控制流分析(逻辑控制关系):控制流图CFG(基本块起始语句>生成基本块>添加控制流边)-调用关系图(Worklist算法)

     基本块起始语句:第一条语句,调转语句的跳转目标,所有跳转语句的下一条语句

数据流分析(程序数据传递关系):

污点分析源点(发送程序的数据点)-锚点(接收数据的程序点)-传播路径

动态污点分析:污点数据(对源点的数据加上特定标记)->运行程序->检测锚点的数据中是否包含有污点数据->只覆盖主要数据传播路径)

静态污点分析:正向污点分析(所有依赖污点源点的数据全都标记为被污染的数据)、逆向污点分析(可能污点锚点的数据标记为污点数据)

检测技术框架

静态程序分析检测技术:预处理、控制流和数据流分析、污点分析

程序分析:Android漏洞挖掘技术_第2张图片

过程内分析:每一个函数的到达定值、常量、别名和类型进行分析

过程间分析(函数调用之间的数据流合并):自底向上重复操作语句 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系统架构和工作流程

程序分析:Android漏洞挖掘技术_第3张图片

第一阶段:APK文件-调用方法(invoke) 基本函数调用图 扩展函数调用图(包含所有显示/隐式控制流) 广度优先搜索算法 可疑路径集合

第二阶段:可疑路径集合(Dalvik字节码指令) 可疑代码路径p与源函数Fs和目标函数Ft的距离之和δ(p, Fs) + 条可疑代码创建全新上下

AppAudit执行器的状态机

        执行exec模式(执行规则)

        检查check模式(遇到目标函数)

        正常终止end模式

        模糊fuzzy模式(遇到操作数未知而无法继续执行的指令)

        异常终止fail模式(未知值过多或执行上下文不足而无法恢复执行)

程序分析:Android漏洞挖掘技术_第4张图片

系统实现:反汇编引擎的接口层、基于API分析的可疑路径选取、对象模型、执行器、污点分析、模糊执行、Android系统和设备模拟模块

程序分析:Android漏洞挖掘技术_第5张图片

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进程)

程序分析:Android漏洞挖掘技术_第6张图片

TaintDroid

隐私数据  污点标记-污染源

 截取-拼装-加密-传递

污点传播

程序分析:Android漏洞挖掘技术_第7张图片

Dalvik层五种类型的变量存储: 局部方法变量,方法的参数,类的静态变量,类实例的字段-数组

污点标记的传播技术:解释代码污点传播(赋值,参数传递,返回值)、原生代码污点传播(JNI机制)、二级存储污点传播、IPC污点传播

程序分析:Android漏洞挖掘技术_第8张图片

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:

程序分析:Android漏洞挖掘技术_第9张图片

Precise Flow-Sensitive Analysis精确流敏感分析

Taint analysis污点分析:

程序分析:Android漏洞挖掘技术_第10张图片

x.f -> z.g.f -> a.g.f -> b.f

On-demand alias analysis 按需别名分析:基于IFDS算法

向前分析:

程序分析:Android漏洞挖掘技术_第11张图片

向后分析:

程序分析:Android漏洞挖掘技术_第12张图片

维护上下文敏感度:

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

解决:向后向分析注入前向分析的上下文

程序分析:Android漏洞挖掘技术_第13张图片

维持流量敏感度: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漏洞挖掘技术_第14张图片

  1. 解析各种Android特定文件(布局XML文件,包含可执行代码和清单的dex文件

定义活动,服务,广播接收者的文件,应用程序中的内容提供者)

  1. FLOWDROID生成虚拟主方法从生命周期列表和回调方法。然后,该主要方法用于生成调用图和一个程序间控制流程图(ICFG)
  2. 污染分析:source->sink,报告包括完整的路径信息

FlowDroid源码结构:

https://blogs.uni-paderborn.de/sse/tools/flowdroid/

https://github.com/StevenArzt

  1. Jasmin
  2. Soot
  3. Heros
  4. soot-infoflow – contains a generic taint analysis通用的污点分析
  5. soot-infoflow-android – This models the Android lifecycle 生命周期建模
  6. 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的执行流

过程内分析的执行流:不存在函数调用

程序分析:Android漏洞挖掘技术_第15张图片

一般每种语言都有:transformation(转换)、optimizations(优化)、annotion(注释)三步

过程间分析的执行流:存在函数调用

程序分析:Android漏洞挖掘技术_第16张图片

soot会增加三个阶段:cg(call-graph generation)、wjtp(whole jimple transformation pack)、wjap(whole jimple annotation pack)。

你可能感兴趣的:(IS)