Android移动应用跨域攻击检测*
2019-01-23朱璋颖史云凡吴振宇燕锦华
朱璋颖 , 史云凡 , 吴振宇, 燕锦华
(1.上海犇众信息技术有限公司,上海 201199;2.上海电机学院,上海 200240;3.华东计算技术研究所,上海 201808)
0 引 言
智能手机、平板电脑和其他移动设备的普及,使得专为这些设备设计的软件应用程序得到了蓬勃发展。应用程序可以通过定制化的用户界面和简单的程序逻辑展示Web页面,如社交来往、新闻娱乐、Web邮件等。就Android平台而言,应用开发者可以通过WebView组件展示Web页面。WebView在Android平台上是一个特殊的View,其基于webkit引擎来展现web页面的控件,可作为移动应用内置的一款内核浏览器来加载和显示web页面。WebView内部的实现是采用渲染引擎来展示内容,提供网页前进、后退、放大、缩小、搜索等功能。目前,许多移动应用都采用HTML5和原生代码混合的开发方式,因为通过内置WebView加载网页比较灵活,只需要修改HTML页面即可升级应用。因此,WebView组件被广泛应用于移动应用,并为用户提供界面展示。
WebView组件能提供与浏览器应用类似的功能。不同的是,浏览器应用对其敏感数据和关键资源如cookie等,都提供浏览器级别的保护。具体而言,浏览器应用强制实施同源策略保护,将同域名、端口和协议的页面视为同一个域,一个域内的脚本仅有该域内的访问权限,不能访问其他域内的资源。同源策略的目的是保护用户的信息安全,防止被恶意的页面窃取信息。目前,所有浏览器应用都支持这个策略,WebView也不例外。但是,WebView同时也提供了一系列API,可以通过这些API定制化WebView组件配置,而不强制要求实施同源策略保护。开发人员使用不安全的API设置,可开启部分跨域访问的支持。在这种情况下,恶意脚本可以访问应用内敏感数据。不同的敏感数据会给用户造成不同的安全危害。典型的敏感数据如用户登录应用时在应用本地保存的身份凭证。攻击者通过跨域访问并获取身份凭证后,即可以受害者的身份登录应用并实现对移动应用用户账户的完全控制,这种攻击被称为应用克隆攻击。2018年1月,腾讯玄武实验室利用该类漏洞对支付宝应用进行克隆攻击,并“克隆”用户账户[1]。因此,利用同源策略的设置漏洞可造成WebView跨域访问安全漏洞,导致用户隐私数据泄露,产生严重的安全威胁[2]。
为检测跨域攻击漏洞,本文首先对由于WebView跨域访问[3]造成的应用克隆攻击进行建模,然后针对应用克隆攻击的条件,提供了一种基于soot的抽象语法树与数据流分析的静态检测方案,通过构造调用图(Call Graph)进行可达性分析和过程内数据流分析,最后将该检测方案实现为相应的检测工具。通过对大量的Android应用进行检测表明,该工具能够有效检测出Android应用是否存在跨域访问漏洞。
1 安卓移动应用跨域攻击漏洞
安卓应用中的WebView,提供一系列API来支持应用开发者进行定制化开发。某些API的设置会提供部分跨域访问支持。具体而言,WebView实现某些域的跨域访问涉及以下2个API设置:
(1)setAllowFileAccessFromFileURLs用 于 设置是否允许通过file url加载的JavaScript访问其他的file域本地文件。在Android 4.0及其以下默认值为允许(true),在Android 4.1以及以上版本默认值为禁止(false)。
(2)setAllowUniversalAccessFromFileURLs用于设置是否允许通过file URL加载的JavaScript访问其他域,默认值为禁止(false)。
如果应用开发者错误地将上述两个API的参数设置为true,就可产生WebView跨域访问漏洞。典型的漏洞利用方式是通过WebView跨域访问漏洞实现应用的克隆攻击。
具体而言,成功应用克隆攻击需要满足以下四个条件。
(1)WebView待加载的URL可被外部控制
受攻击的应用包含有可以被外部调用的WebView。该WebView能够加载外部可控的url,url可通过以下方式被加载:
①存在Activity组件暴露[4],并可以通过浏览器打开,传递特定的URI信息并加载。
②通过即时消息、资讯等内容中包含的链接信息点击加载。
(2)可在file域中执行任意js脚本
如果要在file域中执行任意js脚本,需要满足两个条件,一是WebView能够使用File协议,另一个是通过某种方式攻击者能够向受害者的本地环境写入任意js脚本。为了使WebView能够使用File协议,只需要将WebView相关API——setAllowFileAccess设置为true,默认值是允许。为了实现向受害者的本地环境写入js脚本,可通过浏览器实现自动下载网页到本地,并加载执行或通过其他方式在file域直接执行js语句。目前,公开的自动下载方式有两种。第一种方式是通过在页面中设置头部为“header("Content-Type∶binary/octetstream")”,此时会自动下载到sdcard/Download目录中[5]。第二种方式是通过在页面中设置头部为“header("Content-Disposition∶attachment;filename=op endb.html")”,表示以附件形式下载,自动下载到目录sdcard/Download目录中[6]。通过构造恶意链接欺骗用户点击打开时,就能自动下载包含有js脚本的恶意网页到本地,随后将该恶意网页传递给被攻击应用进行加载执行。
(3)通过js脚本获取本地文件内容并传输到远程服务器
为了实现这一目标,WebView首先需要允许js脚本可以运行,此时只需要将WebView相关 API——setJavaScriptEnabled要求设置为 true,默认值是不允许。随后,需要满足js脚本可以访问本地其他文件并传输到远程服务器,要求设置setAllowFileAccessFromFileURLs或者setAllowUniver salAccessFromFileURLs为true,就能读取本地文件内容并发送到远程服务器。
(4)通过分析确定关键目标文件或数据实现应用克隆
攻击者可获取相应移动应用存储在手机本地的信息,包括登陆凭证、照片、文档等数据。利用这些数据,攻击者可以在自己手机中复制用户应用状态,以用户的身份操作移动应用。
整个攻击场景只需要构造一条恶意链接欺骗用户点击,继而远程实现恶意脚本自动下载到本地,将脚本传送给可被外部调用的WebView进行执行即可。恶意链接可以利用通信软件、邮件等方式进行传播。由于这种漏洞是开发者的安全意识不足导致的,因此Google官方并没有修补漏洞的措施。用户只能通过安装更新后的移动应用来修复漏洞攻击。
2 检测方案
为了实现批量化自动检测Android应用中的WebView跨域访问漏洞,缓解可能的应用克隆攻击,本文基于上述对应用克隆攻击的利用条件进行分析,设计了一种静态检测方案。该方案结合过程间控制流分析和过程内数据流分析技术,快速且准确地发现应用是否可能遭受克隆攻击的威胁。
整个检测流程为:
(1)逆向分析获取应用代码等文件;
(2)字符串搜索以定位API特征等,包括有可导出Activity列表、WebView对象、URL加载的API和可引起WebView跨域访问的2个API;
(3)过程内数据流分析,以确定每个WebView对象的2个跨域访问API、1个File域访问API和1个js脚本运行的参数值。如果这些API参数设置为true,则可能存在克隆攻击,并记录下这些WebView对象位置;否则,判断该应用不存在应用克隆攻击可能性,开始检测下一个应用;
(4)基于语法树构造函数调用图进行控制流分析,分析(3)中记录的每个WebView对象,根据WebView对象获取其URL加载的API,分析从可导出Activity组件到该API的可达性,如果满足可达性要求,则记录该WebView对象URL加载的API并继续;反之,则选取下一个WebView对象;
(5)对(4)中记录的WebView URL加载API进行过程内的数据流分析,如果API参数是一个定值,则认为URL外部不可控;反之,则认为URL可能外部可控。待所有应用检测结束,还需要进一步人工审计。
由WebView跨域访问引起应用克隆攻击的检测流程如图1所示。
图1 WebView跨域访问引起应用克隆攻击的检测流程
检测流程共包括四个子模块,分别是逆向分析、特征定位、数据流分析和控制流分析。
(1)逆向分析
待检测的Android应用以APK的压缩包形式存在,需要对其进行逆向分析得到Smali代码和AndroidMainfest.xml文件。目前,存在很多开源且有效的逆向工具,如apktool[7]、baksmali[8]、jadx[9]等。利用这些工具可以对应用进行反编译。因此,逆向分析模块实现对逆向工具的集成,存储反编译结果并传递给特征定位模块。
(2)特征定位
根据应用克隆攻击的利用条件,需要定位到三类特征。
第一,要实现WebView加载的URL外部可控,可导出Activity作为一个攻击入口。安卓应用组件是否可导出依赖于组件在应用中的配置,其AndroidManifest.xml文件定义了组件的配置信息。位于该文件的android∶exported属性定义了组件是否可导出,即暴露在安卓环境中可被外部调用,该属性值默认为true。如果一个组件添加了android∶exported=true属性,则显示说明该组件是暴露的。另外,如果组件定义了intent-filter子元素且android∶exported没有设置,则默认表示该组件是暴露的,可以接收来自其他应用程序的Intent[7]。正是基于上述判断组件暴露的规则,通过脚本实现对AndroidManifest.xml文件扫描,从而快速定位可导出的Activity组件列表。
第二,定位引起WebView跨域访问的四个API,分 别 是 setAllowFileAccess、setJavaScriptEnabled、setAllowFileAccessFromFileURLs和setAllowUniversalAcc essFromFileURLs。由于前两个API默认为true,且出于业务需要,这两个API也会设置为true;而后两个API默认为false。因此,必须通过显示调用才能设置为true。实际操作时,直接通过字符串搜索后两个API的名字即可,记录API所在的类与方法。
第三,定位WebView加载URL的API函数。WebView加载HTML代码共提供了三个函数:loadUrl、loadData和 loadDataWithBaseURL。前者会传入一个Web页面链接,后两者传入HTML代码。本文只考虑API——loadUrl。实际操作时,直接通过字符串搜索该API的字符串即可,记录API所在的类、调用方法名和调用该API的WebView对象。
(3)数据流分析
数据流分析[10]是根据(2)中定位的API分析其参数赋值。数据流分析是在过程内实施的。在整个检测方案中,共有两处需要应用数据流分析。第一,定位到引起WebView跨域访问的四个API后,基于函数的Smali代码构造API参数变量的引用-定值链,从而确定API参数的值。如果对于同一个WebView对象,其四个API的参数值存在都为true的可能性,则继续分析;反之,只要其中一个API确定为false,则重新分析其他WebView对象。第二,对满足跨域访问的WebView对象定位其页面加载API即loadUrl,分析该API参数变量的引用-定值链。如果参数确定是一个定值,则认为该WebView虽然存在跨域访问漏洞,但是该漏洞不可利用,将其剔除;反之,则记录下该WebView对象、跨域访问API和loadUrl API所在的类和函数,以备人工审计。
(4)控制流分析
控制流分析即进行过程间函数调用分析,目的是分析作为攻击入口的可导出Activity是否存在以类中某个函数为起点到WebView对象loadUrl函数的调用路径。为进行可达性分析,使用反向搜索过程。在构建应用调用图的基础上,以API(loadUrl)为起点进行深度遍历。一旦遍历到的函数属于可导出Activity所在类,即停止扫描,且认为满足可达性要求,判断通过该可导出组件存在一条可以执行到WebView对象的loadUrl函数的路径。
按照上述检测方案,采用Java语言编写实现检测工具,使用soot[11]框架实现功能模块。
3 实验结果
在64位Windows系统、CPU为Intel core i7-4790以及内存为16 GB的实验环境下,在Janus[12]平台上选取下载量排行为前300个Android应用进行批量检测,共耗时约6 h。其中,逆向分析模块耗时约为7 800 s,特征定位和数据流分析模块共耗时约为4 510 s,控制流分析共耗时约为11 010 s,共检测出20个可疑应用。经人工确认,有3个应用满足应用克隆攻击条件。
以某证券应用为例,存在的可导出Activity:**.NewSplashActivity,如图2所示。
图2 NewSplashActivity在Android Manifest中的设置
经控制流分析,该Activity会接收外部URL链接并将其传入给**.WebViewActivity中的WebView组件的loadUrl函数进行加载,且该WebView对象将 setAllowFileAccess、setJavaScriptEnabled和 setAl lowUniversalAccessFromFileURLs相关的三个参数值设置为true,说明应用存在跨域访问漏洞,相关代码如图3所示。
图3 WebView相关API设置
综合上述分析可判断,该应用存在应用克隆攻击的漏洞。通过编写对应的攻击验证代码,可进一步验证该应用可被克隆攻击。
4 结 语
API设置不当引起的WebView跨域访问漏洞,可能被攻击者利用进行应用克隆攻击。本文通过分析应用克隆攻击的利用条件,提出了一个基于抽象语法树与数据流分析的静态检测方案,并且基于该方案实现了一个自动检测工具。经实验测试,该工具能有效检测出应用是否可被克隆攻击。但是,该检测方案只进行过程内的数据流分析会造成一定的误报,因此后续将考虑引入过程间数据流分析,以尽可能减少误报,提高检测效率。