安卓Web到应用注入攻击分析

安卓上的Web到应用程序注入攻击:特征分析与检测

贝赫纳兹·哈桑沙希(B),贾耀奇,叶荣德,普拉提克·萨克塞纳,和梁振凯
计算学院,新加坡国立大学,新加坡,新加坡{behnaz,jiayaoqi,ryap,prateeks,liangzk}@comp.nus.edu.sg

摘要

传统的安卓应用程序(或应用程序)漏洞通常通过恶意应用进行漏洞利用。在本文中,我们研究了一类尚未被充分探索的安卓攻击,这类攻击不需要用户安装恶意应用,而只需在安卓浏览器中访问一个恶意网站即可。我们将此类攻击称为网页到应用注入(或W2AI)攻击,并区分了W2AI不同类别的副作用。为了评估其普遍性,我们提出了一种自动化的W2AIScanner工具来发现并确认W2AI漏洞。我们分析了来自官方Google Play商店的真实应用,发现在134个不同的应用程序中存在286个已确认的漏洞。这一发现表明,此类攻击具有广泛性,且开发者未能充分保护应用程序免受此类攻击。我们的工具采用了静态分析、符号执行和动态测试的创新结合方式。实验结果表明,与现有的最先进的分析方法相比,该设计显著提高了检测准确性。

1 引言

本文中,我们详细研究了一类在安卓平台上尚未被充分探讨的应用漏洞,这类漏洞允许恶意网页攻击者利用应用程序的漏洞。由于远程攻击者完全控制了从网页到应用的通信通道,且无需在设备上安装恶意应用,因此可能构成重大威胁。成功的攻击可同时利用Web API(WebView)和安卓上的原生API。

安卓平台提供了一个网页到应用通信桥接,以实现网页与应用之间的交互。该网页到应用桥接在安卓系统中用于通过网站直接调用已安装的应用程序。此功能具有多种良性用途,在谷歌应用商店中的许多流行应用程序中都有使用,例如,当用户点击谷歌地图上显示的企业电话号码时,可无缝切换至电话应用,而无需显式启动电话应用。

网页到应用桥接在用户通过浏览器访问网站时,使安卓应用程序暴露于未经审核的网站。如果未对源自URI或URI的“额外参数”进行适当的清理,易受攻击的应用最终会使用这些值在WebView中启动恶意网页或滥用安卓原生API。众所周知,网页到应用桥接可能导致漏洞[34],在本文中,我们研究现有应用程序是否容易受到此渠道的显著攻击,以及如果存在,其程度如何。我们系统地研究并分类了此类攻击,我们称之为网页到应用注入(W2AI)。网页到应用注入攻击不同于最近披露的其他漏洞。这些漏洞要么出现在混合移动应用框架的实现中,要么出现在基于此类框架编写的应用程序代码中,这些代码访问外部设备接口(例如摄像头)[9,14,17,26]。相比之下,本文研究的攻击是通过网页到应用桥接影响安卓应用程序。此外,W2AI攻击可以轻松与现有的应用间攻击相结合。

W2AIScanner

为了实现对W2AI的大规模检测,我们描述了一种用于分析安卓应用中W2AI漏洞的工具。仅依靠现有的静态分析技术不足以进行此类分析,因为应用程序的复杂性和规模限制了静态分析的精度。动态分析方法(如随机测试和无引导符号执行)则面临路径空间爆炸的互补性问题,导致分析成本高昂。在本研究中,我们采用基于精化的静态分析与动态测试相结合的方法,以克服这些单独技术所面临的挑战。W2AIScanner能够自动分析APK文件并生成可运行的(0-day)漏洞利用。因此,相较于纯静态的最先进的分析方法所产生的结果,其显著提高了准确性。它构建了一个见证漏洞利用——一个URI,供安全分析师(或应用商店)后续使用,以构造特定的攻击载荷来确定所发现漏洞的严重程度。

结果

首先,为了衡量W2AI漏洞的普遍性,我们开展了首次针对安卓系统中网页到应用注入(W2AI)攻击的全面研究。我们分析了来自官方谷歌应用商店的12,240个应用程序,其中1,729个应用暴露了可浏览活动。我们的工具通过自动构建286种攻击,发现134个应用(占1,729个应用的7.75%)存在W2AI漏洞。我们的结果表明,开发者常常忽视网页到应用漏洞对安卓用户构成的风险,采取的防范措施不足。我们已联系安卓安全团队,将漏洞披露给易受攻击的应用。腾讯安全团队已确认我们在腾讯Android SDK (2.8)[3]中报告的漏洞。

其次,我们发现W2AI攻击会在已安装的安卓应用中引入一系列可能的漏洞利用,这些漏洞利用类似于通常在Web应用中出现的漏洞——例如开放重定向、数据库污染、文件包含、凭证窃取等。此外,这些漏洞并不局限于特定应用框架(或SDK)的实现,因为它们可能出现在使用不同SDK编写的应用中。

第三,我们证明了我们的分析技术相较于最先进的静态分析技术,在可接受的分析成本下提供了显著更高的精确度。

2 概述

在安卓系统中,意图是安卓应用与其他应用程序共享数据以及访问系统服务的主要方式[1]。意图对象包含安卓用于确定要启动的组件的信息,以及接收组件用来正确执行操作所需的信息。例如,任何其他应用都可以通过意图调用邮件应用来发送电子邮件。

网页可以调用已安装应用中的组件,如果目标应用在其清单文件中将其一个或多个活动声明为BROWSABLE。当用户点击某种格式的网页超链接时,安卓会将其转换为一个意图(对象)。我们使用intent hyperlink来指代该超链接或其字符串,并使用 URI intent来指代安卓中意图机制的工作方式。意图超链接在超链接内携带参数——片段标识符,以及作为元组(scheme, host,path)等形式指定的目标活动信息等。

2.1 网页到应用注入攻击

URI意图暴露了一种针对已安装应用程序的新攻击渠道。

威胁模型 。在W2AI攻击中,我们假设攻击者是一个控制恶意网站的标准网页攻击者[4]。为了扩大受害者的覆盖范围,攻击者可以通过电子邮件、社交网络、广告等方式传播恶意网站的短网址。我们做出以下保守假设:假设受害者Alice仅从Google Play在其安卓设备上安装合法应用程序。我们还假设她设备上至少有一个具有足够权限的应用程序是良性的但存在缺陷,因此存在W2AI漏洞。

W2AI攻击 。类似于传统的网络攻击,当Alice直接访问恶意网站或点击重定向到该网站的链接时,就会发生W2AI攻击。W2AI的一个通用场景如下:(1)攻击者在社交网络中创建并发布一个恶意意图超链接;(2)用户在其移动浏览器中点击该恶意链接,重定向至攻击者的网站;(3)该网站在内嵌框架或新标签页中加载恶意意图超链接;(4)浏览器解析该超链接,生成URI意图,并启动易受攻击的应用中的相应活动;(5)因此,源自URI意图的有效载荷在应用中运行时,可访问用户的私人信息或代表应用执行特权操作。

W2AI漏洞源于原生安卓代码中的数据流,而非HTML5代码[9,14,17,26]中编写的應用逻辑。与其他利用应用间通信接口[8,24,40,42]的漏洞不同,我们强调W2AI攻击无需在设备上安装恶意应用即可发起攻击。

2.2 W2AI漏洞类别

安卓应用程序通常使用来自意图超链接的数据与Android API接口进行交互,这些接口可分为两类:WebView和原生接口。如果在使用攻击者可控数据时未经任何验证,攻击者便可注入有效载荷以滥用这些接口。我们将W2AI漏洞分为两类:(i) 滥用WebView;以及(ii) 滥用Android原生应用接口。

滥用WebView接口

WebView是安卓提供的一种浏览器组件,具备普通浏览器的基本功能(例如页面渲染和JavaScript执行),并能够访问各种接口(例如HTML5 API和JavaScript到原生桥接)。某些应用会从意图超链接中获取参数,并将其视为网页URL,在运行时加载到WebView中。当这种情况发生时,攻击者的HTML代码将在WebView中运行。此外,如果易受攻击的应用在WebView中启用了JavaScript执行,攻击者就可以在其HTML页面中运行JavaScript,并访问WebView暴露给它的所有接口。我们将因对暴露的接口拥有无限制访问而引发的漏洞进一步划分为4个子类别:

(1) 滥用JavaScript到原生桥接 。在WebView中加载的JavaScript代码可以通过android.webkit.JavascriptInterface访问原生方法。可访问的原生方法因每个应用程序而异。在我们的实验中,发现单个应用程序最多可访问29个不同的JavaScript到原生接口,例如,许多应用程序允许访问获取设备UUID、版本和名称的接口,从而带来隐私侵犯攻击的风险。此外,一些接口允许读取和修改用户的联系人列表以及应用特定的本地文件。

(2) 滥用HTML5 API 。WebView支持访问标准的HTML5 API,类似于普通网页浏览器,例如,如果易受攻击的应用具有相应的权限和WebView设置,则在WebView中运行的网页可以使用JavaScript调用HTML5地理位置API。我们发现了29个存在此类跟踪漏洞的应用程序。

(3) 本地文件包含 。当用户访问恶意网站时,该网站可通过将HTML文件设置为不可查看,诱使浏览器自动将该HTML文件下载到用户的SD卡中。当网站触发浏览器解析指向已下载HTML文件的意图超链接(例如:file:///sdcard/Downloads/attack.html)时,便会启动易受攻击的应用,并在其WebView中加载该HTML文件。如果该易受攻击的应用具有特定的WebView设置,则HTML文件中的恶意JavaScript代码便可读取应用目录下的任意文件或可读的系统文件(例如:/etc/hosts),并将其发送给攻击者。

(4) 网络钓鱼 。攻击者的网页可以仿冒或钓鱼原始应用的用户界面。由于WebView不会显示地址栏供用户检查当前网页的网址,用户无法区分钓鱼页面与正常页面。通过网页到应用桥接发起的此类攻击比网络上的传统钓鱼攻击更难被用户察觉[12]。

滥用Android原生应用接口

安卓应用程序,即使未使用WebView,如果输入未经过适当清理,也可能向URI意图暴露Android原生接口。这会导致以下四种类别的漏洞:

(1) 应用数据库污染 。安卓为应用程序提供了原生接口,用于执行SQL查询语句以管理应用数据库。因此,如果SQL查询来自URI意图,则允许网页攻击者污染(例如,添加或更新表的字段)易受攻击的应用的数据库。

(2) 持久化存储污染 。安卓原生接口使应用程序能够在持久存储(例如,SharedPreferences和本地文件)中存储持久状态,例如认证令牌。许多易受攻击的应用程序直接将来自URI意图的参数视为要添加或更新持久存储的内容。恶意的URI意图可污染目标应用程序的持久存储。

(3) 开放重委托 。安卓原生接口提供了通过名称启动特定活动的能力。如果名称参数源自URI意图,则允许网页攻击者直接调用应用内的任何私有活动,而这些活动无需标记为可浏览。此外,攻击者可能会将额外的意图超链接作为参数嵌入到原始意图超链接中,迫使良性应用调用另一个应用。这会导致一系列问题,例如权限重委托[13]。权限重新委托是一种混淆代理问题,即易受攻击的应用在攻击者的影响下访问关键资源。尽管此前已知此类攻击可通过应用到应用[13]实现,但我们表明,它们也可通过网页到应用桥接,在网站的影响下被触发。

(4) 应用特定逻辑漏洞 。安卓允许应用程序通过原生接口执行各种操作(例如,弹出消息)。由于应用特定逻辑漏洞,易受攻击的应用会直接将URI意图中的数据用作这些操作的参数。例如,我们发现攻击者可以利用易受攻击的应用程序显示伪造的PayPal交易状态。

我们以一个真实的应用为例来解释W2AI攻击的工作原理。该示例应用为WorkNet (3.1.0),是一款拥有100万至500万次下载量的韩国信息类应用。该应用包含一个可浏览活动kr.go.keis.worknet.WorknetActivity,能够加载URI意图中的任意网址,且易受以下W2AI攻击:滥用JavaScript到原生桥接、滥用HTML5 API、本地文件包含和网络钓鱼。该攻击的生命周期如下:(1)攻击者托管一个恶意网站,该网站使用window.open将一个意图超链接(“intent://#Intent;scheme=worknet;action=android.intent.action.VIEW;S.url=http://attacker.com;end;”)加载到新标签页中。攻击者在社交网络(如Facebook)上发布该网站的短链接。(2)当用户在其安卓浏览器中访问攻击者的网站(通过点击社交网络、广告等上的链接)时,网站会将该超链接加载到新标签页中。(3)用户的浏览器将该超链接解析为包含额外参数并启动WorknetActivity活动的URI意图。(4)该活动将从恶意URI意图中获取的网址(http://attacker.com)加载到WebView中,且未进行适当的验证。此时,攻击者的网站被加载,其JavaScript代码在WebView中运行。攻击者可利用该活动中可用的任何功能,例如滥用JavaScript到原生桥接。

我们发现WorkNet有21个此类接口,例如访问联系人、本地文件、设备信息等。此外,由于这是一个WebView应用,攻击者的网站可以模仿原始页面的用户界面。在后台,脚本会访问用户的私有数据(例如设备信息和联系人),并将这些数据发送到攻击者的服务器。除了滥用JavaScript到原生接口外,网页攻击者还可以滥用HTML5 API来追踪Alice的地理位置,并通过该应用中的文件包含漏洞泄露本地文件的内容。从这个例子可以看出,W2AI攻击者不仅可以发起传统的Web攻击(例如示例中的未经验证的重定向),还可以劫持易受攻击的应用,对敏感资源(例如本地文件和联系人)执行特权操作,而无需在用户设备上安装任何恶意软件。

2.3 检测挑战

我们的目标是设计一个既能检测又能确认W2AI漏洞的系统。W2AI攻击的目标是被定义为用于注入数据、从而使应用易受攻击的敏感/关键安卓和Java API的汇点。那些获取包含攻击者可控数据的意图对象的API调用被称为源。

从高层次来看,检测W2AI漏洞可被视为针对安卓应用的源到汇可达性分析。现有的安卓应用分析[5,16,25]采用静态分析技术,但这仅能提供潜在的可达性。我们将在第4节中展示,许多检测到的潜在源-汇流可能是误报(即被标记为数据流的潜在漏洞实际上在执行过程中永远不会发生)。我们通过生成可在执行期间触发并实际到达和影响汇点的意图超链接来消除这些误报。换句话说,只有在我们能够自动生成零日W2AI攻击的情况下,才会报告漏洞。这使得安全分析师或应用开发者解释和理解漏洞的任务大大简化。

安卓环境和应用程序的复杂性也带来了实际挑战。图1展示了在第2.2节中解释的WorkNet应用代码的简化版本,该应用存在W2AI漏洞。由意图超链接触发的可浏览活动是MainActivity。当用户在默认浏览器中点击恶意意图超链接时,系统会生成一个意图,并启动MainActivity。与Java程序不同,安卓应用没有main方法。当一个意图调用某个活动时,Android运行时会调用onCreate()或onNewIntent()回调方法。接下来,getIntent()和onNewIntent()方法获取意图消息。一旦意图被发送到某个活动,该活动中任何位置对getIntent()方法的调用都将返回该意图。

在此示例中,L12和L23行存在两个易受攻击的接收点,共有三条路径可到达这些接收点。然而,分析这些漏洞需要应对现有系统尚未充分解决的挑战。主要原因是从Dalvik代码构建控制流图(CFG)时存在局限性。我们发现,路径一和路径二的发生是由于(嵌套的)内部线程所致。该应用还使用了runOnUiThread(),它会将执行切换到活动的主UI线程。像FlowDroid这样的现有工具[5]未报告此路径,因为生成的CFG缺少通向易受攻击路径所需的边。我们注意到,在我们的数据集中有818个可浏览应用使用了线程。在此示例中,getIntent()调用在所有代码中恰好返回相同的意图消息。分析需要确定getIntent()所引用的意图。此示例还表明,分析必须是字段敏感的,因为恶意URL存储在this.url字段中,并且还需要对象敏感,以引用正确的MyRunnable类实例。

我们的分析不仅旨在准确找到源到汇的路径,还需要生成意图超链接的实例以确认漏洞。为此,我们在分析中使用了字符串上的符号推理及其他约束求解(如L11、L20行所示)。此外,对意图参数的操作可能依赖于应用清单中的意图过滤器。因此,除了字节码分析外,还需在分析中考虑来自应用清单的意图过滤器。

3 检测和确认W2AI漏洞

我们描述了一种工具W2AIScanner,它可以自动检测并确认W2AI漏洞。为了应对第2.3节中描述的挑战,W2AIScanner如图2所示分为四个阶段工作。下面我们介绍每个阶段。

3.1 源-汇对识别

我们的设计从一个精度较低的分析开始,随后根据需求对分析进行细化。这种效率更高但精度较低的分析能够识别应用中可能存在漏洞的区域,这些区域将进一步受益于更精确但成本更高的分析,从而减少误报。

我们首先从一个包含一组源点与汇点的规范开始。源点是getIntent()和onNewIntent()方法,这些方法获取启动活动并为应用提供数据输入的意图对象。我们选择Susi提供的部分汇点[29]以及第2.2节中描述的类别相关的汇点。

我们分析所使用的初始控制流图是基于SPARK[22]生成的调用图在Soot中构建的过程间控制流图[21]。第一步,我们根据给定的规范生成源和汇程序点的配对。我们有两种设计选择:(i)通过比较可达方法中的方法签名,在初始控制流图中定位所有可能的程序点;以及(ii)使用现有的信息流分析系统(如FlowDroid)[5]来收集在输入上具有数据依赖的源-汇对。

我们观察到,使用FlowDroid可以减少需要分析的源汇对数量,并去除一些无关的对,从而降低分析时间。因此,我们采用FlowDroid的保守设置。例如,在反向别名搜索中可以选择流敏感性,但我们保守地选择为流不敏感。从可浏览活动开始,FlowDroid通过数据流分析找到源和汇程序点的配对。在下一步中,我们利用这些源-汇对进行可达性测试,并对FlowDroid构建的初始控制流图进行细化。

3.2 优化控制流图和可达性分析

上一步中精度较低的数据流分析可能会引入误报,且构建的控制流图可能遗漏边(非正式地,我们称之为缺口)。我们通过后续的按需优化和符号执行来弥补这种不准确性。我们从上一步得到的初始控制流图开始,给定一个源方法Sc和一个接收方法Sk,W2AIScanner以Sc作为起始节点,使用深度优先搜索遍历并优化控制流图。我们利用反向变量类型分析来解析虚拟方法和接口调用,该分析会考虑调用点与类对象实例化程序点之间的赋值关系。在我们的动机示例中,由于控制流图遗漏了从L7到该方法的边,因此添加了run()方法的一个节点,该方法位于MyRunnable类中。在此示例中,L7处Runnable接口的类实现被解析为MyRunnable类,然后加载run()方法,并将其节点添加到控制流图中。

在优化控制流图时,还会执行可达性分析,以减少符号执行阶段的状态爆炸问题。当访问一个分支节点时,会检查Sk是否从各个分支可达,并缓存可达性结果。如果到达了Sk,则在此步骤中停止控制流图遍历,并继续处理下一个源-汇对。如果检测到新汇点,则会将其添加到待由符号执行后续检查的源汇对中。在第4节中,我们展示了精确的线程处理有助于发现FlowDroid[5]未能检测到的有趣漏洞。

一个问题在于Sc可能在程序中的任意位置被调用。因此,包含Sc的方法的调用者可能未知(例如图1中的第L9行)。我们的分析是保守的,因此会返回到所有可能的调用点以继续分析。注意,一条路径可能包含多个汇点。在这种情况下,分析将继续,直到到达其他汇点为止。

为了处理由循环和递归调用引起的后向边,特定调用上下文中的节点在有限次数内被访问。之后,我们将不同调用上下文中访问的节点的可达性结果进行统一,并将其用于符号执行中。如果一条路径不包含任何后向边但过长,则对深度优先搜索施加深度限制。

3.3 符号执行和静态流精化

静态分析通常不足以确认漏洞。然而,通过具体执行进行确认需要以(攻击)意图超链接形式的具体输入。我们采用符号执行[15,19]这一常用于自动化测试生成的技术来帮助生成输入。我们的符号执行器不需要任何初始输入,并采用优化措施,利用前一步骤中进行的汇可达性分析来减少需要探索的路径数量。最终生成的意图超链接是通过符号执行和验证阶段的组合产生的。

用于第一步可达性分析的初始数据流分析可能会产生大量数据流,其中许多可能是误报。因此,需要一种策略来减少初始流的数量。W2AIScanner通过使用符号执行消除不可行路径来实现初步减少。如果存在某个程序输入使得该路径在程序执行期间被遍历,则该路径是可行的,否则该路径为不可行路径[20]。因此,我们立即移除这些不可行路径。

符号执行器在一个语句工作列表上运行。我们的分析选取一个源-汇对(Sc, Sk),从源语句Sc开始,对程序进行符号执行,直到到达汇Sk。到达定值分析同时开始,由Sc返回的意图对象被标记为数据依赖于输入。从这一点开始,任何从源意图对象中提取的具有字符串、数值、URI或布尔类型的参数都将存储在符号变量中。URI可以被分解为多个子字符串。我们对URI类进行建模,并将其转换为字符串和整数部分。我们将符号变量存储在符号变量池中,该池在翻译定义语句时被更新。如果一条语句包含调用,则需要决定是否进入该方法。

如果可达性分析结果显示进入该方法将导致调用Sk的程序点,则符号执行会进入该方法。如果该方法可用(即它不是外部方法),并且该方法调用点有变量定义,则当分析从该方法返回时,调用点处的流事实将被更新。否则,如果该方法的任何使用变量(参数或实例变量)是依赖于输入的,则该方法调用被视为依赖于输入。

对于IF语句,将检查每个分支的汇可达性结果。如果两个分支都不可达Sk,则不会向工作列表添加新任务,而是继续遍历下一条路径。如果仅有一个分支可达,则选择该分支。最后,如果两个分支均可到达Sk,W2AIScanner将搜索最近的后支配点(ImPodm)。根据方法的控制流图,如果W2AIScanner在该方法内找到ImPodm,则会向合并栈中添加一个新的待合并状态。

在分析过程中出现了一项优化:如果方法内部不存在ImPodm,则无法合并通向同一汇Sk的两个分支。若其中某个分支不包含依赖于输入的变量,则对该分支进行分叉将产生虚假路径,其约束不会用于生成输入。为了避免这些路径,我们引入了一个虚拟ImPodm:(1)当执行到达一个始终可行的条件语句时,将一个合并状态添加到合并栈中,此时合并点可以是该方法任意一个退出语句;退出语句是指执行退出方法的程序点;(2)当执行到达任何一个退出语句时,并不真正退出该方法;相反,如果该方法中存在另一条不同的路径,则将其加入工作列表;(3)最后,当方法内的所有路径都被遍历且执行即将退出方法时,所有数据依赖于输入的退出语句处的状态以及类字段的约束将被合并,从而为所有退出语句生成唯一的一个合并状态。为了选择该虚拟ImPodm的程序计数器,我们创建一个虚拟退出语句。此外,在可能的情况下,还利用数据依赖结果去除路径公式中无关的约束。

此步骤还结合符号执行进行到达定值分析。该分析是字段敏感的,能够区分来自不同分配点但到达同一程序点的对象。我们使用符号值来指向堆对象。在一条执行路径中,可能存在某些变量的值被使用但未被解析的情况,为此我们采用(按需)反向复制常量搜索以提高精度。值的过度近似体现在两个方面:(i)变量是方法参数,此时我们考虑该方法所有可能的调用者,因此结果可能是一组可能的值,需要逐一考虑;(ii)变量是类字段,因此我们通过考虑其声明类中对该字段变量的所有定义语句来进行过度近似。

在实践中,对具有大规模代码库的实际应用进行符号执行会面临一些额外的挑战。由于循环和递归或长路径导致的后向边可能引发可扩展性问题。特别是循环给分析带来了诸多挑战,因为即使安卓Activity生命周期本身也是一个大型循环。W2AIScanner采用有界符号执行,并对代码迭代块(例如Java中的Iterator类)进行建模,以应对这些障碍。

线程 。支持线程的一个挑战是传递参数。通常线程会使用存储在类字段中的参数进行初始化。之后,在run方法体中会查询这些类字段,因此需要字段敏感分析来跟踪它们。方法参数也可以通过特定方式(例如AsyncTask)传递给线程,这比在普通方法调用的调用点绑定方法参数更加复杂(在普通方法调用中,调用点的实际参数与方法的形式参数之间存在一对一的映射关系)。我们建模了安卓提供的使用线程的不同方式,并支持为它们绑定参数。

一旦我们获得所有汇点和外部方法在公式方面的抽象描述,就会求解这些公式并检查每条路径的可行性。可行路径,约束的解是一个见证,可用于构造意图超链接以驱动程序沿此路径执行。这些意图超链接在最后一步用于动态执行程序。我们采用CVC4 SMT求解器[23]它处理字符串、整数和布尔约束。我们为CVC4不直接支持的字符串操作(如startsWith和split)提供中间公式。一旦求解器实例化了部分或全部符号变量,我们就使用它们来实例化一个意图超链接。为了将生成的输入合并到意图超链接中,我们的分析会解析意图超链接语法中的键值映射(下文将解释)。

3.4 攻击验证和具体值传播

W2AIScanner会自动生成可利用W2AI漏洞的意图超链接。一个意图超链接可分为两部分:(i)schemepart,必须与清单文件中为源活动定义的意图过滤器相匹配;(ii)数据输入,采用如下所述的键值形式。第一部分由清单解析组件收集,该组件获取源活动的意图过滤器规范,并生成所有可能匹配该意图过滤器的scheme。路径是意图过滤器中的一个元素,用于检查是否接受某个意图。开发者可以使用特定模式(类似于正则表达式)提供路径。我们使用Android框架中的算法来查找匹配这些模式的值。

构成意图超链接的数据输入源自Intent类方法。在第2节中,我们讨论了意图超链接遵循特定的语法。以下是一个简化的元意图超链接:

intent://HOST/PATH?query=[string1]#Intent;scheme=[string2];action=[string3];S.key=[string4];end;

其中数据输入可以通过[string]字段发送到安卓应用代码。通过意图超链接发送数据有几种可能的方式:(i)数据URI,其引用由模式、主机和路径以及查询参数组成的数据资源,查询参数是前面带有“?”的键值映射;(ii)意图附加项,即键值对,其类型也可以在意图超链接中指定(例如,S.key=[string4]指的是字符串附加项)。请注意,意图超链接可以包含其他类型的更多参数,例如int;(iii)其他意图参数,如类别、动作等,可以作为字符串值发送。

正如我们在上一步中所解释的,针对上述每种形式的输入,都有相应的意图API可在应用程序代码中使用,以获取数据输入。例如,Intent.getStringExtra(String key) 返回意图中类型为字符串且映射到key的额外数据。我们推断这些类型,并将其用于生成意图超链接。如果这些方法在输入意图对象上调用,则将其定义为入口方法。在符号执行中,这些方法被视为输入方法,用于生成通过这些入口方法初始化变量的测试输入。在上一步构建符号公式时,我们还将入口方法与清单文件中的意图过滤器相关联,以生成更精确的Intent超链接。

这些入口方法返回字符串、整数、布尔类型以及URI类型。

我们还需要找到每个输入参数对应的键。我们使用常量传播(在上一步中已解释)来确定API调用(如getStringExtra(String name))的参数值。如果无法解析键名,则会生成一个任意的字符串值。

一旦我们获得了源-汇数据流的键值对和其他必要输入,以及目标可浏览活动的意图过滤器规范,这些信息就可以整合在一起形成一个意图超链接。因此,符号执行阶段生成的一组路径可能共同构成一个单一的意图超链接。

攻击验证 。在静态阶段生成的意图超链接将由下文所述的动态执行器使用,以验证它们是否能够漏洞利用接收方法。动态执行器运行生成的输入并检查结果。在运行生成的输入时,可能发生两种情况:(1)在运行时调用了接收方法,并且生成的输入足够精确以导致漏洞利用;(2)接收方法被调用但未被成功利用。在这种情况下,我们首先使用从运行时执行路径获得的具体值,并将其赋给符号执行器未能解析的未知变量。新的路径公式再次传递给求解器,我们生成一个新的意图超链接。此过程持续进行,直到意图超链接不再发生变化(即分析达到不动点)。

为了运行生成的具体输入并获取执行轨迹,我们选择使用一种高级但标准的接口——Java调试线协议(JDWP)[2]该协议由Android运行时(包括Dalvik和Art)支持,并且独立于框架版本。一个复杂之处在于,执行是在Dalvik字节码中进行的,而分析则在Jimple(一种三地址中间指令表示)中进行。我们需要将生成的执行轨迹重新转换回Jimple。Dexpler[6]维护了字节码指令地址与Jimple语句之间的映射关系。我们通过这些映射来获取对应的Jimple语句。为了将执行轨迹中变量的具体值赋给Jimple寄存器,对于每个方法,我们必须找到执行栈上的变量与方法体中Jimple寄存器之间的对应关系。

在运行生成的意图超链接后,我们将利用这些寄存器映射来准确确定哪些Jimple寄存器需要被更新,以便在后续分析中进一步处理。

验证组件需要验证生成的意图超链接是否会导致漏洞利用。该决策基于执行轨迹、具体值以及安全分析师提供的攻击策略。攻击策略包含针对每类漏洞的规则。根据在执行轨迹中到达的接收方法的类别,应用不同的策略检查。漏洞主要有两类:滥用WebView接口和滥用原生应用接口。

第一类是通过意图超链接参数发送恶意URL进行验证。当易受攻击的应用加载该恶意URL时,从设备检索到的数据将被发送到我们的服务器,从而可以确认相应的攻击行为。3滥用原生应用接口的攻击验证起来更为复杂。首先,我们验证执行轨迹中是否到达了接收方法。但这还不够,还必须检查接收方法参数的具体值是否直接受到意图超链接字段的影响。为此,我们将符号执行阶段解析出的接收方法参数值与运行意图超链接后观察到的值进行比较。然后,根据策略,我们检查路径上是否存在其他应存在的方法(我们称之为类别设置),以确保漏洞利用不会被阻止。在确认接收方法可利用后,该意图超链接将被报告为一种漏洞利用。

安卓上的Web到应用程序注入攻击:特征分析与检测

4 评估

我们大规模评估了网页到应用注入攻击的普遍性,并评估了W2AIScanner的检测能力。我们选取了Google Play中所有类别的前100名应用程序,加上[17] 4中使用的数据集,总共包含12,240个应用程序。我们在配备16GB内存的Intel Core i5‐4570处理器PC(3.20 GHz)上运行Ubuntu 14.04系统。应用程序在Android 4.4模拟器以及真实的安卓设备Galaxy Nexus和Nexus 7上进行测试。W2AIScanner利用adb命令启动活动,以验证那些滥用WebView接口或原生应用接口并执行特权操作(例如,向应用数据库插入数据)的漏洞利用,这在第3.4节中有详细说明。

应用程序中W2AI漏洞的普遍性 。在该数据集中,有1,729个应用至少具有一个可浏览活动。W2AIScanner在这些具有可浏览活动的应用程序中检测到286个W2AI漏洞。这表明我们的系统作为W2AI攻击的漏洞检测工具是有效的。5

表1展示了检测到的易受攻击应用程序在我们的8个类别中的分布情况。列“Sink数量”表示我们为该类别定义的汇点数量。不同类别的汇点之间可能存在重叠。例如,WebView.loadUrl() 可以是前4个类别的汇。总计,我们在8个类别中有153个不同的汇点。一个应用可能具有来自多个类别的漏洞。例如,WorkNet示例包含了ID从1到4类别的漏洞。因此,该列的总和大于易受攻击应用的数量。“易受攻击应用数量”列表示我们在该类别中发现具有已确认漏洞的应用程序数量。

对于每个类别,我们都发现至少有一个下载量超过100万次下载的易受攻击的应用。其中一款流行的应用是维基百科 (1.3.4),它对ID为2和4的类别存在漏洞。我们还检测并确认了14个Dropbox应用易受开放重新委托攻击,攻击者可利用该漏洞强制这些应用调用托管在手机上的其他应用。一个特定于应用逻辑的漏洞出现在587个应用中,此处我们将其计为一个唯一漏洞以避免结果偏差。一旦该漏洞被利用,攻击者便可向手机发送伪造的PayPal付款通知。腾讯Android SDK (2.8) 也被确认易受W2AI攻击。有关每个攻击类别中代表性应用的更多详细信息见附录A。

W2AIScanner的有效性在检测W2AI漏洞中的表现 。我们的目标是有效检测W2AI漏洞,具体目标如下:(i)分析器发现的潜在漏洞应仅有少量误报,且生成的意图超链接应准确;(ii)应能够发现由于在初始完整应用级分析阶段存在不精确性而可能被遗漏的漏洞。

图3(a)展示了W2AIScanner生成的路径数量与原生FlowDroid报告的路径数量的比率。对于大多数应用程序,报告的数据流数量有显著减少,这意味着大部分误报流已被拒绝,或者符号执行与数据流分析的组合有效减少了生成的路径数量。该比率也可能大于1,因为我们检测到了FlowDroid未能发现的数据流。

图3(c)显示W2AIScanner能够有效识别误报接收点。有时,我们的系统甚至能够发现原生FlowDroid遗漏的汇点。在图3(c)中,这些汇点被标记为新汇点。请注意,如果某个应用程序未发现新的汇点,则图表中不会标注0。在某些情况下,FlowDroid报告的所有汇点均为误报,而W2AIScanner找到了真正的正例汇点。总计,在通过优化FlowDroid构建的控制流图后,我们在69个应用程序中发现了82个新的真正漏报点。其中,在39个应用程序中新发现的汇点是由于线程执行所致。

图3(b)显示了我们数据集中每个应用程序在FlowDroid控制流图中存在的缺失边数量。总计,我们在863个应用程序中发现了由于线程调用导致的缺失边。

静态分析阶段的总执行时间如图3(d)所示。对于大多数应用,分析耗时少于30秒。动态分析阶段的执行时间往往更高。我们测量了8个应用中每条流的执行时间,每个应用代表一个攻击类别。每条流的平均执行时间约为48秒。动态分析阶段的大部分开销源于网络操作等操作。

在图3(a)中可以观察到,对于前200个应用程序,原生FlowDroid报告的路径数量远高于W2AIScanner(比率小于0.2)。图3(c)还显示,FlowDroid在相同应用程序中存在大量误报接收点。这表明我们的系统通过排除误报接收点,成功减少了这些应用程序生成的路径数量。这些应用程序较高的初始流数量也导致了图3(d)中更多的运行时执行。

我们成功生成了精确的Intent超链接,使我们能够发现0-day漏洞。我们数据集中的许多应用程序生成的意图超链接参数遵循复杂模式。例如,Letv是一款安卓应用,仅当意图超链接具有以from作为键且以baidu作为值的查询参数时才会处理该链接。另一个例子是Kobobooks,它要求调用该应用的意图超链接的action参数不等于android.intent.action.VIEW。因此,符号执行和验证是找到确认路径的关键。符号执行的一种替代方法是模糊测试,但我们认为,任何缺乏符号推理的模糊测试都不太可能取得良好效果。

5 相关工作

我们从两个角度讨论安卓相关工作:应用攻击和应用分析。已有研究展示了安卓[8,10,13,24,31,32,36,39,40]中的权限提升攻击。这些研究都假设恶意应用已存在于受害者的安卓设备上,而我们的W2AI攻击无需安装任何恶意软件即可实现。

最近,WebView和混合应用已被证明容易受到新型攻击[9,14,17,26]的影响。罗等人观察到,恶意JavaScript代码可以访问敏感资源[26]。格奥尔吉耶夫等人对混合应用进行了分析,应用程序,并展示了影响桥机制的漏洞[14]。Jin等人介绍了通过内部和外部通道对基于HTML5的移动应用进行代码注入攻击[17]。这些攻击要求用户直接在混合应用的WebView中访问恶意页面直接。相比之下,我们的W2AI攻击利用意图超链接,只需在默认浏览器中点击一个链接即可传递有效载荷,这种方式更有可能实现。

还发现通过scheme机制[18,33,34]发起的攻击。王等人[34]揭示了针对安卓和iOS应用程序的混淆代理攻击,这些攻击滥用操作系统提供的通道。其中一种通道是scheme机制,攻击者可通过构造意图超链接并发布到网页上来调用手机上的应用程序。他们研究了用户在良性应用的自定义WebView中浏览网页时,利用该良性应用的“源”发起混淆代理攻击的问题。他们展示了通过意图超链接在iPhone上对Dropbox软件开发工具包发起的CSRF攻击[34]。然而,我们的攻击有所不同,因为我们的攻击模型更为通用——用户在默认浏览器中点击意图超链接,而该浏览器无需从良性应用启动,且可利用更安全的通道如默认浏览器。更重要的是,我们研究了在攻击者能够通过意图超链接启动应用程序后,哪些漏洞可被漏洞利用。我们提出了一种检测与验证方法,证明该方法能够扩展用于自动检测真实应用中的漏洞并生成相应的漏洞利用。

另一种方法是对安卓应用进行静态分析[5,25,35,41]。CHEX[25]通过将应用执行近似为“片段”的顺序排列来发现安卓中的组件劫持漏洞。我们尝试减少过度近似,并证明精确检测是可行的。此外,我们对线程的处理比CHEX更精确,因为我们的分析是对象敏感的。FlowDroid[5]是一种针对Android应用程序的最先进的信息流分析器,我们在W2AI攻击的背景下对其进行了利用和改进。AppSealer可以自动为存在组件劫持漏洞的安卓应用生成补丁[38]。这项工作有可能被用作应对W2AI攻击等注入攻击的解决方案。

还有动态分析方法[11,27,37]。TaintDroid使用污点分析来跟踪隐私敏感数据在第三方应用程序中的流动[11]。然而,它需要一组合适的输入才能开始。我们的分析生成了W2AI攻击所需的输入。符号执行已被用于为安卓应用生成测试输入。Cadar等人[7]基于混合同步测试生成事件序列,但未涉及数据输入。Mirzaei等人[28]通过为建模框架建立抽象,对事件序列和数据输入执行符号执行。然而,他们的方法可能无法扩展。我们基于优化的方法旨在减少符号执行中固有的状态爆炸问题。

6 结论

我们对安卓系统中一类尚未被充分研究的W2AI攻击进行了全面研究。这些攻击可能构成重大威胁,因为它们在无需恶意软件的情况下打开了从网页到应用的攻击通道,并可执行特权操作。我们的工作还具有新颖性:与大多数关于发现潜在漏洞的分析论文不同,我们展示了在真实应用程序上大规模自动检测并确认漏洞的可能性,且可通过攻击意图超链接(零日网页输入)实现。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值