混合开发模式下基于WebView 的移动应用安全性综述∗
2020-12-30杨蕾新张健毅
杨蕾新 张健毅 杨 涛
1. 北京电子科技学院,北京市 100070 2. 公安部第三研究所信息网络安全公安部重点实验室,上海市 201204
引言
如今,越来越多的安卓开发倾向于混合开发模式。 混合开发是一种取长补短的开发模式——原生代码部分利用WebView 控件[1]或者其它框架[2]为H5 提供容器,应用程序主要的业务实现、界面展示都是利用与H5 相关的Web 技术进行实现的。 目前已经有众多流行的混合应用程序,如微信、美团、今日头条等。 混合开发模式中WebView 容易使用,深受移动开发人员的喜爱。 研究显示[3]大约80%的安卓应用使用WebView。 但是与WebView 的交互机制很复杂,在安卓应用中会引发各种安全问题[1],如用户敏感信息的泄露[4-6]、网络钓鱼攻击[7,8]、恶意广告加载[9,10]等。
针对WebView 引发的安全问题,研究人员进行了广泛研究[4-7,11,12],这些研究从各自的角度探索了部分由WebView 引发的漏洞和对应的攻击模型,并提出了相对应的缓解策略。 还有一项研究[1]从广泛的角度理解,对这种漏洞进行系统的检查。 这些研究的共同之处在于,它们主要调查在混合应用中针对WebView 引起各种类型的攻击,这种攻击允许不可信的网络内容(例如广告)加载到混合应用中,以便直接访问设备资源。 本文尝试对混合开发模式下与WebView安全方面相关的技术研究进行全面的归纳和总结,介绍混合应用程序的体系机构,详细分析混合应用中WebView 安全方面的研究现状并探讨防御方目前面临的挑战,为进一步研究作参考。
本文第1 节介绍相关背景知识;第2 节针对WebView 漏洞的攻击类型进行归类;第3 节介绍相关漏洞检测和防御的研究现状,对不同类别的漏洞检测方法进行了定性分析和横向比较;第4节对WebView 相关安全方面研究面临的挑战进行总结和分析,对未来工作进行展望;第5 节对全文工作进行总结。
1 背景
混合开发模式是一把双刃剑,应用程序的功能通过将本地API 暴露给网络内容而获得良好的性能,但这些技术可能会产生新的安全和隐私问题。 如图1 所示,这是一个使用WebView 作为容器直接承载Web 页面的混合应用程序。WebView[13]是一个用于加载和显示网页的网络控件,采用WebKit 内核作为渲染引擎,来加载和显示网页,相当于一款高性能的浏览器。 它与网络浏览器的不同之处在于,它提供了一组APIs来促进混合应用的网络层(Web 侧,主要指JavaScript)和本地层(Native 侧)之间的双向交互。 如WebView 使用网络-移动桥来连接网络层和移动层,移动层通过事件处理程序可以控制并处理发生在网络层的事件(如点击链接),WebView 设置APIs 可以用来配置Webview 实例(如是否允许JavaScript 代码执行)等。 这样加载在WebView 中的不可信代码(例如广告)就有可能窃取用户的私人数据[12]。 WebView 的UI设计样式过于简单,缺少标题栏、地址栏、标签栏等,这样用户不知道正在加载哪些Web 内容,也不能很好的管理多WebView UI 实例。 攻击者可以使用导航功能通过重定向到假网站,发起网络钓鱼攻击,但用户不会轻易注意到[7]。
2 针对WebView 漏洞的攻击类型
大部分针对WebView 相关漏洞攻击的根本原因在于网络层和移动层之间的交互没有相对应的保护机制。 也就是说,WebView 提供了几个APIs 使得开发人员可以定制他们的WebView实例,却没有提供对这些APIs 的访问控制,导致加载在WebView 中的不可信代码可以进行各种类型的攻击。 如图1 所示,开发人员可以通过设置APIs 配置WebView,如启用JavaScript、访问本地文件、数据库和GPS 位置;开发人员还可以使用内容加载API(如:loadUrl())将网页内容加载到WebView 实例中;开发人员还可以利用网络-移动桥来实现网络和移动层之间的交互,网络-移动桥有两种格式:事件处理程序和JavaScript Bridge;还可以使用网络-移动桥等特殊方法定制postMessage(即混合postMessage)来实现网络层和移动层之间的HTML5 postMessage形式的跨平台消息传递。 表1 整理了针对Web-View 漏洞的各种攻击类型。
2.1 WebView UXSS 攻击
开发人员经常使用WebView 的内容加载APIs(如loadUrl())打开远程网站或第三方JavaScript 库。 这种方式可能会引入WebView UXSS(通用跨站点脚本)漏洞[4]。 UXSS 是浏览器和浏览器扩展的一种客户端漏洞,是由验证用户输入失败引起的。 攻击者可以注入恶意的JavaScript 来破坏浏览器遵守的同源策略(SOP)。 基于WebKit 内核的谷歌浏览器存在UXSS 漏洞,因此,使用WebKit 内核的WebView(安卓4.4 之前)的安卓应用程序会受到这类漏洞的感染。 从安卓4.4 开始,WebView 使用Blink,但是在安卓5.0 之前仍然存在UXSS 漏洞。 UXSS 漏洞出现在WebView 本身,攻击者可以在易受攻击的WebView 加载的任何页面中运行恶意的JavaScript 代码,以窃取敏感的页面内容、cookies 等。 被盗的cookies 可能会导致严重的攻击[14],例如会话劫持和用户假冒。 跨站点脚本甚至可以重写网页的内容。
表1 针对WebView 漏洞的攻击类型
2.2 基于文件的跨区域漏洞的攻击
当应用程序本地有生成JavaScript 代码时,使用WebView 的内容加载APIs(如loadUrl())同样可以加载应用程序资源中的HTML 文件和应用程序代码中的动态JavaScript。 如果允许在WebView 中访问文件系统,如设置管理API:setAllowFileAccessFromFileURLs(true),允许本地HTML 通过JavaScript 读取本地文件内容,这样一个文件区域(本地HTML)中的JavaScript 可以访问其他文件区域的内容;或者setAllowUniversalAccessFromFileURLs(true),允许本地HTML通过JavaScript 检索网页内容,这样一个文件区域中的JavaScript 也可以访问其他http 区域的内容。 这将会引入基于文件的跨区域漏洞[4]。 在安卓4.2 之前,上述两个访问权限是默认启用的。
2.3 JS 到Java 接口漏洞的攻击
开发人员可以利用JavaScript Bridge[3,9,12,17]来实现网络和移动层之间的交互,这是一种在网页中的JavaScript 代码和应用程序中的Java 代码之间搭建桥梁的机制,允许JavaScript 代码调用Java 代 码。 具 体 来 说, 可 以 通 过 调 用WebView 的方法addJavascriptInterface (Object object, String name)来构建JavaScript Bridge,该方法将一个Java 对象(第一个参数)注入到JavaScript 环 境 中, 使 得 由WebView 加 载 的JavaScript 代码可以通过提供的名称(第二个参数)调用该Java 对象的方法。 但是,WebView 不提供任何对JavaScript Bridge 的访问控制,在WebView 中执行的JavaScript 代码可以通过提供的名称调用Java 对象的所有公共方法。 恶意JavaScript 代码可能通过调用Java 代码来访问应用程序和用户设备的资源,这些漏洞会导致数据泄漏。 尽管攻击受到应用程序所拥有的权限的限制,但攻击者有可能利用根漏洞获得更多权限。 更严重的是,攻击者甚至可能利用此类漏洞在用户设备上安装后门。
2.4 面向Web 事件的攻击
WebView 允许开发人员在安卓中的Java 环境中具体指定事件处理程序来处理WebView 中发生的Web 事件,如可以重写事件处理程序shouldOverrideUrlLoading()来处理网址导航事件。 这些事件处理程序和JavaScript Bridge 一样可以用来实现网络和移动层之间的交互。 由于这些事件处理程序存在安全风险,即允许在WebView 中加载的任何Web 代码来访问它们。因此,当移动层中的事件处理程序携带敏感功能(如读取位置信息、访问摄像头)时,攻击者可以通过代码注入攻击[11]将恶意HTML/JavaScript代码注入WebView,执行该恶意代码并触发Web事件,进一步调用移动层中对应的事件处理程序,该事件处理程序由注入的输入引导,以执行其内部关键功能。 这种面向事件的攻击[5](EOE)会造成严重的后果,如敏感信息泄露、跨框架操纵、网络钓鱼攻击等,并且该攻击也无法通过所有现有的防御解决方案进行防御。
2.5 iframes/popups 相关攻击
Web 代码经常使用iframe/popup,例如用来显示不同格式的文件(如视频和图片),加载不可信的内容(如,广告)。 iframe/popup 在普通浏览器中研究和保护地很好,但在WebView 中是危险的。 具体地说,普通浏览器拥有完整的UI组件(如地址、状态和标题栏),但是WebView 的UI 简单,只包含一个用于呈现web 内容的区域。因此,如果在WebView 中存在着携带不受信任内容的iframe/popup,并且这些不受信任的iframe/popup 可以导航WebView 的主框架或顶部框架,就会发生网络钓鱼攻击。 如事件处理程序onCreateWindow()由于其设计缺陷无法区分良性请求和不受信任的请求。 不受信任的iframes/popups 通过简单地触发弹出窗口创建事件,并使创建的WebView UI 加载伪造的Web 内容并与良性WebView UI 重叠,从而具有执行网络钓鱼攻击的能力。 由于缺少地址和标签栏,用户几乎不会注意到这种危险的弹出式创建操作。这种由WebView 和常规浏览器之间的差异导致的并且与iframes/popups 相关的新型漏洞称为环境差异漏洞[7](DCV)。
2.6 源剥离漏洞的攻击
WebView 继承了常规浏览器的防御解决方案,包括同源策略(SOP),但是SOP 不允许不同的不信任的web 框架之间的通信。 在普通浏览器中通过HTML5 postMessage 机制及其相应的安全模型得以缓解。 WebView 也支持postMessage。 然而在混合应用程序中,开发人员不仅需要不同web 框架之间的通信,还需要网络层和移动层之间的通信。 虽然网络- 移动桥(如JavaScript Bridge[12])可以进行跨平台交互,但HTML5 postMessage 形式的跨平台消息传递不可以用这种方法实现。 为了缓解这个问题,开发人员使用网络- 移动桥等特殊方法定制postMessage(即混合postMessage) 来实现。 然而,如这些研究[5,12,17]所示,这些桥通常是安全漏洞的原因,因为任何加载到WebView 中的代码都可以自由访问它们。 通过混合postMessage发送的消息在网络和本地层之间移动时原始信息(如:消息发送者和接收者)会丢失,无法区分消息发送者的身份,甚至无法安全地获得消息的来源。 混合postMessage 引起的这种安全问题称为源剥离漏洞(OSV)[6]。 如果消息包含敏感信息,可能会导致严重后果。 远程攻击者可能会利用应用程序中的这个安全问题来执行拒绝服务攻击(DoS)、本地关键硬件设备访问(如实时监控麦克风)等。
3 WebView 相关漏洞检测与防范
根据相关研究[3],在Google Play 市场上免费应用程序中有28%的混合应用包含至少一个安全漏洞,这些漏洞存在于安卓生态系统的各个角落,对用户构成了严重威胁。 通过第一节的分析,可以发现关于WebView 漏洞的攻击大多数都是通过代码注入攻击来进行。
这几项研究[4,11,12]提出了基于静态分析的方法来检验混合应用程序。 JSDroid[4]这个自动工具可以检测安卓应用程序中常见的JavaScript使用模式,并基于静态分析揭示潜在的与JavaScript 相关的漏洞。 该分析发现其中70%以上的应用存在潜在的JavaScript 相关漏洞,其中20%可以被成功利用。 BridgeScope[12]更加针对JavaScript Bridge 所产生的安全问题,这是一个基于自定义静态分析来评估JavaScript 接口的工具,可以精准有效地确认任何与JavaScript Bridge 的安全问题。 与该工作类似,Claudio Rizzo 等人[11]通过使用BabelView 这个攻击者行为模型来检测应用程序,使用静态信息流分析系统地评估代码注入攻击对WebView 的可能影响。 可以不必对JavaScript 语义进行推理。 BridgeScope[12]允许检测接口方法之间的潜在流量,使用定制的流分析,而BabelView[11]有意允许重用最先进的流分析工具。
表2 WebView 相关漏洞检测和防范
针对与WebView 相关的JavaScript 安全漏洞,可以采用以下防范措施:对于普通用户来说,最好经常更新应用程序和设备,因为新版本的应用程序通常会修复漏洞,更高版本的安卓设备可以更好地保护用户的隐私。 对于开发人员而言,需要通过在应用清单文件中指定更严格的权限来关闭攻击媒介[4],如限制JavaScript 在file:/ /URLs 中的执行,限制WebView 的可导航性,最好只在高于4.2 的安卓版本中使用JS Bridge 模式,经过净化以过滤恶意JavaScript 的关键字等等。 Li 等人[18]还提出了一种操作系统级的缓解措施,作为针对这些类型攻击的对策。
以上几种检测攻击都是针对与WebView 相关的JavaScript 安全问题进行探讨,但是这几种方法都采用的是静态分析,静态分析方法通常具有很高的误报率,无法检测到通过本机代码或动态代码加载实例化的WebView 和接口。 Yang 等人[5]将深度静态分析的信息与选择性符号执行相结合,可以自动审查安卓混合应用程序中的事件处理程序中的漏洞。 在OSV-Hunter[6]中,他们引入了一种检测源剥离漏洞(OSV)的新方法。与上述介绍的检测工具[11,12]不同,这些检测工具[11,12]并不能追踪来源,而OSV-Hunter[6]可以自动发现消息发送者和接受者,并且分析他们之间的链接语义。 客户端验证(CSV)的检测和防御[19]可以减轻这种威胁,但是性能也是有限的,现实情况是很难消除由OSV 引起的安全问题,于是他们在最新的WebView 中设计并实现了一套新的混合postMessage API 称为OSV-Free[6]来缓解OSV。 而对于WebView 中iframe/popup 这种特殊的网络行为带来的攻击[7]来说,直接应用上述工具来检测是很有挑战性的。 现有的静态分析工具不是为分析iframe/popup 行为而设计的, 并且现有的动态分析工具( 如EOEDroid[5])有很高的误报率,DCV-Hunter[7]作为针对DCV 的静态检测工具,可以自动审查给定的应用程中的DCV,可扩展、有效,并有相对较低的误报。 该研究人员[7]通过增强WebView编程特性和UI 特性的安全性提出了一个多级保护解决方案。
研究[20]发现在混合移动应用中调用的近40%的软件服务接口(敏感APIs)是由第三方库(如广告库)触发的。 Vaibhav Rastogi 等人[9]针对混合应用中虚假欺诈广告的问题,做出检测和现状调查说明,同时开发了一个分析框架,能够大规模的对应用程序进行动态测试并记录广告链接和最终链接(广告内容或者下载的文件等),来进行恶意链接或者文件的判断。
以上这些研究成果对于日后设计适当的恶意软件检测或漏洞缓解策略至关重要。
4 面临的挑战和展望
4.1 面临的挑战
现有的研究[1,4-7,11,12,21]从有限的角度探索了部分与WebView 相关的漏洞,大部分研究局限于检测某个漏洞,无法对测试中的应用程序进行全面分析,而且这些工具很少能实现零误报。因此以一种可扩展的方式检测更多种类的漏洞,并且比现存的方式具有零误报是当前面临的一大挑战。
根据表2 可以看到大部分工具都使用静态或者动态分析来检测漏洞。 静态分析方法通常具有很高的误报率,会导致大量的人工工作,难追踪隐式数据流,无法检测到通过本机代码或动态代码加载实例化的WebView 和接口。 如在混合移动应用程序中,一些加载在WebView 中的网址是加密的,一些与网址相关的数据通过隐式流,一些与WebView 相关的代码是动态加载的。类似于现有的静态分析工具[4,11,12],基本不处理隐式数据流,原则上这允许开发人员有意隐藏敏感的JavaScript。 动态分析的方法容易出现假阴性。 如这几项研究中[6,9]都使用随机测试工具“Monkey”来触发WebView,然而,一些应用的WebView 只能在前提条件满足时显示,例如,用户必须完成登录,或者一个pdf 文件必须预先存在于本地存储中,因此探索所有可能的UI 组件是一个困难的问题。 因此平衡这两个方面的缺陷也是当前面临的挑战。
4.2 研究展望
上述面临的挑战在为混合应用程序开发和相关漏洞检测的工作带来难题的同时,客观上也为新发展创造了条件和机遇。 展望未来,仍有如下研究问题值得关注和进一步探讨:
1)不同漏洞检测方法的融合。 不同的检测方法从不同的角度对混合应用存在的漏洞进行分析和检测,不同检测方法之间具有很强的互补性,通过融合各类检测方法来引入新的安全机制,可能会更有效地检测漏洞。
2)受到静态分析的限制,无法检测到通过本机代码或动态代码加载实例化的WebView 和接口。 原则上,这允许开发人员有意隐藏敏感的JavaScript,攻击者可利用相关漏洞在用户设备上安装后门,攻击者还可以不断调整其恶意代码的外显特征,从而规避传统方法的检测。 这种攻击方式的检测和防御是未来研究的重点也是难点。因此,这是未来漏洞检测的可能发展方向之一。
3)通过加强防范能力来抵制恶意攻击。 从防范角度来考虑,可从加强基于密码技术的认证或访问控制等方面来提高防范能力,有可能会大幅度消减未知漏洞。 因此,这也是未来混合应用程序开发值得关注的问题之一。
5 总结
安卓混合应用的安全问题是信息安全领域的热点问题,经过广大研究人员的不懈努力,已经取得了一定的成绩;但是相关技术发展迅速,可能会带动新型漏洞和相关攻击技术的升级。研究人员需要检测新系统的新型漏洞,不断改进检测方法,开发新的检测工具。 因此,针对安卓混合应用程序的安全性研究依然是一项需要研究人员继续努力的持久艰巨的任务。 本文讨论了安卓混合应用程序中WebView 的最近研究进展,介绍了针对WebView 漏洞的几种相关攻击、检测方法和对应防范措施,并提出了当前面临的挑战和未来的研究展望。 希望这项工作会对安卓混合应用中安全问题及相关领域的进一步研究有所帮助。