• 欢迎访问安全专题网站,安全专题信息,安全专题教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入安全专题 QQ群
  • 安全专题现已支持滚动公告栏功能,兼容其他浏览器,看到的就是咯,在后台最新消息那里用li标签添加即可。
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏安全专题吧

一个漏洞泄露你的邮箱的所有秘密

安全情报 网络收集 2年前 (2016-12-26) 233次浏览 0个评论

CVE-2016-3918 电子邮件信息泄露漏洞分析

谷歌近期对外公布了 2016 年 10 月的 Nexus Security Bulletin,这其中包含一个由 360 手机卫士阿尔法团队(Alpha Team)提交的电子邮件信息泄露漏洞(CVE-2016-3918),谷歌对此漏洞的评级为高危险等级。该漏洞可导致恶意应用获取到电子邮件内的数据,可能是电子邮件内容、电子邮件附件甚至账号密码。目前谷歌已经修复该漏洞并向 OEM 厂商推送了补丁,本文将对此漏洞进行分析。

本文的测试环境和代码版本如下:

  • SDK Version: 23, Android 6.0.1
  • Build: MOB30Y
  • Branch: android-6.0.1_r60

漏洞成因

在 Android AOSP 的 Email 应用程序的源码中,我们可以看到在 AndroidManifest.xml 文件中存在名为 AttachmentProvider 的 ContentProvider。

一个漏洞泄露你的邮箱的所有秘密

其主要属性如下:

  • exported true 即对外开放
  • authorities com.android.email.attachmentprovider 即 URI 唯一标识
  • readPermission com.android.email.permission.READ_ATTACHMENT 即读取需要此权限

通过查询我们可以了解到 com.android.email.permission.READ_ATTACHMENT 权限的 protectionLevel 为 dangerous,即可被第三方应用获取到。

一个漏洞泄露你的邮箱的所有秘密

在确定此 ContentProvider 可以被第三方应用接触到之后,我们定位 AttachmentProvider 的源码。 源码路径如下:

/packages/apps/Email/provider_src/com/android/email/provider/AttachmentProvider.java

通过阅读源码我们可以发现 AttachmentProvider 中实现了一个 public 的 openFile 接口,该接口会返回一个 ParcelFileDescriptor 类型的对象供调用者打开文件。

public ParcelFileDescriptor openFile(Uri uri, String mode) throws

FileNotFoundException {

进入 openFile 接口立刻就会判断 mode 值是否为 “w” ,如果为 w 则会返回一个可写的文件描述符。但在返回之前,函数的实现代码进行了权限检查,如果调用者没有 com.android.email.permission.ACCESS_PROVIDER 权限的话是会抛异常的。而该权限的声明如下:

一个漏洞泄露你的邮箱的所有秘密

可以看到该权限是无法被第三方应用获取到的,所以获取可写的权限是不可行的。 继续往下分析代码。

一个漏洞泄露你的邮箱的所有秘密

接下来一系列代码会从 uri.getPathSegments()中分割开不同的字段,并从中读取相应的配置参数。 当 format 参数不等于”THUMBNAIL”时,该代码将会直接返回一个 getDatabasePath()该目录下名为 id 的文件的文件描述符。 而 id 参数是上面从 uri.getPathSegments().get(1)得到的,获取之后则没有任何处理。 uri.getPathSegments()方法的作用是将字符串以”/”进行分割,但由于其没有对经过 url 编码的字符串进行解码,导致在处理过程中,对于/编码之后的%2f 则将不做处理,从而绕过 getPathSegments 的分割。

漏洞利用

根据上面我们对于代码的分析,可以得出 AttachmentProvider 的 uri 如下:

content://accountId/id/format/width/height

我们如果想利用此漏洞读取数据,为使程序流能够成功运行至目标位置,需要构造如下 uri

content://com.android.email.attachmentprovider/1/file_position/1/1/1

而且,getDatabasePath()的目录是/data/user/0/com.android.email/databases/,如果我们要读取 Email 邮件的数据,则需要跳转至目标目录/data/data/com.android.email/来读取 Email 应用的 sqlite 数据库文件,我们需要构造如下 uri:

content://com.android.email.attachmentprovider/1/..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fdata%2Fdata%2Fcom.android.email%2Fdatabases%2FEmailProvider.db/1/1/1

而 EmailProvider.db 中存储了我们已登陆账户的账户名和密码,对应的结构为 HostAuth 表的 login 和 password 字段。 我们构造的 PoC 截图如下:

一个漏洞泄露你的邮箱的所有秘密

总结

至此,CVE-2016-3918 漏洞的分析和利用已经完成。 经过我们的测试,目前多款主流手机机型的自带电子邮件客户端都存在该问题,如小米 NOTE、华为 P9、三星 S5 等机型,为了账户的安全,请使用存在漏洞手机的用户暂停使用电子邮件客户端并清除账户信息,换至其他邮件客户端。

 


Selinux 中国 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:一个漏洞泄露你的邮箱的所有秘密
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址