PHYjacking Physical Input Hijacking for Zero-Permission Authorization Attacks on Android

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时取消监听。

在这里插入图片描述

贡献

  • 我们提出PHYjacking通用攻击框架,这是一种新的授权劫持攻击。
  • 我们发现了Android中的安全问题,包括可能破坏Android活动生命周期模型的race-attack以及容易被劫持的关键权限设置。
  • 我们通过对常用应用程序的概念验证攻击,展示了PHYjacking的实用性和关键影响,并在安卓11系统上对应用程序权限进行了升级。
  • 我们设计了一个静态代码分析器,并使用它来发现大量的Android应用程序包含易受PHY劫持的实现缺陷。

PHYjacking 攻击框架

讨论攻击者的能力:攻击者可以在设备上安装恶意应用程序,比如上传到一些非官方的程序市场让用户下载。且恶意请求不需要用户明确授予权限,且假设用户至少会启动一次该程序。

攻击目标:窃取权限,诱导用户进行物理输入,并不知不觉中将该输入进行恶意应用的授权。

攻击场景: 授权所需要的物理输入不同,劫持目标也不同。比如:指纹扫描、人脸识别、屏幕点击、NFC扫描、音频录制等。

PHY劫持攻击的必要步骤(要求)

  1. 目标应用程序需要运行到可以监听物理输入的状态。
  2. 恶意程序在不打断RQ1状态下,创建虚假的视觉覆盖,隐藏授权上下文。
  3. 恶意程序需要零权限,不应有太多要求限制。

在这里插入图片描述
4. 为了实现RQ1,恶意应用会想办法通过(A)来唤醒目标应用的授权行为。这是主动的方式,如果主动方式无法唤醒,则采取监听的方式,被动等待目标应用运行到需要的状态。
5. RQ2的难点在于,创建视觉覆盖(B)后,OS和APP都可能会中断授权过程,需要针对不同的情况采用相应的技术。如图中的(C)和(D)。

混淆场景的设置技术

创建视觉覆盖的技术,其实就是PHYjacking框架中的(B)部分的操作。需要包含以下步骤:

  1. 创建视觉覆盖窗口,隐藏授权上下文。

  2. 将目标程序驱动到所需状态,为攻击做好准备。

这两步需要零权限的保证。

现有的技术以及存在的缺陷

  1. 点击劫持:目前的点击劫持需要太多许可权限,不满足RQ3的零权限要求。

  2. 任务劫持:敌方通过操作安卓Activity的堆栈模型,劫持任务堆栈,并将恶意的活动置于目标活动之上。但是不满足RQ2,因为这种操作会使下方的活动停止活动,物理输入监听器将被中断。

我们提出的新技术

  1. 半透明覆盖技术:与现有的持久覆盖不同,我们提出了一次性的劫持覆盖。具体来说:如果某个活动不在前台,Android会暂停该活动。而为覆盖活动设置半透明属性会让系统认为下面的Activity是可见的,这会使物理输入监听器在某些情况下保持活动状态

  2. 零权限点击劫持技术:为了代替使用已有的需要权限许可的点击劫持技术,我们提出一种使用半透明覆盖的零权限点击劫持技术。 实现这项技术有三个关键:

    1. 点击传递:覆盖层需要将点击事件传递到下面的窗口。
    2. 持久性:如果下面应用程序启动一个新窗口,我们的覆盖会被切换到后台,但会重新启动它的onPause事件,在顶部重新恢复。
    3. 状态推断:为了让攻击更加可信,通过状态推断,覆盖层需要自适应地改变内容。
  3. 利用竞争条件bug毁坏活动的生命周期:我们新发现了一个重大bug:如果在启动正常活动后100毫秒内启动半透明活动,活动生命周期可能会进入两个活动都恢复的不确定状态。恶意程序可以利用这个bug,创造覆盖活动在正常活动上层,且同时运行的状态。

安卓保护机制的分析

PHYjacking攻击框架图中的(C)和(D)分别是安卓提供的系统级保护和应用程序级的保护机制。

本节中,我们分别针对不同的物理输入介绍安卓现有的保护,以及针对于这些输入不同的攻击。因为指纹扫描和人脸识别应用广泛,因此详细针对这两类分析。

应用程序级别的保护机制

正确的防护做法:在授权活动的暂停事件运行时,中断输入监听器或关闭传感器。本文将这个做法称为cancel-on-pause。正确实施这种做法,可以在一定程度上减轻劫持攻击。

系统API提供的保护机制

  1. 指纹API:安卓9之前,没有劫持保护。恶意程序可以快速启动目标活动,并进行劫持攻击。安卓9之后,添加了补丁,在前台活动和指纹活动之间执行堆栈更改检查,以减轻指纹劫持风险

  2. 相机API:像指纹API一样,在安卓9之前,应用程序在后台使用摄像头没有限制。从安卓9开始,从后台访问传感器引入新限制,需要后台摄像头访问的应用需要获得前台声明相应的权限

虽然应用程序和系统都提供了保护,但仍存在实现上的缺陷。

应用程序级别保护的实现缺陷:

为了免受PHYjacking攻击,开发人员应该在app中实现“cancel-on-pause”的功能,因为系统级的保护并不总是可用的。 但是我们发现有许多应用程序没有提供这种保护,或者是实现上有缺陷。主要有两种:

  1. Never-cancel:指应用程序根本不会去主动执行 取消物理输入的行为。

  2. Pause-failure:指应用程序只取消stop和destroy行为的指纹验证,而不是onPause。

系统API提供的保护机制存在的缺陷

  1. 指纹API:对安卓9为指纹API引入的堆栈更改缓解检查的分析,发现了一个错误假设导致的缺陷: 当指纹监听器启动时,身份验证活动处于前台。 但,如果监听器启动时,身份验证活动被另一个活动覆盖,那么该检查将不会被触发!!!

  2. 相机API:从安卓9开始,应用程序无法从后台访问摄像头,但它仅适用于应用程序试图从后台服务或调度器访问摄像头的情况。我们找到了当没有前台活动时, 应用程序运行任务的方法。比如,当活动切换到后台时,进程将被缓存而不是立即终止。 该线程仍然可以运行几分钟,直到系统调度程序决定终止它。我们在安卓11上做实验,相机可以精确访问1分钟,而1分钟的时间足以让恶意程序诱骗用户完成人脸识别的过程。

针对不同的物理输入的研究

在本节中,我们展示了使用不同物理输入的实际物理劫持攻击的细节。

我们观察到,很大一部分应用程序出现了暂停故障。基于这样的观察,我们提出了一种使用半透明活动来覆盖目标活动的攻击,这可以避免中断物理输入。 这项技术也适用于在Android-9之前的设备上对应用程序进行指纹劫持,在这些设备上没有对堆栈更改进行检查。

在这里插入图片描述
半透明攻击仅适用于安卓9之前版本,因为9版本之后添加了对堆栈更改的检查。

但是,这个检查机制并不完善,就像之前说的,如果我们确保指纹监听器仅在恶意覆盖后才被初始化,就可以避开检查,基于这个,我们引入两种绕过该检查的攻击。

一、wakeup-bypass:攻击者可以在设备进入睡眠状态之前用恶意活动覆盖指纹活动,唤醒后,就会产生两个活动恢复,且下面的活动暂停的情况。如果指纹活动在onResume事件时自动监听,并且采取pause-failure策略,此时,指纹传感器就可以在后台工作,就可以避免检查。
在这里插入图片描述
二、Multiwindow-bypass:我们发现活动窗口有两种情况可以从一个切换到另一个:

  1. 当用户点击非活动窗口时,它将变为活动窗口,其中的topActivity将恢复。
  2. 当用户调整窗口大小时,无论用户之前与哪个窗口交互,较大的窗口都将变为活动窗口。

当这两种情况发生时,“活动”堆栈不会改变,但“活动”状态会改变,事件会被触发。

因此,我们可以创建类似于Wakeup-bypass的攻击,假设设备在分屏模式下运行,其中存在两个窗口。一个是恶意窗口,另一个是用户窗口,两者相邻。

当用户放大上部窗口时,其中的活动会收到Resume事件,然后发生指纹劫持。

在这里插入图片描述

上述的攻击只要开发人员保护实现的完善,就能够解决。但是,race-attack攻击可以绕过指纹API中的堆栈更改检查,同时需要更少的用户交互。(竞速攻击)也就是说,就算开发人员有正确的实现,race-attack依旧可以攻击成功。

并且,竞速窗口长达100ms,导致这个bug非常容易实现。这个bug破坏了安卓活动生命周期,因此可以利用它来绕过cancel-on-pause的监测。 并且,安卓9+中的堆栈更改监测也无效,因为创建恶意覆盖比指纹活动初始化还要快。

在这里插入图片描述

探索影响升级的其他攻击技术

利用上述攻击技术,我们已经可以构建实际的PHYjacking攻击。然而,仍有两个限制。

  1. 除了零权限之外,对恶意应用的要求。

  2. 半透明恶意覆盖的非持久性,因为用户可能通过点击按钮的方式清除覆盖窗口。

针对第一个限制

  1. 探究从网页发起PHYjacking攻击的可能性。并通过小规模的实验,找到了从网页发起PHYjacking攻击的方式。利用远程应用程序链接机制,从网页启动目标授权。

针对第二个限制:

  1. 探究权限升级,升级draw over app权限。覆盖权限(SYSTEM_ALERT_WINDOW)是一种危险的权限,具有此权限的应用程序可以在其他应用程序上绘制持久的浮动窗口。“draw-over apps”权限切换在Android 11及更早版本中不受保护。因此,攻击者可以利用这一点进行作为。

  2. 对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的实用性及其关键安全影响。

猜你喜欢

转载自blog.csdn.net/Sky_QiaoBa_Sum/article/details/127882828