Android之ICC机制(二)
前言
组件间通信(Inter-Component Communication, ICC)是Android特有的机制之一。以系列文章记录一下对ICC的认识。本文讲解第二部分“静态分析中ICC带来的问题及现有研究”。
静态分析中ICC带来的问题
静态分析是什么
静态分析是指在不执行程序的前提下对程序完成分析的手段。静态分析通常使用词法分析、语法分析、控制流分析、数据流分析等技术对程序代码进行扫描,验证程序是否存在漏洞或是否合规。
对于Android应用的静态分析中的ICC问题
因为Android应用程序中的组件间的通信(ICC)是在程序动态执行时,由Android系统来完成的,所以当采用静态分析手段获取Android应用程序的函数调用图(Call Graph, CG)来对程序进行建模时,ICC不能直接被CG包含。
现有研究
Epicc/IC3
IccTA
来自卢森堡大学团队的研究工作IccTA: Detecting Inter-Component Privacy Leaks in Android Apps(ICSE 2015),对于组件通信时敏感隐私数据泄露问题提出一个污点分析工具IccTA,实现在数据流分析中对通信的Android组件间建立精确连接并检测。
IccTA需要解决的主要挑战是为通信的组件,组件生命周期函数和应用中回调函数建立控制流。主要流程如上图,首先获得代码的Jimple中间表示,然后提取ICC link,通过在Jimple上插桩为通信的组件建立连接,并创建虚拟入口点dummymain()为组件生命周期和回调函数建立调用,最后使用模改后的FlowDroid进行污点分析,记录污点传播路径。
文章核心在于ICC建模,作者将startActivity()这类发起组件间通信的方法称为ICC method。将包含ICC method的source component 到target component的连接称为ICC link。三步提取ICC link:
step1:使用Epicc从Jimple文件中获得ICC method及其参数(e.g. action,category),并使用Epicc的改进工具IC3解析URI来支持Content Provider相关的ICC method。
step2:通过解析AndroidManifest文件匹配Intnet Filter,标识所可能的target component。同时因为Broadcast Reveiver可以在动态运行时注册,所以还分析字节码标识Broadcast Reveiver。
step3:通过Intent Filter,为ICC method匹配target component。
插桩方法以startActivity为例,如上图构造一个helper class IpcSC来建立连接。在Activity1中移除startActivity方法,调用IpcSC中的连接函数redirect0(Intent i),该函数中生成Activity2的实例,并调用Activity2的dummyMain()。Activity2增加一个构造函数Activity2(Intent i),并重载getIntent方法,通过Activity2(Intent i)显式传递intent,,完成对intent传递进行建模。
ICCBot
RAICC
RAICC: Revealing Atypical Inter-Component Communication in Android Apps(ICSE 2021)在上一篇文章Android之ICC机制(一)中有提到,即有些方法的原始目的不是用于ICC,但是可以用于实现ICC。通常这些方法会依赖PendingIntents 和 IntentSenders。