当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2012-08187

漏洞标题:小米MIUI系统造成用户大量敏感数据泄露

相关厂商:小米科技

漏洞作者: Claud

提交时间:2012-06-11 18:53

修复时间:2012-07-26 18:54

公开时间:2012-07-26 18:54

漏洞类型:用户敏感数据泄漏

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2012-06-11: 细节已通知厂商并且等待厂商处理中
2012-06-11: 厂商已经确认,细节仅向厂商公开
2012-06-14: 细节向第三方安全合作伙伴开放
2012-08-05: 细节向核心白帽子及相关领域专家公开
2012-08-15: 细节向普通白帽子公开
2012-08-25: 细节向实习白帽子公开
2012-07-26: 细节向公众公开

简要描述:

在目前所有MIUI系统中,满足漏洞条件的情况下,该漏洞导致手机中任何应用程序均能获取用户的以下敏感数据:
1. 已安装应用软件列表及版本号
2. 用户通讯录中联系人姓名、电话号码、邮箱地址等
3. 用户通话记录中电话号码、通话时间等.
4. 用户短信和彩信内容、号码、时间等
5. 用户保存在手机中的无线网络的SSID与密码
6. 用户保存在便签中的个人数据
7. 其他应用程序的本地私有数据,包括数据库文件、配置文件等
此外,攻击者可以利用此漏洞在特定条件下替换用户已安装的应用程序。

详细说明:

在MIUI中,用户通过备份程序(Backup.apk)将个人数据、应用程序和应用数据保存在本地,以便升级或刷机以后恢复。在这个应用中,存在两处策略不当:
1. 备份内容被保存在SD卡上;
2. 备份内容以明文方式保存,没有加密。
根据官方文档,Android并不对SD卡的文件读写进行进程UID的权限验证,任何应用软件可以随意读取和写入位于SD卡上的文件。详情见:
http://developer.android.com/guide/topics/data/data-storage.html#filesExternal
其中的“Caution: All applications can read and write files placed on the external storage and the user can remove them.”
因此,攻击者可以编写应用软件,读取MIUI保存在SD卡中的备份数据,而这些数据并没有被加密,造成攻击者可以直接读取。
此外,MIUI将本地已经安装的应用软件的APK文件以及软件私有数据也保存在其中,攻击者可以用相同package name和version的另一个恶意APK文件替换,而这些恶意APK文件可以是在原文件基础上重打包(re-packaging)加入了会话劫持或者数据回传的代码,并在用户恢复备份时被安装到系统中。

漏洞证明:

1. /sdcard/MIUI/backup/AllBackup/<date_time>/backup_config.db文件是sqlite数据库文件,在其中的apps表中可以直接读出已安装软件信息:


2. 用户个人信息分别保存在同目录的以下文件中:
通讯录 addressbook.store
通话记录 calllog.store
短信 sms.store
彩信 mms.store
WLAN设置 wpa_supplicant.conf
便签 note.store
其中,WLAN设置为明文直接存储,包括网络SSID、类型、密码等:


其他以.store为扩展名的文件为Google ProtoBuf序列化的二进制数据,虽然不能拿到原始的proto文件,但有两种方法可以读取其中内容:猜测格式并直接读取,逆向分析软件的备份还原代码。
直接猜测格式并读取,可以简单地拿到上述个人信息,例如通讯录中姓名(其中中文采用UTF-8编码)、号码、邮箱:


再例如短信记录(同样的,中文采用了UTF-8编码):


而另一种逆向分析代码的方法,可以考虑用smali、dex2jar/jd-gui、ded等静态逆向软件,分析/system/app/Backup.apk中的代码,其中对这些.store文件做反序列化操作的代码位于com.miui.milk.model目录下,以短信数据为例,下面是采用ded+soot反编译得到的源码,显示了对短信的类型、号码、主题、内容、时间分别如何做序列化的:


最后,该漏洞还会将本地已安装所有软件的私有数据从其私有目录拷贝至SD卡。在Android中,这些目录原来是根据各个软件的UID设置了访问权限,以保证(在没有root权限的前提下)各软件之间不能直接读取对方数据,而必须通过IPC机制进行。但移动到SD卡后,没有了这些权限检查机制,使得所有数据都被暴露出来。其中,许多应用的数据都是明文存储在其私有目录的(在Android安全模型假设下,这种做法是规范的)。例如,人人网将用户的社交信息缓存在sqlite数据库中:


而本漏洞则导致这些本来在Android保护之下的数据可以被所有应用软件直接访问。

修复方案:

考虑到备份数据的尺寸比较大,无法保存在内部存储中,建议将软件改为在本地SD卡中存储的数据一律加密,加密算法采用对称加密,密钥随机生成并保存在Backup.apk的私有目录下或回传到云端。不要采用固定密钥。
从逆向Backup.apk的情况看,MIUI的代码质量还是很高的。这里只是犯了一个基本的策略错误,即将隐私数据明文保存在了可公共访问的SD卡上,造成了攻击者可以通过本地应用程序直接读取这些数据。虽然这种攻击还没有出现,但考虑到MIUI是目前最大的几个第三方ROM之一,攻击价值还是存在的。
此外,代码质量高是指编码风格和框架设计上。从安全上,其他几种策略错误也有存在,其他几类漏洞也有。正在验证。

版权声明:转载请注明来源 Claud@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2012-06-11 20:22

厂商回复:

正在确认中,感谢您的上报!

最新状态:

2012-06-12:已经确认,非常感谢您的工作!