一、 概述
Android 6.0引入的Doze机制本意在于节省系统耗电量,延长电池的使用时间,但是却在抑制恶意软件对系统资源的占用上发挥了神奇的效果,恶意软件因此也开始探索绕过Doze机制的手段。文本将为大家简要介绍Doze的功能,并从安全的角度解读Doze的奇效,最后揭露一款绕过Doze机制的恶意软件。
二、 Doze简介
(一) Doze功能详情
Android 6.0(API 23)为用户和开发者带来了许多新功能,Doze(打盹)即为其中的一项。Doze的主要目的是节省设备的耗电量,即当设备未连接至电源,且长时间处于闲置状态时,系统会将应用置于“打盹”模式。在这个模式下,不在白名单中的应用将无法连接网络和占用CPU资源,并且其作业、同步和标准闹铃的运行时间将被推迟。由于该模式与API版本无关,因此未适配API 23及其后版本的应用只要运行在Android 6.0及更高版本的系统下,就会受到Doze模式影响。
如图1所示,应用了Doze模式的Android系统在满足了上述进入Doze状态的条件后,会周期性地退出Doze状态进入一段时长为30秒的,被称为maintenance window的时间段。在此期间,系统会退出Doze模式以使得应用完成被延时的任务。从图中可以看出随着Doze状态的持续,设备距离下一次被唤醒的等待时间会越来越长。
图1 Doze模式下的maintenance window状态示意
(图片来源:https://developer.android.com/training/monitoring-device-state/doze-standby.html?hl=en)
当系统处于Doze模式下,系统和白名单之外的应用将受到以下限制:
1.无法访问网络;
2.Wake Locks被忽略;
3.AlarmManager闹铃会被推迟到下一个maintenance window响应,除非使用setAndAllowWhileIdle()或SetExactAndAllowWhileIdle()设置闹铃。与此同时,setAlarmClock()设置的闹铃在Doze模式下仍然生效,但系统会在闹铃生效前退出Doze;
4.系统不执行Wi-Fi扫描;
5.系统不允许同步适配器运行;
6.系统不允许JobScheduler运行;
需要注意的是,开发者仍然可以使用官方提供的GCM服务(Google Cloud Messaging)使得应用可以在Doze模式下传递消息并被允许临时访问网络服务和部分Wake Locks,这一机制通过高优先级GCM消息启用,且不会影响Doze模式。
(二) Doze模式下的白名单
Google官方认为,开发者通过合理安排任务和使用官方提供的GCM高优先级消息,大部分应用应该能与Doze模式兼容。对于剩下的那一小部分应用,系统则提供了一份可配置的白名单。位于白名单中的应用可以继续使用网络并保留部分wake lock,但作业和同步仍然会被推迟,常规的AlarmManager闹铃也不会被触发。Android developers提供了一个列表来指导开发者确定自己的应用需要使用哪些方式。
表1 对GCM和白名单的使用指导
(图片来源:https://developer.android.com/training/monitoring-device-state/doze-standby.html?hl=en)
对于用户,可以直接进入设置->电池->电池优化中进行设置:
图2 白名单设置界面
开发者可以调用PowerManager.isIgnoringBatteryOptimizations方法检测应用是否在白名单中。若应用不在白名单中,开发者可以在AndroidManifest.xml中申请REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限,并使用一个包含了ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS的 Intent弹出对话框让用户选择将本应用加入白名单中。在用户对应用设置了白名单之后,可以根据需要从白名单中移除应用。
图3 通过发送Intent触发对话框
三、 Doze对恶意软件的影响
现在我们抛开Doze的省电功效,从安全的角度来探讨Doze的奇效。Doze实现省电的方式本质上是系统通过全局调控的方式限制应用程序对资源的占用,这种调控方式的产生表明了系统对于应用程序在资源占用方式上的态度转变——从“放任自由”到开始强有力的“调控”,调控产生了两种神奇的效果:
1.在Android 6.0以前,内核通过任务调度机制来决定应用程序对资源的占用,而Doze的产生意味着在内核之上产生了一层优先“调度”机制,这层“调度”机制能够改变应用程序对于系统资源的占用比例;
图4 Android 6.0以前任务调度方式