cover_image

Android前台服务恶意进程防杀技术解析

OPPO安珀实验室 OPPO安珀实验室
2023年12月29日 08:00


恶意防杀漏洞概述


01

恶意防杀漏洞定义

Android应用的防杀是指进程在后台运行保持活跃状态,并尽可能延长应用在后台运行的时间,防止被系统kill掉。

02

恶意防杀漏洞的危害:

首先,恶意应用程序可以在后台悄悄采集用户的输入,收集用户的隐私信息和推送广告耗费流量等,给用户带来严重的安全隐患。

其次,应用进程的恶意防杀行为可导致资源占用过高、电池消耗过快,影响手机的续航能力。

然后,应用进程的恶意防杀行为可消耗手机CPU的内存资源,影响手机的运行速度,导致手机卡顿,拖垮Android 平台的流畅性。

最后,如果恶意防杀技术被滥用,原本不需要持续运行的进程无法被及时终止运行,而需要正常运行的应用得不到平等的运行机会,破坏了Android系统的生态平衡。


进程的恶意防杀技术层出不穷,一般分为保活和拉活。[1]

本文重点对Android前台服务类型进程的恶意防杀漏洞进行解析,分析漏洞成因,以及一些相关的技术。


注: 本文提到的漏洞均是Google安全公告中公开发布,发布时间超过了一年,已经完成修复,仅用于学习和研究。



前台服务防杀原理概述


01

Android Low memory killer机制简述


Android Low memory killer:Android低内存杀手守护进程(简称lmkd)监控运行中的 Android 系统的内存状态,并在内存压力较高时采取措施,通过终止最不重要的进程来保持系统性能处于可接受的水平。


Android是一个多任务系统,启动运行一个程序是有时间开销的,因此为了加快运行速度,当退出一个程序时,Android并不会立即杀掉它,而是将其缓存起来,这样下次再运行该程序时,可以快速启动。随着系统中缓存的程序越来越多,当内存不足时,Android系统就开始运行Low Memory Killer机制,根据进程的优先级,给每个进程一个OOM权重值,当系统内存不足时,根据内存阈值级别触发内存回收的机制,按照优先级去选择将不重要的进程杀掉,以腾出空间保证更高优先级的进程能正常运行。

02

进程分类和oom_adj值


Android进程分类的具体定义值,在Android的源代码中有详细的描述,具体信息可以参考源码中的ProcessList.java文件中的定义,下图是 LMK 杀死进程时使用的adj值:

图片


接下来介绍5种常见的进程状态以及对应的OOM_ADJ值,如表1所示:

oom_adj

源码中的命名

oom_score_adj

中文翻译

说明

0

FOREGROUND_APP

0

前台进程

运行在前台的应用程序进程。如用户正在交互的Activity属于前台进程。

1

VISIBLE_APP

100

可见进程

部分程序界面能够被用户看见,却不在前台和用户交互的进程。比如动态壁纸服务就属于可见进程。

3

PERCEPTIBLE_APP

200

可感知进程

可感知进程,通过startForeground设置的进程,比如后台播放音乐和后台文件下载等。

7

SERVICE

500

服务进程

通过startService方法启动的正在运行的服务,且不属于上述两个更高类别进程的进程。

13-15

CACHED_APP

900-999

空进程

不包含任何应用组件的进程,保留这种进程的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。因此当其他地方需要内存时,系统可以根据需要终止进程。

表1 5种常见的进程状态以及对应的OOM_ADJ值


由上面的总结可以看出进程优先级:

前台进程 > 可见进程 > 可感知的进程 > 服务进程 > 空进程。前三类不容易被kill,而oom_score_adj值超过900后就容易被系统发现并杀掉。[1]

最后一条原则,具有相同oom_adj值的进程,则系统会杀死占用内存较多的。


因此要实现进程防杀,可以使用以下两种方式:

1、提高进程的优先级,就是减小进程的oom_adj(值越小,进程越重要,越不容易被kill掉);

2、降低APP的内存占用量,在oom_adj相同的时候,会优先干掉内存消耗大的进程。



常见前台服务进程防杀漏洞分类



恶意应用使用的前台服务防杀技术需要从研究通知入手,使用技术手段使得前台服务的通知对于用户不可见,而同时进程可以在后台继续运行。从之前的分析可知,通过调用startForeground将Service变成前台服务,所在进程就算退到后台,优先级只会降到PERCEPTIBLE_APP_ADJ或者VISIBLE_APP_ADJ,oom_adj值远小于900,不会被Low Memory Killer机制将其进程kill掉。


实现防杀的方式是想方设法在通知栏中不显示与前台服务关联的通知,更进一步的造成用户“不可见”,而前台服务进程继续保持在后台运行。

还有一种方式是构造畸形通知,导致通知被消除,而前台进程继续存活。


01

新建线程在后台录音,关闭前台服务


漏洞举例:

如CVE-2019-2219,在系统创建前台服务后,应用有五秒的时间来调用该服务的 startForeground() 方法以显示该服务关联的用户可见的通知。如果应用在此时间限制内未调用 startForeground(),则系统将停止前台服务并声明此应用为 ANR。


但是在这个5秒钟的间隙,在前台服务中新建一个线程在后台录音,然后stop这个前台服务,这样通知就不可见了,但是thread依然可以在后台运行。[2]

02

启动前台服务后,主动删除通知channel


漏洞举例:

如CVE-2021-0513,启动前台服务后,主动删除通知关联的Channel,可以把前台通知清除掉,实现对用户不可见,但前台服务依然在后台继续运行。


修复方法:

删除通知Channel时,如果仍持有与通知channel关联的活动的前台服务就抛出异常,不允许删除。

图片



总结



Android应用恶意防杀一直是黑灰产的研究重点和热点方向,通过提升自己的进程的优先级,避免被系统杀掉,可以实现在后台获取用户的定位信息,录音,推送广告等恶意行为。

同时Android应用恶意防杀漏洞的滥用对Android平台的流畅性造成严重的威胁,造成被人诟病的耗电、卡顿问题。


本文中将Android恶意应用常用的防杀手段尤其是前台服务恶意防杀技术和存在的安全风险做了深入的解析和总结,希望能够引起开发者的重视和加强防范,如有发现手机中存在此类恶意应用,可以和我们联系。



参考文档:

[1] 揭秘潜藏在你手机里的“钉子户” (OPPO安全应急响应中心)

https://mp.weixin.qq.com/s/UqmZtFtQPMadP_XOafh71A

[2] Hacking Android Foreground Services – Escalation of Privileges

https://nullcon.net/media/media/hacking-android-foreground-services-Goa22.pdf



➤ 往期推荐

· Android本地服务漏洞挖掘技术 - 中篇

· Android本地服务漏洞挖掘技术 - 上篇

· 浅谈Android BLE蓝牙安全隐私问题

· 手把手系列之——syzkaller原理及实现分析

· 浅谈 Hybrid App


技术文档 · 目录
上一篇Android本地服务漏洞挖掘技术 - 中篇下一篇Android本地服务漏洞挖掘技术 - 下篇
继续滑动看下一个
OPPO安珀实验室
向上滑动看下一个