远程执行Android设备上的代码
英文原文:Remote code execution on Android devices
“你走进一个咖啡店坐下来。等咖啡的时候,你拿出你的智能手机开始玩一款你前些天下载的游戏。接着,你继续工作并且在电梯里收邮件。在你不知情下,有攻击者获取了公司网络的地址并且不断地感染你所有同事的智能手机。
等下, 什么?
我们在 Bromium 实验室博客上不会谈论 Android 太多。但是不时地我们喜欢修修补补。近来,我的同事 Thomas Coudray 和我探索了下 Android 远程代码执行的易损性,想弄明白易损性在现实应用中是多大的问题。
尽管权限提升技术在 Android 上很普遍(并形成了“root”设备的惯例),但远程代码执行是一种罕见且危险得多的漏洞。它允许攻击者不经授权就在用户设备上执行特定代码。这个 Bug 特别另人关注,因为,即使在它被修复后过了 18 个月,在安装了所有补丁的最新型的 Android 设备上仍可被利用。我们想看看,如果这是真的,利用此漏洞需要付出多少努力。我们发现上述场景完全可能发生。
我们用了两种不同的方法研究此 Bug。首先,我们尝试在类似公共 WIFI 的环境中利用它,也就是你可能在咖啡店中遇到到环境。我们启动了一些 Android 设备和廉价的网络设备,开始攻击。第二步是估计普通用户有多大的可能遇到这种最坏的情形。为此,我们使用了统计分析技术,看看有多少有漏洞的 App 和设备。
在开始细节之前,先了解一下此 Bug 的背景知识:
背景知识
它始于 2012 年的 Javascript 在 addJavascriptInterface API 中的远程代码执行 Bug,CVE-2012-6636(详情见此处和此处)。此 Bug 允许 Javascript 代码获得访问系统的更大权限,这并非开发者的本意。至此,如此糟糕。MWR 的研究人员在几个月后的研究结果显示有大量 App 使用了广告供应商的框架程序,而这些框架程序通常受此 Bug 影响而且还在运行时下载 Javascript 代码。
这些因素结合起来意味着,大量的 App 采用不安全的方式从互联网下载 Javascript 代码,因此恶意攻击者劫持下载并发动远程代码执行的攻击并不难。
还没修复?
Android 4.2 修复了这个潜在的 javascript 漏洞。不幸的是,由于向后兼容的原因,修复只意味着在特定的场景中关闭了漏洞。现实中的 Android 版本碎片化和 Android 上的广告商业模式意味着这些场景并不常见。我们检查了 Google Play 上的 100,000 个 APK 文件,发现大约有 12% 即使运行在最新的 Android 设备上仍然有漏洞风险。
APK 分析结果:一半没有漏洞风险,因为它们的目标 SDK 版本大于或等于 17;剩下的 31% 没有使用存在漏洞的 API;7% 由于 APK 混淆或分析出错而没有分析。
另外,不管此漏洞是否被修复,超过 50% 的Android 设备仍旧使用着低于 4.2 的版本。对于这些设备,没有修复程序,它们依旧存在漏洞风险。
技术点
为了修复成功,调用 addJavascriptInterface 的程序必须编译为 API 17 及以上,也就是说你的目标 Android 版本必须是 4.2 及以后的。为了兼容更多的设备,App 和框架程序经常用尽可能低的 API 版本编译。重点就是即使运行在打了补丁程序的 Android 4.2, 4.3 或 4.4 的设备上,App 仍存在漏洞攻击风险。
广告商业模式在 Android 中很流行:也就是 App 免费,开发者通过向用户展示广告而获得收入。在 Android 中,有超过 50 个不同的广告框架程序,这使得开发者很容易实现广告功能,事实上他们经常在 App 中使用不只一个广告框架程序。有的 App 发现使用了 20 个之多(见此处的图4)。这些框架程序大都有这种行为——当 app 第一次运行时,它们通过 HTTP 下载 javascript 库。这也就是说 App 通常不安全地下载了未验证的 javascript 代码,而这些代码运行在可执行任意代码的环境中。
代码的执行意味着对设备的无限制访问
迄今为止,这个漏洞仅仅允许一个攻击者在一个安卓应用环境中去执行代码。这很糟糕,但是仍然被安卓权限系统限制在单独的应用中去访问数据。然 而,一旦一个攻击者有了一个在系统中的立足点,这就类似于他们可能获得额外的特权。以 futex 漏洞为例(CVE-2014-3153),它影响当前使用的每个 Linux 内核版本,包括安卓系统以及最近第一次被成功 root 的 Galaxy S5。尽管他们不是等价的,但我们还是应该养成“远程代码执行”与“root 权限”在严重等级上等价的习惯,因为迟早,一个下定决心的黑客将可能从一个地方蹦到另一个地方,获取设备的完全控制权。
真实世界中的漏洞利用
我们谈了如何利用漏洞和漏洞为什么如此严重。现在我们撇开分析,验证一下漏洞到底有多容易被利用。
五月中旬,我们从 Play Store 随机下载了 102,189 个免费的 app,并通过统计分析发现其中的 12.8% 存在潜在的漏洞风险,正如上图所示。这些 APK 同时使用了过低的目标 API 版本和 addJavascriptInterface API。这些 APK 调用 addJavascriptInterface 时的漏洞事实上可以通过中间人攻击的方式利用,当从互联网不安全地下载的 javascript 脚本时可以发起中间人攻击。
我们会测试通过中间人攻击劫持非安全的 javascript 下载,并注入一些 javascript 脚本来探查 addJavascriptInterface 漏洞。
测试 app 的漏洞
我们设置了一个充当透明 web 代理中间人的 wifi 无线接入点(AP)。它被设置为对任何接入此 AP 的设备在通过 HTTP 请求任何脚本时都注入恶意代码。AP 设置了密码,以防有人误用,但本方法可以用到公开访问的 AP。即使当 AP 不受控制时,DNS 毒化或 ARP 缓存欺骗等技术也可以用来实现中间人代理。或者可以安装一个模仿成合法 AP 的假 AP。也就是说,有各种方法实现中间人代理,使用 wifi 的任何人都将通过我们的代理访问网络。
function findVulnerableObject () { for (var prop in window) { try { // If getClass () doesn’t throw, the object is vulnerable window[prop].getClass (); return window[prop]; } catch(err) { } } return null; }
我设置好 AP 后,从 13,119 个标明有潜在漏洞的 app 中随机选了一些,把它们安装到接入了 AP 的一台 Nexus 5(运行 4.4.3) 和一台三星 XE700t(运行 AOSP 4.2 的 x86 平板)。我们只不过是启动每个 App,做些简单的交互操作,就成功地在超过半数的应用中触发了远程代码执行,它们加载了通过中间人代理注入的恶意代码。
为了好玩,我们把注入到一个 app 中 javascript 代码反复修改,直到显示 Bromium 的标志替换了原有广告。
被扰乱而显示了 Bromium 标志的 app 的 UI 截屏。
全是广告惹得祸
通过查看 TCP/IP 包的轨迹,很快发现广告框架程序就是联合使用了 addJavascriptInterface 和非安全 HTTP 下载的罪魁祸首。在我们调查的框架程序中没有一个使用 HTTPS,也就意味着任何使用这些框架程序的 app 在非安全地下载 javascript 时也易受到攻击。以往的研究显示有 17% 的 app 虽然使用了 HTTPS,但用法不当,但这是另一回事了。
我们认真地检查了一些 app,看看使用用了哪些广告框架。AdMob 是用得最多的(通常也是更新最频繁的),但我们发现用到的大量框架仍然在不安全地使用 addJavascriptInterface。在检查的 app 中,有超过 80% 的非付费 app 包含了至少一款广告框架。总体上讲,在识别的 2140 个 app 中出现了 4190 个广告框架。
问题有多严重?
Google 在 Play Store 上公布了所有 app 的大致下载量。仅就我们手工确认了存在漏洞的小部分用例, 就有超过 1.5 亿的下载量。这并不是说就保证会有 150,000,000 部有漏洞的设备,因为一台设备可能安装多个不同的有漏洞的应用。但考虑到我们在分析中发现的比例——10% 的 app 有潜在的风险,其中有 50% 的有风险的 app 被实地测试可以被攻击——这就存在非常多有漏洞的设备。
而且,别忘了有 57% 的 Android 设备运行在低于 4.2 的版本上。所以即使明天所有有漏洞的 app 和框架打上了基于 4.2 的补丁,仍然有超过一半的 Android 设备不能修复这个漏洞。
一旦你实现了远程代码的执行,结束之前在咖啡店所描述的灾难情形,不是什么大的进步。初始化一个匹配的 root 权限(不幸的是,相当一部分在安卓平台上),一个被损害的设备会变成某种中间人,它随后会进入任何网络。因此,攻击开始传播,举例来说,在自带移动设备的 世界里,共同的 wifi 网络是那样地受欢迎。
合并设备分析器(Device Analyser)的数据
设备分析器(Device Analyser)是另外一个用于统计安卓设备的(数据)来源。其中的一项功能就是它追踪用户启动不同的应用的频繁程度。他们用足够地耐心去相互参照潜在缺陷应用的列表上的数据,给出了下面的结果:
每天每用户打开潜在缺陷应用的平均数量
过去一年左右的时间,设备分析器(Device Analyser)的数据显示设备的使用者们每天平均打开 0.4-0.5 个潜在漏洞的应用。或者换言之,平均一周内就有几次收到(漏洞)攻击。我们不能假设应用的版本比我们分析过存在漏洞的版本新,因此,当我们的示例数据已不 再是最新版本,与图形对应也就表现为急剧下降。如果我们对最近的 APK 版本重新进行我们的分析,我们很有可能看到它仍在 0.4 分。DA( 设备分析器: Device Analyser)的数据是一个相当小的样本,让它去引导更多地关于安卓设备的结论,在整体上是困难的。
结论
我们发现,通过使用相对简单的中间人代理技术,无需特定的应用程序或设备可以远程运行有危害的应用程序,即使 Android 设备安装了完全补丁。使用静态分析我们发现,相当大比例的应用很可能仍然脆弱,我们证实,通过随机测试超过一半的应用确实缺乏抵抗力。
因此,我们建议当连接到一个不可信的 wi-fi 无线网络时不要使用任何 Android 应用程序显示广告。
我们感谢 Evozi 提供他们的 APK 库,和剑桥大学的设备分析数据。