李星政 黄晓昆 纪胜龙 覃铁伟 冯丙文
(1.暨南大学网络空间安全学院,广东 广州 510635;2.工业和信息化部电子第五研究所,广东 广州 511370;3.奇安信科技集团股份有限公司,北京 100044)
根据 Statcounte (2021)[1]研究显示,目前安卓以72%的份额主导智能手机市场,远超其他移动智能操作系统。这样庞大的市场引起大量攻击者的注意。尽管安全研究人员以及相关公司不断地改善安卓系统,但是软件应用安全仍然是一个严峻的问题,其中,敏感数据泄露尤为严重。因此,作为数据检测主要手段之一的污点分析引起了极大的关注。在污点分析[2-3]中,研究者通过污点分析过程中是否需要运行程序将污点分析分为静态污点分析和动态污点分析。笔者采用静态污点分析作为信息泄露的检测方案,静态污点分析指在程序不运行的情况下,通过代码对程序进行分析,避免出现路径覆盖不完整的问题。同时,该文提出通过构建双向污点流图来加速信息泄露检测方案的检测效率。
在安卓应用程序上,静态污点分析有多种应用方式[4]。在早期的安卓安全研究中,Hu、Enck 等人[5]提出了几款轻量级检测工具,这些工具基本都是通过分析请求的权限或调用的API方法来判断安卓应用的安全性。这些方法仅对代码进行了粗略分析,尽管这些工具的检测成本较低,但其检测的精度也比较低,常常会出现误判和少判的情况,很难达到一个较高的准确率。随着对信息泄露检测的重视,检测的方案也不断进步,Arzt S等人[6]提出1个适用于上下文、流、场和对象敏感的静态污点分析工具FlowDroid,它将前向污点分析与后向别名分析结合起来,从而实现高效精确检测,但是FlowDroid在一些大型应用程序中的运行成本较高。
在近几年的研究中,不少研究者针对安全检测的效率和精度进行了改进,Cai等人通过减少对当前应用版本与之前的版本中相同代码的检测来减少需要检测的代码数量,以达到降低成本的要求,但是在没有旧版本记录的情况,这种方法无法达到一个较好的效果。张婕等人[7]提出用FastDroid将污点分析和别名分析结合起来,从程序中抽象提取污染变量关系图和潜在污染流,并对其进行验证,从而提升检测效率。
为了检测Android工业App是否存在信息泄露的问题,该文基于静态污点分析技术设计了1个信息泄露检测方案。如图1所示,该方案主要分为3个模块,预处理模块、污点分析模块和污点流验证模块。其中,预处理模块作为基础,为方案的后续工作提供各种信息和配置,污点分析模块作为方案核心,以完成系统信息泄露检测的工作,污点流验证模块作为方案的增补,可以提高方案的准确率。该方案在预处理模块中对待检测的软件应用进行分析,提取软件应用的各种信息,同时配置系统的静态污点分析策略。在污点分析模块中,根据预处理模块采集的软件信息并结合预设好的规则对软件应用进行分析,从而构建污点流图。最后在污点流验证模块中利用污点分析模块生成的污点流图提取软件的污点流,在控制流图和调用关系图上进一步检查、证明污点流的可行性。
图1 检测方案
在预处理模块中,系统会根据软件应用以及预设的规则收集应用的信息以及配置系统的检测规则。首先,系统利用反编译工具对APK文件进行逆向处理,反编译出Dex文件等一系列与软件相关的文件。其次,为了更好地对应用进行静态污点分析和构建污点流图,系统会进一步根据一定规则将Dex文件反汇编为可以被用户更好理解的Smali代码文件。再次,系统利用词法分析算法和APK分析工具对软件应用进行解析,从而构建与软件对应的调用关系图(Call graph,CG)以及组件内的控制流图(Control flow graph,CFG)等分析信息,这些软件应用信息可以为静态污点分析模块检测软件应用信息泄露情况提供帮助。最后,系统将预先设置好的静态污点分析的规则与软件应用的权限申请进行匹配,根据应用申请的权限情况对之后的信息泄露检测的规则进行配置,如果应用申请的权限涉及敏感信息,系统便对该权限对应的规则进行配置,反之则不配置该权限的污点分析规则,例如应用如果存在申请外部文件读写权限的情况,系统就会增加针对外部文件泄露检测的规则,这样避免了对应用进行不必要的完全检测。如果应用并没有申请短信权限,但系统依旧对应用进行的短信泄露敏感信息进行检测,就会导致浪费大量的资源。同时,该配置可以达到有针对性检测的效果,这样可以满足信息泄露检测的需求,从而加快检测速度。
在预处理模块中,对一个待检测的应用软件进行反编译后会得到一些对应的Smali文件,这些Smali文件具有良好的结构以及可读性,可以通过这些文件较好地对应用软件进行静态污点分析。同时,通过对应用软件的静态分析,构建该软件对应的CG图和CFG图,这些CG图和CFG图在污点分析模块和污点流验证模块上可以较好地为函数内执行顺序以及软件调用关系等提供帮助。最后通过过滤应用申请的权限得到有针对性的静态污点分析策略,这个策略在后续的模块中缩小了检测的范围,减少了不必要的工作。
2.2.1 静态污点分析
污点分析模块主要根据配置的污点分析策略对敏感的数据进行追踪分析,并根据信息流传播路径来判断该数据是否存在泄露的可能性。Smali代码相较于应用原生代码更容易被人理解和分析,因此该文针对安卓的Smali代码进行分析,从而实现静态污点分析模块,该模块设计的污点分析过程如图2所示。
图2 污点分析
首先,系统根据预处理模块配置的策略选择对应的Source和Sink,并构建静态污点分析的入口点函数。其次,通过匹配入口点函数相关的Smali语句对可能涉及的污点数据进行标记。最后,结合预处理模块的控制流图和预设的污点分析规则在函数内进行语法分析和污点数据追踪,如果发生函数间的调用情况,则根据污点分析规则结合调用关系图进入下一个函数继续进行污点分析。以外部文件泄露的Sink点作为入口点为例,系统先将写入外部文件的数据作为污点数据,之后定位该相关Smali语句,用该语句结合控制流图向前分析。如果发现该污点数据来自函数参数,则通过调用关系图查询调用该函数的函数。如果发现该污点数据来自函数返回,则根据调用的函数继续向前追踪。如果发现该污点数据来自与Source无关的新数据,则结束该污点流。系统通过反复函数内外的污点分析直到完成整个应用代码检测或者检测到信息泄露的存在,即Source到Sink存在一条或多条未经过无害化处理的信息流传播路径,则这条信息流传播路径可能是造成敏感信息泄露的路径。
在污点分析模块中,静态污点分析作为模块中的核心功能,其主要功能是通过分析软件构建Source到Sink的污点流图,这些污点流图中包括Source到Sink所有的信息流传播路径。这些污点流图将在之后的污点流验证模块中通过检测这些路径的正确性来进一步获取更准确的污点流图,从而得到软件的检测结果。
2.2.2 双向分析
因为在传统的静态污点分析过程中常常会随着分支语句的出现导致分析的数据越来越庞大,最后出现检测效率降低的情况,所以为了提高污点分析的效率,系统提出了一种新的污点流图构建方法。该方法是通过Source和Sink同时双向展开静态污点分析,从而减少单向分析造成多分枝的情况,进而实现减少一个需要分析的数据流传播路径的方法。具体来说,它首先在Source和Sink的相关Smali语句处同时展开静态污点分析,之后根据系统预定义的污点传播规则同时向后和向前遍历相关的Smali语句,以检测污点值及其别名的传播,并在多次污点传播迭代后构造应用的污点流图。如果污点流图中的Source和Sink中能够形成一条通路,则说明该应用存在信息泄露问题。以获取位置的Source点和写入外部文件的Sink点为例。首先,系统定位获取位置的函数的Smali语句和写入外部文件的Smali语句。其次,根据预设规则标记它们涉及的数据作为污点数据。最后,Source点的污点数据向后分析,Sink点的污点数据向前分析,2种分析交替进行,直到它们相遇或某个方向完成分析。该方法可以更快地检测到软件信息泄露的可能性,大大减少了检测所需要的时间。
系统中1个构建完成的污点流图必定存在1条或多条Source到Sink的数据传播路径,可以将这些数据传播路径看作未确认的污点流。而在污点分析模块中构建污点流图的过程中可能会因为一些执行语句顺序上的错误产生一些错误的判断,从而导致发现的数据传播路径是1条虚假污点流,这种虚假污点流尽管也可以在Source和Sink中形成1条通路,但这条路径可能在到达Sink之前就对来自Source的污点数据进行数据替换或进行数据加密等无法找回原有数据的操作,该情况并不会造成数据泄露。因此,系统添加1个污点流验证模块来检测污点流是否是正确的污点流,这个污点流验证模块对整个系统检测数据泄露的准确性起到至关重要的作用,能够大大减少系统对应用误判的情况,提高系统整体的准确率。
首先,在污点流验证模块中,系统通过抽取污点流图中Source到Sink的污点值流转路径作为待验证污点流。其次,通过结合软件的调用关系图以及控制流图来检测该污点流是否符合软件的调用过程和执行次序,如果污点流中的污点值流转次序不符合软件的执行次序,则判断该污点流是虚假的污点流。最后,系统将检测为正确的污点流作为结果呈现给用户。
为了对所提出的检测方案进行验证,该文实现了一个自动化的检测工具,同时通过该信息泄露检测工具对大量APK进行检测,以验证其有效性。在检测工具中,笔者对设备的敏感信息(例如位置信息、图片、设备信息和联系人等)是否在短信、网络、蓝牙、邮件以及设备存储等渠道发生信息泄露情况进行检测。
在试验中,笔者通过检测一款读取用户位置信息,并把位置信息存储为gpx文件的应用程序来测试该工具是否可以成功的检测应用的信息泄露情况。
检测结果见表1,该工具成功地检测出安卓应用中存在将位置信息泄露存储到内部文件的情况。同时,从检测结果来看,该自动化检测工具可以清晰地展示应用可能造成的敏感信息泄露的信息流传播路径,可以较好地为之后的应用修复提供参考,具有较好的实际应用场景。
表1 运行时间测试
为了更好地分析该方案的运行时间,笔者选择了3个生活中不同大小、真实使用中的APK文件进行检测,同时记录该工具检测应用程序所需要的运行时间,见表2。
表2 运行时间测试
从表2中可以看出,该检测工具的运行时间主要与APK文件的大小有关,通常APK文件越大,其检测时间越长。
目前,市面上大多数的信息泄露检测工具都需要人工的帮助来完成检测,这些检测时间周期大多为几十分钟到几天不等。该文所提出的自动化信息检测工具从具体的执行时间结合生活实际使用的应用来看,应用检测时间小于10 min,完全可以满足实际工作中对时间的需求。
该文针对安卓应用的敏感信息泄露情况提出了一个高效的检测方案,与以往的检测方案不同,该检测方案更专注于Source到Sink的情况,减少对应用全局的检测,从而提高检测效率。一系列试验结果表明,该方案具有更高效的检测效率以及更高的准确率。在未来工作中,将在该方案的基础上提高检测的灵活性,配置更全面的检测面。