Network and Distributed Systems Security (NDSS) Symposium 2022 24-28 April 2022, San Diego, CA, USA
目前,大多数移动设备都配备了各种硬件接口,如触摸屏、指纹扫描仪、摄像头、麦克风等,用以捕获用户的输入,以进行身份认证或授权工作。
本文提出了PHYjacking攻击:用户被零权限恶意应用程序误导,将物理输入馈送到其他硬件接口,导致意外授权。
这是一种物理输入劫持攻击,这类攻击的中心问题是:授权过程中上下文的清晰性,即用户需要在做出决定前明确知道是哪个应用程序在请求,并且知道请求的数据是什么。
而UI攻击是其中一个重要的攻击点,攻击者创建一层隐蔽的覆盖层与物理输入配合,以混淆用户。
安卓系统和应用程序都在不同程度上,为物理输入提供了保护,但是我们发现了一些漏洞。针对这些漏洞,我们提出一个通用的PHYjacking攻击框架。
安卓中的认证:主要包含三个概念,目标、物理输入、实体(请求方、用户、提供者)
授权过程的安全性依靠安卓对软硬件的安全上的保证。
安卓活动生命周期:安卓“活动 (Activity)”的生命周期是安卓UI模型的核心设计之一。“活动”是安卓UI设计中的重要组件,类似于pc端的窗口,是后面讨论新型攻击的基础。身份验证过程和活动的生命周期相互交织的,比如,在onResume开始时启动监听物理输入,在onStop时取消监听。
讨论攻击者的能力:攻击者可以在设备上安装恶意应用程序,比如上传到一些非官方的程序市场让用户下载。且恶意请求不需要用户明确授予权限,且假设用户至少会启动一次该程序。
攻击目标:窃取权限,诱导用户进行物理输入,并不知不觉中将该输入进行恶意应用的授权。
攻击场景: 授权所需要的物理输入不同,劫持目标也不同。比如:指纹扫描、人脸识别、屏幕点击、NFC扫描、音频录制等。
4. 为了实现RQ1,恶意应用会想办法通过(A)来唤醒目标应用的授权行为。这是主动的方式,如果主动方式无法唤醒,则采取监听的方式,被动等待目标应用运行到需要的状态。
5. RQ2的难点在于,创建视觉覆盖(B)后,OS和APP都可能会中断授权过程,需要针对不同的情况采用相应的技术。如图中的(C)和(D)。
创建视觉覆盖的技术,其实就是PHYjacking框架中的(B)部分的操作。需要包含以下步骤:
创建视觉覆盖窗口,隐藏授权上下文。
将目标程序驱动到所需状态,为攻击做好准备。
这两步需要零权限的保证。
点击劫持:目前的点击劫持需要太多许可权限,不满足RQ3的零权限要求。
任务劫持:敌方通过操作安卓Activity的堆栈模型,劫持任务堆栈,并将恶意的活动置于目标活动之上。但是不满足RQ2,因为这种操作会使下方的活动停止活动,物理输入监听器将被中断。
半透明覆盖技术:与现有的持久覆盖不同,我们提出了一次性的劫持覆盖。具体来说:如果某个活动不在前台,Android会暂停该活动。而为覆盖活动设置半透明属性会让系统认为下面的Activity是可见的,这会使物理输入监听器在某些情况下保持活动状态。
零权限点击劫持技术:为了代替使用已有的需要权限许可的点击劫持技术,我们提出一种使用半透明覆盖的零权限点击劫持技术。 实现这项技术有三个关键:
利用竞争条件bug毁坏活动的生命周期:我们新发现了一个重大bug:如果在启动正常活动后100毫秒内启动半透明活动,活动生命周期可能会进入两个活动都恢复的不确定状态。恶意程序可以利用这个bug,创造覆盖活动在正常活动上层,且同时运行的状态。
PHYjacking攻击框架图中的(C)和(D)分别是安卓提供的系统级保护和应用程序级的保护机制。
本节中,我们分别针对不同的物理输入介绍安卓现有的保护,以及针对于这些输入不同的攻击。因为指纹扫描和人脸识别应用广泛,因此详细针对这两类分析。
正确的防护做法:在授权活动的暂停事件运行时,中断输入监听器或关闭传感器。本文将这个做法称为cancel-on-pause。正确实施这种做法,可以在一定程度上减轻劫持攻击。
指纹API:安卓9之前,没有劫持保护。恶意程序可以快速启动目标活动,并进行劫持攻击。安卓9之后,添加了补丁,在前台活动和指纹活动之间执行堆栈更改检查,以减轻指纹劫持风险。
相机API:像指纹API一样,在安卓9之前,应用程序在后台使用摄像头没有限制。从安卓9开始,从后台访问传感器引入新限制,需要后台摄像头访问的应用需要获得前台声明相应的权限。
虽然应用程序和系统都提供了保护,但仍存在实现上的缺陷。
为了免受PHYjacking攻击,开发人员应该在app中实现“cancel-on-pause”的功能,因为系统级的保护并不总是可用的。 但是我们发现有许多应用程序没有提供这种保护,或者是实现上有缺陷。主要有两种:
Never-cancel:指应用程序根本不会去主动执行 取消物理输入的行为。
Pause-failure:指应用程序只取消stop和destroy行为的指纹验证,而不是onPause。
指纹API:对安卓9为指纹API引入的堆栈更改缓解检查的分析,发现了一个错误假设导致的缺陷: 当指纹监听器启动时,身份验证活动处于前台。 但,如果监听器启动时,身份验证活动被另一个活动覆盖,那么该检查将不会被触发!!!
相机API:从安卓9开始,应用程序无法从后台访问摄像头,但它仅适用于应用程序试图从后台服务或调度器访问摄像头的情况。我们找到了当没有前台活动时, 应用程序运行任务的方法。比如,当活动切换到后台时,进程将被缓存而不是立即终止。 该线程仍然可以运行几分钟,直到系统调度程序决定终止它。我们在安卓11上做实验,相机可以精确访问1分钟,而1分钟的时间足以让恶意程序诱骗用户完成人脸识别的过程。
在本节中,我们展示了使用不同物理输入的实际物理劫持攻击的细节。
我们观察到,很大一部分应用程序出现了暂停故障。基于这样的观察,我们提出了一种使用半透明活动来覆盖目标活动的攻击,这可以避免中断物理输入。 这项技术也适用于在Android-9之前的设备上对应用程序进行指纹劫持,在这些设备上没有对堆栈更改进行检查。
半透明攻击仅适用于安卓9之前版本,因为9版本之后添加了对堆栈更改的检查。
但是,这个检查机制并不完善,就像之前说的,如果我们确保指纹监听器仅在恶意覆盖后才被初始化,就可以避开检查,基于这个,我们引入两种绕过该检查的攻击。
一、wakeup-bypass:攻击者可以在设备进入睡眠状态之前用恶意活动覆盖指纹活动,唤醒后,就会产生两个活动恢复,且下面的活动暂停的情况。如果指纹活动在onResume事件时自动监听,并且采取pause-failure策略,此时,指纹传感器就可以在后台工作,就可以避免检查。
二、Multiwindow-bypass:我们发现活动窗口有两种情况可以从一个切换到另一个:
当这两种情况发生时,“活动”堆栈不会改变,但“活动”状态会改变,事件会被触发。
因此,我们可以创建类似于Wakeup-bypass的攻击,假设设备在分屏模式下运行,其中存在两个窗口。一个是恶意窗口,另一个是用户窗口,两者相邻。
当用户放大上部窗口时,其中的活动会收到Resume事件,然后发生指纹劫持。
上述的攻击只要开发人员保护实现的完善,就能够解决。但是,race-attack攻击可以绕过指纹API中的堆栈更改检查,同时需要更少的用户交互。(竞速攻击)也就是说,就算开发人员有正确的实现,race-attack依旧可以攻击成功。
并且,竞速窗口长达100ms,导致这个bug非常容易实现。这个bug破坏了安卓活动生命周期,因此可以利用它来绕过cancel-on-pause的监测。 并且,安卓9+中的堆栈更改监测也无效,因为创建恶意覆盖比指纹活动初始化还要快。
利用上述攻击技术,我们已经可以构建实际的PHYjacking攻击。然而,仍有两个限制。
除了零权限之外,对恶意应用的要求。
半透明恶意覆盖的非持久性,因为用户可能通过点击按钮的方式清除覆盖窗口。
针对第一个限制:
针对第二个限制:
探究权限升级,升级draw over app权限。覆盖权限(SYSTEM_ALERT_WINDOW)是一种危险的权限,具有此权限的应用程序可以在其他应用程序上绘制持久的浮动窗口。“draw-over apps”权限切换在Android 11及更早版本中不受保护。因此,攻击者可以利用这一点进行作为。
对SSO劫持的精准定时控制,为了向用户隐藏SSO窗口,恶意应用程序需要在SSO活动出现后立即启动覆盖。启动的时间不能过早或过晚,需要精确的定时控制。将网络请求从SSO库转移到恶意程序中,恶意程序就可以确切知道响应时间,并发送Intent消息以直接调用具有覆盖层的SSO活动。
为了了解PHYjacking攻击的真正影响,我们设计了一个静态分析器,以自动检查大量应用程序在实践中的实现。
检查调用图是否存在缺陷的实现模式
实现:扩展了androguard来构建app的调用图,并进行可达性分析,来分析app的实现模式是否脆弱。
实现:提取类层次结构和处理java接口的算法
实验结果:收集了2024个声明了user-finger权限的app和6324个具有摄像头权限的app。在20核,64gb内存上运行8个调用图分析器实例,每个app的测试时间为77s,平均内存消耗为1201mb。
几乎有一半包含实现缺陷,很大一部分属于是 pause-failure缺陷。分析器分析出来的缺陷,还需要进一步手动分析确认使用场景和安全影响。
并且,就算是分析出来的正确实现也可能会受到race-attack的攻击。
在本文中,我们提出了一个通用框架,以实现针对各种物理输入的实际授权劫持攻击,包括指纹扫描、人脸识别等,
以及一种强大的竞争条件攻击,可以破坏Android Activity生命周期模型。
我们还讨论了其他有影响的攻击,如SSO劫持和覆盖权限升级。
通过自动和手动分析,以及针对知名的应用对恶意应用进行概念验证,我们证明了PHYjacking的实用性及其关键安全影响。