Android锁屏状态下的安全分析

简介

Android从6.0开始,默认开启了全盘加密(Full Disk Encryption,即FDE),设备开机后第一次解锁时,用户数据处于加密状态,大多数功能在开机解锁前不可用。如下图:

upload successful

如果没有输入正确的密码,用户数据是解不开的,因此在这一状态下即使物理控制设备,想要进一步攻破设备或者窃取数据也是极其困难的。

用户输入正确的密码后,进入系统,数据解开,所有功能正常使用。当再次锁屏时,必须要解锁后才会进入系统,但这一状态下也是有部门功能处于可用状态,例如下滑查看设置页面、手电筒、闹钟、计算器、锁屏壁纸等功能。

如果锁屏状态下的系统设计存在安全问题,攻击者在接触到用户设备后,就可能窃取用户数据,设置完全解锁手机。因此,本文主要讨论在手机不关机情况下,锁屏状态下的安全问题。

攻击面分析

锁屏状态下,所有可用的功能都有可能是一个攻击入口或载体,这里主要总结如下:

锁屏下的数据交互

手机虽然处于锁屏状态,但还是可以接收推送消息、刷公交卡等,这就意味着锁屏下存在着数据交互,例如网络数据、蓝牙数据、NFC数据等,大多数情况下这些数据都是被动生成的,虽无法造成严重的安全问题,但有可能存在数据泄露。典型的场景可能有:

  • 结合Kama攻击抓取wifi流量(锁屏下无法设置wifi)
  • 开启NFC直接进行支付
  • 冒充蓝牙设备进行通信等

语音助手

语音助手几乎是只能手机的标配,且其功能注定了锁屏下处于可用状态。如果语音助手的设计有问题,可能在锁屏下泄露用户数据。例如唤起某些APP、泄露用户个人信息、唤起智能家居甚至完成支付,严重时甚至直接跳过锁屏界面。

通过逆向语音助手APP的实现,可以挖掘更多的攻击面。

不安全的Activity跳转

先前有很多直接绕过锁屏进入activity的案例,其根本原因是在锁屏下调用startActivity时,未判断是否解锁。如果未解锁的话,需要调用KeyguardManager的requestDismissKeyguard调出解锁页面。

辅助屏幕(Lock screen on secondary display)

根据Android官方文档,手机厂商可以为辅助显示屏实现其自己的锁定屏幕,只需要设置要显示的Activity属性(Manifest文件中设置对应Activity的showWhenLocked为true或动态设置Activity.setShowWhenLocked(true))。

根据文档描述,设备锁定时应显示或隐藏哪些内容,没有相关的内置政策或控制,完全取决于开发者的设置,因此如果配置不当,则有可能导致敏感信息在锁屏页显示。

比较常见的案例是锁屏壁纸,国内四大厂商都在锁屏页默认开启了锁屏壁纸,在锁屏状态下可以滑动和浏览壁纸,设置可以收藏、点赞和评论,个别厂的锁屏壁纸还插入了广告,点击后调起webview,无疑增加了更多的攻击面。

某锁屏杂志分析

前一阵子在某厂的手机上乱点,竟然直接点进了google主页,这里作简单的记录。

点击触发路径:
任意一张锁屏壁纸 -> 阅读全文 -> 刷出某厂自己的广告 -> 页面最下方隐私政策 -> 点隐私政策里的超链接 -> 进入到google -> 进入任意页面

该锁屏壁纸点击详情后,用webview渲染内容,且webview注册了jsinterface接口,用来处理登录、下载和安装APP、利用Deeplink唤起页面等操作。

基于这些jsinterface,一条完美的攻击链如下:

  1. 攻击者开发恶意APP,其Activity中带reverse shell且showWhenLocked为true,并配置deeplink
  2. 利用上述路径使webview加载攻击者的页面
  3. 利用jsinterface下载和安装准备好的恶意APP
  4. 利用deeplink唤起activity,得到锁屏下的shell

需要注意的是,动态权限的弹窗会直接触发解锁页面,所以一定程度上讲,该攻击造成的效果有限。