Android DropBox SDK漏洞(CVE-2014-8889)分析

发布者:wyzsk
发布于:2020-08-19 17:34
作者: 小荷才露尖尖角 · 2015/03/16 14:17

0x00 前言


本文是对IBM ISS安全团队对DropBox SDK漏洞详细分析的翻译。

原文见http://www.slideshare.net/ibmsecurity/remote-exploitation-of-the-dropbox-sdk-for-android

如今个人数据存储在云端,这使得像照片备份或通用存储那样的服务不仅可以被用户访问,也能被代表用户的app所访问。在许多方面,包括访问控制功能的app与服务之间的互操作总是具有挑战性的,为了解决访问控制来来的挑战,OAuth1和2等授权协议陆续被提出,它们可以安全地授予app访问特定服务中个人数据的权限,而又不泄露用户的个人凭据。为便于开发,这些服务通常为app提供一个框架或SDK,使app能够和服务进行通信。对于app开发者而言,SDK是具有吸引力的,因为其对内部细节进行了抽象,给开发者提供了简单的客户端API。从安全的角度来看,SDK则提供了极具吸引力的攻击面,因为其一旦出现可供利用的漏洞,可以影响大量使用该SDK的app。

本文介绍了Android Dropbox SDK 1.5.4-1.6.1版本中存在的一个严重漏洞(CVE-2014-8889),该漏洞使基于Dropbox SDK的app暴露于严重的本地和远程攻击。作为概念证明(POC),我们开发了针对包括Microsoft Office Mobile和1Password等流行app的远程攻击程序。我们负责任地将该漏洞报告给了Dropbox,Dropbox也及时提供了一个修复的SDK(1.6.2版)。在此,强烈建议开发者下载SDK并更新其app。

0x01 背景


Dropbox SDK是一个供开发者下载并用于其产品的库,它通过一组简单的API,提供了轻松使用Dropbox服务,如下载或上传文件等功能。

AppBrain的统计数据表明了在Android中使用Dropbox SDK的流行程度[1 ],在全部应用中,有0.31%使用了Dropbox SDK。而在Google Play前500的应用中,1.41%使用了Dropbox SDK。有趣的是,按照安装量统计,分别有总量的1.32%和前500应用安装量的3.93%使用了Dropbox SDK。

尽管Dropbox SDK不是一个高度流行的基础软件库,某些非常流行的Android app仍然使用Dropbox SDK持有敏感数据,包括拥有10,000,000下载量的[Microsoft Office Mobile](https:// https://play.google.com/store/apps/details?id=com.microsoft.office.officehub),以及拥有100,000下载量的AgileBits 1Password

我们发现的这一漏洞影响使用Dropbox SDK 1.5.4-1.6.1版的所有Android app。我们分析了使用Android Dropbox SDK的41个app(它们使用了1.5.4-1.6.1版),其中有31个app(76%)能够被攻击成功)。需要注明的是,其余app仍然具有漏洞,可以被造成同样后果的更加简单的攻击所利用,只不过这些app没有升级到修复漏洞的1.5.4版。

本文结构如下,第二章介绍了Android中跨应用通信(IAC)的背景,第三章介绍了IAC如何被恶意代码本地利用和远程drive-by攻击利用的技术,第四章描述了Dropbox SDK如何使用OAuth为Android app提供授权,第五章深入分析我们所发现的Android Dropbox SDK用于OAuth代码中的漏洞,第六章描述了我们称之为DROPPEDIN的利用该漏洞的真实攻击,第七章我们提供了反映真实威胁的案例,最后在第八章中我们提供了该漏洞的修复建议。

0x02 Android中的跨应用通信(IAC)


Android应用在沙箱环境中执行,沙箱确保应用数据的机密性和完整性,如果没有配置适当的权限,某一应用无法访问其他应用中的敏感信息。例如,Android Stock浏览器中的敏感信息,如cookie、缓存和历史记录,不会被第三方的app所访问。沙箱机制依赖于多种技术,包括基于应用的Linux user-id分配,因此在默认情况下,某一应用的资源(如文件),不会被其他应用所访问。尽管沙箱机制有利于安全,对于有时在app之间需要通信的场合,也牺牲了部分互操作性。回到前述Stock浏览器的例子,当用户使用浏览器访问到Google Play网址时,可能需要打开Google Play app,为了支持这种类型的互操作,Android提供了一种高层的跨应用通信(IAC)机制,通常使用了封装有关载荷和目标应用组件的信息、被称之为Intent的特殊消息。Intent可以是显式指定,此时必须明确指定目标应用组件,也可以隐式指定,此时目标应用无需明确指定,而由Android系统根据Intent参数中的URI scheme、action或category决定。

0x03 利用跨应用通信的攻击


如果攻击者可以控制Intent载荷,直接启动应用组件,那么攻击面将被拓宽,特别对于处于导出(exported)状态的应用组件。这些导出的一个用组件易于遭受恶意应用的本地攻击。负责UI屏幕的Android组件Activity也可以遭受远程的drive-by攻击技术,见[2,3]。

在本地攻击中,如图3.1所示,恶意应用通过恶意Intent(即包含恶意数据)启动导出的目标应用,这只需要简单的调用API,如Context.startActivity(intent)

image

图3.1 恶意应用的本地攻击

而在图3.2所示的远程drive-by攻击中,用户被欺骗浏览恶意网址,恶意网址的网页使浏览器发送恶意Intent,启动目标activity。

image

图3.2 远程Drive-by攻击

0x04 OAuth与Dropbox


为了授权app使用一个指定的Dropbox账号,Dropbox SDK使用了OAuth协议,这个过程始于app在Dropbox网站的带外注册,接着app就可以从Dropbox收到app key和app secret,并将其硬编码于代码中。

然后app将在Android Manifest文件中导出Dropbox使用的AuthActivity,如下所示。

#!html
<activity android:name="com.dropbox.client2.android.AuthActivity" ...> 
    <intent-filter>
        <data android:scheme="db-<APP_KEY >" />
        <action android:name="android.intent.action.VIEW" /> 
        <category android:name="android.intent.category.BROWSABLE" /> 
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter> 
</activity>

图4.1描述了Dropbox OAuth协议各方及通信过程,这一过程首先开始于app携带必须的数据(即app key和app secret)调用Dropbox SDK AndroidAuthSession中的静态方法start{OAuth2}Authentication,该方法使用一个Intent启动AuthActivity,接着AuthActivity产生一个nonce随机数,并再次通过一个Intent启动浏览器或者Dropbox app(如果已安装),对用户进行认证和对app进行授权。这一过程将使用到前面产生的nonce。浏览器或者Dropbox app将利用指向app唯一URI scheme(db-


声明:该文观点仅代表作者本人,转载请注明来自看雪