一网打尽:现代安卓密码管理器与FLAG_SECURE滥用漏洞解析

本文深入分析了现代安卓密码管理器中普遍存在的FLAG_SECURE配置错误漏洞,详细介绍了1Password、Keeper和Dashlane等主流密码管理器的具体漏洞表现、攻击场景及修复方案,揭示了屏幕录制权限滥用带来的严重安全风险。

一网打尽:现代安卓密码管理器与FLAG_SECURE滥用漏洞解析

22 Aug 2019 - 发布于 Lorenzo Stella

几个月前,我偶然看到Mark Murphy在2016年发表的关于安卓FLAG_SECURE窗口泄露现状的博客文章。这类漏洞已经存在了一段时间,因此我不确定是否还能在现代安卓应用中利用同样的弱点。但事实证明,我过于乐观了。经过简短调查,我发现该问题至今仍在许多密码管理器应用(及其他应用)中存在。

问题根源

FLAG_SECURE设置最初作为WindowManager.LayoutParams的附加设置引入,旨在防止受DRM保护的内容出现在截图、视频截屏中,或通过“非安全显示”被查看。

后一个术语用于区分由MediaProjection API(捕获屏幕内容的原生API)创建的虚拟屏幕和物理显示设备(如具有DRM安全视频输出的电视屏幕)。通过这种方式,Google通过阻止未签名应用创建虚拟“安全”显示,仅允许投射到物理“安全”设备,从而预防了盗版应用问题。

虽然FLAG_SECURE如今很好地服务于其原始目的(令Netflix、Google Play Movies、Youtube Red等欣喜),但多年来开发者误将此“安全”标志视为安卓提供的简易全能安全功能,认为可借此让整个应用免于屏幕捕获或录制。

不幸的是,此功能并非全局应用于整个应用,而只能设置在包含敏感数据的特定屏幕上。更糟的是,应用中使用的每个安卓片段都不会遵循为活动设置的FLAG_SECURE,也不会将该标志传递给代表该活动创建的任何其他窗口实例。因此,Spinner、Toast、Dialog、PopupWindow等多个原生UI组件仍会将其内容泄露给具有适当权限的第三方应用。

研究方法

经过简短调查,我决定研究内容泄露影响最大的应用类别:移动密码管理器。这也是一般攻击者可能首先选择的目标类别,与银行应用并列。

基于此,我启动了一个屏幕捕获应用(mnml)并开始探查。

经过几天测试,发现所有受测的安卓密码管理器(4款)都存在不同程度的漏洞。

以下部分总结了发现的漏洞。所有漏洞均在2019年5月第二周向供应商披露。

1Password

在1Password中,“账户设置”部分提供了管理1Password账户的方法。其中一项功能是“大字体显示”,允许以大型易读格式显示账户的密钥。显示密钥的片段会将生成的密码泄露给安装在受害者设备上的第三方应用。

该密钥与用户的主密码结合,用于创建保护账户数据服务器端加密的完整加密密钥。

此问题在2019年5月29日发布的1Password for Android 7.1.5版本中修复。

Keeper

当用户点击密码字段时,Keeper会显示“已复制到剪贴板”的提示。但如果用户通过“眼睛”图标显示明文密码,提示也会包含秘密的明文密码。显示复制密码的片段会将密码泄露给第三方应用。

此问题在2019年6月21日发布的Keeper for Android 14.3.0版本中修复。官方还发布了安全公告。

Dashlane

Dashlane具有随机密码生成功能,可在插入或编辑账户条目时使用。不幸的是,负责选择“安全”密码参数的窗口对受害者设备上的第三方应用可见。

需要注意的是,攻击者还可能推断出与泄露密码关联的服务,因为服务列表和自动完成片段也缺少FLAG_SECURE标志,导致其泄露。

此问题在Dashlane for Android 6.1929.2版本中修复。

攻击场景

以下几种场景可能导致安装记录用户活动的应用:

  • 需要录制权限的恶意投射应用,因为用户通常不知道投射应用也能录制屏幕;
  • 使用Cloak & Dagger攻击的看似无害的应用;
  • 通过第三方安卓应用商店安装或绕过Play Store的PHA检测过滤器的恶意应用;
  • 在浏览器中间人攻击场景中通过Play Store功能推送到智能手机的恶意应用;

如果这些场景在现实生活中似乎不太可能发生,值得注意的是最近已经发生多起滥用此类攻击的应用实例。

非常感谢1Password、Keeper和Dashlane安全团队以专业方式处理报告、发放奖励并允许披露。请记住,使用密码管理器仍然是当前保护数字账户的最佳选择,且所有上述问题现已修复。

一如既往,这项研究得益于我在Doyensec的25%研究时间!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计