Android安全分析可以分为静态分析和动态分析,也可以分为基于特征与基于机器学习的分析。静态分析在安装前检测app的安全漏洞:下载Android系统的应用程序安装包APK,通过如Ded和Dex2Jar之类的工具进行反编译,将APK文件反编译为Java源文件或JAR文件,然后对其进行源代码级的解析。
静态分析的优点是无需运行代码,无需像动态分析那样改写Android系统源码,要求用户对Android系统进行重定制和安装定制版的ROM,因此速度快、轻量级。静态分析的缺点是因为无法真实模拟程序的动态运行,所以存在误报率高的问题。
基于权限的检测工具Kirin是早期有代表性的静态分析方法之一,它通过定义的一组规则识别危险的权限组合,其缺点是误报率较高。其他的静态分析解决方案还有:SCanDroid, DroidChecker, Chex,AndroidLeaks, Epicc等。但这些工具仍然有其局限性:有的没有进行组件间通信分析,有的没有考虑Android的事件驱动编程范式。
CoChecker 对此进行了改进,提出基于Android API调用将泄露路径分为两类的方法:权能泄露路径和敏感数据泄露路径。CoChecker可以自动识别Android应用中的这两类泄露路径,因为两种泄露路径都可能跨越多个组件,因此进行ICC分析是一项基本任务。
静态分析的方法多种多样,例如ScanDal以Dalvik虚拟机字节码为输入,检测Android应用程序的私密信息泄露。Chex是基于组件的静态分析方法。SCanDroid使用数据流分析方法进行静态分析,从应用的AndroidManifest.xml文件中提取权限,然后自动检测应用的数据流是否与这些权限一致。DroidChecker使用控制流图搜索和脏数据分析方法自动分析可能的敏感数据泄露路径。
相对于轻量级的静态分析,动态分析则是重量级的程序运行时的分析。在一般情形,需对Android系统进行重新定制与改写,包括改写安全机制;在原生Android系统中加入监视器,实时监视数据的流向;在危险函数调用时,检测所需权限等。动态分析的优点是,检测精度较高,缺点是重量级:需要修改Android系统源码,形成用户全新定制的操作系统,同时需要通过更新ROM安装这种定制系统。
TaintDroid提出了一种动态脏数据检测技术:对敏感数据进行污点标记,当它们通过程序变量、文件和进程间通信等途径扩散时进行跟踪审查。如果污点数据在一个泄露点(如网络接口)离开系统, TaintDroid就在日志中记录数据标记、传输数据的应用程序和数据目的地,实现对多种敏感数据泄露源点的追踪。但TaintDroid只考虑数据流,未对控制流(程序间交互,组件间交互,进程间交互)进行分析。TaintDroid、 Asdroid和Crowdroid 等都是一类基于行为的动态检测方法。
XManDroid是一种基于系统策略的动态分析方法,它扩展了Android应用架构,包含运行监控器、应用安装器和系统策略安装器3个模块。运行监控器由访问监控器、决策器、系统视图、权限、系统策略和决策组件构成。新增组件的功能是:决策器判断是否建立新的组件间通信链接;系统视图组件维护运行系统的状态;系统策略组件是系统策略规则数据库;决策组件是存储决策的数据库。应用安装器包括标准组件Package Manager和Permissions和新增的系统视图组件。由于安装新的应用程序会改变系统状态,故扩展了Package Manager的功能,使其可与系统视图进行通信。
系统策略安装器是新增模块,由策略安装器、系统策略、决策和系统视图4个新组件构成,提供在Android中间件层增加或更新系统策略的功能。 XMandroid通过系统策略检查算法判断能否建立新的组件间通信链接,有效地防止了运行时的权限提升。 XMandroid的局限性是:(1)未考虑通过隐蔽通道实现的权限提升;(2)仅考虑ICC,但应用程序间的通信还包括标准的Linux进程间通信机制等;(3)未考虑其他公开信道,如互联网Socket或文件系统通信等。
1. Zimperlich恶意软件:
最著名的三大AndroidRootExploit恶意软件是Zimperlich、Exploid和RATC(RageAgainstTheCage)。许多其他恶意软件都是在它们的基础上研发的,如DroidDream、Zhash、DroidKungFu和Basebridge。其中,DroidKungFu以加密方式同时包含RATC和Exploid。当DroidKungFu运行时,首先解密和发起“rootexploit”攻击,如果成功获取根权限随后就可以为所欲为。
Zygote是以root权限运行并用于孵化所有Android应用的系统服务。Zygote收到孵化app的请求后,对每个appfork一个子进程。在执行app代码之前,子进程通过setuid()切换到分配给app的一个无特权的UID。一般情形,root进程调用setuid()不会失败,因此Dalvik虚拟机不检查setuid()调用是否成功,导致setuid()调用失败时不终止进程运行。
Zimperlich攻击过程:(1)重复fork自身,最终耗尽所有的PID。即达到用户进程数的上限RLIMIT_NPROC。(2)向Zygote发送在新进程中孵化它的一个组件的请求。当Zygotefork一个子进程并试图创建app UID时,由于达到系统资源的极限,setuid()调用失败。这时,Dalvik虚拟机并不异常终止,使Zimperlich代码得以与Zygote相同的UID运行,即作为root进程运行。(3)重装可读写的系统分区,在其中创建setuid-rootshell。这样,Zimperlich可在此后任何时刻获得具有root权限的访问。
2. 提权攻击
Android提权攻击有别于前面的Root Exploit型攻击,提权攻击系指没有任何权限的恶意程序能够通过第三方程序获得所需的权限。Davi等人给出了下述定义:“一个拥有较低(较少)权限的应用程序访问拥有较高(较多)权限的组件而不受任何限制,称为Android系统的提权攻击”。有的文献也称此类提权攻击为“权限再次授权(Permissionre-delegation)”。
Android提权攻击举例app3中的组件1受权限P1保护,app1中的组件1没有权限,app2中的组件1拥有权限P1。因此,app1中的组件1不能直接访问app3的组件1,而app2中的组件1可以访问。但app2中的组件1不受任何权限保护,故app1中的组件1可以访问它,然后通过它获得访问app3中组件1的资格。这样,app1中的组件1就绕过了app3中组件1的保护机制完成了提权攻击。
Android提权攻击分类提权攻击可以分为两类:“困惑代理(ConfusedDeputy)”攻击与“合谋攻击(collusionattack)”。1988年,Hardy提出了所谓“困惑代理”的概念,问题源于操作系统编译程序的“一仆二主”,即编译程序运行时同时具有分别来自两个调用的不同权限。
Android提权攻击分类在智能手机情形,具有不同权限集的应用可以彼此通信,使恶意应用具有非法使用某些正常app权限的可能性。典型的攻击场景是:当一个有权限(但“困惑”)的app接口有漏洞时,恶意软件利用该接口漏洞实施困惑代理攻击。合谋攻击需要多个应用程序之间的相互配合,又可细分为直接攻击与间接攻击两个子类。顾名思义,前者依靠应用程序之间的直接通信;而后者依靠它们之间的间接通信。
攻击源A通过代理组件(C1,C2…)到达泄露点P埋下种子(如植入恶意代码),然后攻击源B对泄露点P进行攻击(如提权攻击)。即使检测器检测出攻击源B的攻击,攻击源A却依旧隐藏。
3. 中间人攻击 MITM
中间人(Man-In-The-Middle,MITM)攻击在Android中主要针对通过SSL/TLS加密的API。Fahl等人实现了一个名为Malldroid的工具,对13,500个包含SSL/TLS代码的app进行了静态分析,发现其中1,074个(占比为8.0%) app含有易受MITM攻击的安全漏洞。他们在这些含有漏洞的app中选择了100个热门应用进一步做了人工分析,发现其中41个应用程序的确不能对MITM攻击免疫。
4. 恶意软件变形技术
为规避恶意软件检测器和分类器的自动检测,恶意软件采用了一系列自保护的变形(transformation)技术,有时也称为隐身(Stealth)技术,包括熟知的混淆、代码加密、密钥置换、动态加载、代码反射和本地代码执行等。
DroidChameleon将变形分为3类:平凡的变形;通过静态分析可能发现的变形与只有通过动态分析才能发现的变形。平凡的变形不需要进行代码级的改变或AndroidManifest中存储的元数据的改变。例如重打包;反汇编与再汇编。通过静态分析可能发现的变形包括:重命名包;重命名标识符;数据加密;代码重排序;无用码插入;组合变形技术等。只有通过动态分析才能发现的变形包括:代码反射与字节码加密。