当 App 有了系统权限,真的可以为所欲为?
Android Performance Systrace
前一段时间有个 App 很火,是 Android App 利用了 Android 系统漏洞,获得了系统权限,做了很多事情。想看看这些个 App 在利用系统漏洞获取系统权限之后,都干了什么事,于是就有了这篇文章。由于准备仓促,有些 Code 没有仔细看,感兴趣的同学可以自己去研究研究,多多讨论,对应的文章和 Code 链接都在下面:
深蓝洞察:2022 年度最 “不可赦” 漏洞
XXX apk 内嵌提权代码,及动态下发 dex 分析
Android 反序列化漏洞攻防史话
关于这个 App 是如何获取这个系统权限的,Android 反序列化漏洞攻防史话,这篇文章讲的很清楚,就不再赘述了,我也不是安全方面的专家,但是建议大家多读几遍这篇文章
序列化和反序列化是指将内存数据结构转换为字节流,通过网络传输或者保存到磁盘,然后再将字节流恢复为内存对象的过程。在 Web 安全领域,出现过很多反序列化漏洞,比如 PHP 反序列化、Java 反序列化等。由于在反序列化的过程中触发了非预期的程序逻辑,从而被攻击者用精心构造的字节流触发并利用漏洞从而最终实现任意代码执行等目的。
这篇文章主要来看看 XXX apk 内嵌提权代码,及动态下发 dex 分析 这个库里面提供的 Dex ,看看 App 到底想知道用户的什么信息?总的来说,App 获取系统权限之后,主要做了下面几件事(正常 App 无法或者很难做到的事情),各种不把用户当人了。
自启动、关联启动相关的修改,偷偷打开或者默认打开:与手机厂商斗智斗勇。
开启通知权限。
监听通知内容。
获取用户的使用手机的信息,包括安装的 App、使用时长、用户 ID、用户名等。
修改系统设置。
整一些系统权限的工具方便自己使用。
另外也可以看到,这个 App 对于各个手机厂商的研究还是比较深入的,针对华为、Oppo、Vivo、Xiaomi 等终端厂商都有专门的处理,这个也是值得手机厂商去反向研究和防御的。
最好我还加上了这篇文章在微信公众号发出去之后的用户评论,以及知乎回答的评论区(问题已经被删了,但是我可以看到:如何评价拼多多疑似利用漏洞攻击用户手机,窃取竞争对手软件数据,防止自己被卸载? - Gracker的回答 - 知乎 https://www.zhihu.com/question/587624599/answer/2927765317,目前为止是 2471 个赞)可以说是脑洞大开(关于 App 如何作恶)。
- Dex 文件信息
本文所研究的 dex 文件是从 XXX apk 内嵌提权代码,及动态下发 dex 分析 这个仓库获取的,Dex 文件总共有 37 个,不多,也不大,慢慢看。这些文件会通过后台服务器动态下发,然后在 App 启动的时候进行动态加载,可以说是隐蔽的很,然而 Android 毕竟是开源软件,要抓你个 App 的行为还是很简单的,这些 Dex 就是被抓包抓出来的,可以说是人脏货俱全了。
由于是 dex 文件,所以直接使用 https://github.com/tp7309/TTDeDroid 这个库的反编译工具打开看即可,比如我配置好之后,直接使用 showjar 这个命令就可以
showjar 95cd95ab4d694ad8bdf49f07e3599fb3.dex
默认是用 jadx 打开,就可以看到反编译之后的内容,我们重点看 Executor 里面的代码逻辑即可
打开后可以看到具体的功能逻辑,可以看到一个 dex 一般只干一件事,那我们重点看这件事的核心实现部分即可
- 通知监听和通知权限相关
1.1 获取 Xiaomi 手机通知内容
文件 : 95cd95ab4d694ad8bdf49f07e3599fb3.dex
功能 :获取用户的 Active 通知
类名 :com.google.android.sd.biz_dynamic_dex.xm_ntf_info.XMGetNtfInfoExecutor - 反射拿到 ServiceManager
一般我们会通过 ServiceManager 的 getService 方法获取系统的 Service,然后进行远程调用
- 通过 NotificationManagerService 获取通知的详细内容
通过 getService 传入 NotificationManagerService 获取 NotificationManager 之后,就可以调用 getActiveNotifications 这个方法了,然后具体拿到 Notification 的下面几个字段
通知的 Title
发生通知的 App 的包名
通知发送时间
key
channelID :the id of the channel this notification posts to.
可能有人不知道这玩意是啥,下面这个图里面就是一个典型的通知
其代码如下
可以看到 getActiveNotifications 这个方法,是 System-only 的,普通的 App 是不能随便读取 Notification 的,但是这个 App 由于有权限,就可以获取
当然微信的防撤回插件使用的一般是另外一种方法,比如辅助服务,这玩意是合规的,但是还是推荐大家能不用就不用,它能帮你防撤回,他就能获取通知的内容,包括你知道的和不知道的
1.2. 打开 Xiaomi 手机上的通知权限(Push)
文件 :0fc0e98ac2e54bc29401efaddfc8ad7f.dex
功能 :可能有的时候小米用户会把 App 的通知给关掉,App 想知道这个用户是不是把通知关了,如果关了就偷偷打开
类名 :com.google.android.sd.biz_dynamic_dex.xm_permission.XMPermissionExecutor
这么看来这个应该还是蛮实用的,你个调皮的用户,我发通知都是为了你好,你怎么忍心把我关掉呢?让我帮你偷偷打开吧
App 调用 NotificationManagerService 的 setNotificationsEnabledForPackage 来设置通知,可以强制打开通知
frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java
然后查看 NotificationManagerService 的 setNotificationsEnabledForPackage 这个方法,就是查看用户是不是打开成功了
frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java
还有针对 leb 的单独处理~ 细 !
1.3. 打开 Vivo 机器上的通知权限(Push)
文件 :2eb20dc580aaa5186ee4a4ceb2374669.dex
功能 :Vivo 用户会把 App 的通知给关掉,这样在 Vivo 手机上 App 就收不到通知了,那不行,得偷偷打开
类名 :com.google.android.sd.biz_dynamic_dex.vivo_open_push.VivoOpenPushExecutor
核心和上面那个是一样的,只不过这个是专门针对 vivo 手机的
1.4 打开 Oppo 手机的通知权限
文件 :67c9e686004f45158e94002e8e781192.dex
类名 :com.google.android.sd.biz_dynamic_dex.oppo_notification_ut.OppoNotificationUTExecutor
没有反编译出来,看大概的逻辑应该是打开 App 在 oppo 手机上的通知权限
1.5 Notification 监听
文件 :ab8ed4c3482c42a1b8baef558ee79deb.dex
类名 :com.google.android.sd.biz_dynamic_dex.ud_notification_listener.UdNotificationListenerExecutor
这个就有点厉害了,在监听 App 的 Notification 的发送,然后进行统计
监听的核心代码
这个咱也不是很懂,是时候跟做了多年 SystemUI 和 Launcher 的老婆求助了....@史工
1.6 App Notification 监听
文件 :4f260398-e9d1-4390-bbb9-eeb49c07bf3c.dex
类名 :com.google.android.sd.biz_dynamic_dex.notification_listener.NotificationListenerExecutor
上面那个是 UdNotificationListenerExecutor , 这个是 NotificationListenerExecutor,UD 是啥?
这个反射调用的 setNotificationListenerAccessGranted 是个 SystemAPI,获得通知的使用权,果然有权限就可以为所欲为
1.7 打开华为手机的通知监听权限
文件 :a3937709-b9cc-48fd-8918-163c9cb7c2df.dex
类名 :com.google.android.sd.biz_dynamic_dex.hw_notification_listener.HWNotificationListenerExecutor
华为也无法幸免,哈哈哈
1.8 打开华为手机通知权限
文件 :257682c986ab449ab9e7c8ae7682fa61.dex
类名 :com.google.android.sd.biz_dynamic_dex.hw_permission.HwPermissionExecutor
- Backup 状态
2.1. 鸿蒙 OS 上 App Backup 状态相关,保活用?
文件 :6932a923-9f13-4624-bfea-1249ddfd5505.dex
功能 :Backup 相关
这个看了半天,应该是专门针对华为手机的,收到 IBackupSessionCallback 回调后,执行 PackageManagerEx.startBackupSession 方法
查了下这个方法的作用,启动备份或恢复会话
2.2. Vivo 手机 Backup 状态相关
文件 :8c34f5dc-f04c-40ba-98d4-7aa7c364b65c.dex
功能 :Backup 相关
- 文件相关
3.1 获取华为手机 SLog 和 SharedPreferences 内容
文件 : da03be2689cc463f901806b5b417c9f5.dex
类名 :com.google.android.sd.biz_dynamic_dex.hw_get_input.HwGetInputExecutor
拿这个干嘛呢?拿去做数据分析?
获取 SharedPreferences
获取 slog
- 用户数据
4.1 获取用户使用手机的数据
文件 : 35604479f8854b5d90bc800e912034fc.dex
功能 :看名字就知道是获取用户的使用手机的数据
类名 :com.google.android.sd.biz_dynamic_dex.usage_event_all.UsageEventAllExecutor
看核心逻辑是同 usagestates 服务,来获取用户使用手机的数据,难怪我手机安装了什么 App、用了多久这些,其他 App 了如指掌
那么他可以拿到哪些数据呢?应有尽有~,包括但不限于 App 启动、退出、挂起、Service 变化、Configuration 变化、亮灭屏、开关机等,感兴趣的可以看一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
frameworks/base/core/java/android/app/usage/UsageEvents.java
private static String eventToString(int eventType) {
switch (eventType) {
case Event.NONE:
return "NONE";
case Event.ACTIVITY_PAUSED:
return "ACTIVITY_PAUSED";
case Event.ACTIVITY_RESUMED:
return "ACTIVITY_RESUMED";
case Event.FOREGROUND_SERVICE_START:
return "FOREGROUND_SERVICE_START";
case Event.FOREGROUND_SERVICE_STOP:
return "FOREGROUND_SERVICE_STOP";
case Event.ACTIVITY_STOPPED:
return "ACTIVITY_STOPPED";
case Event.END_OF_DAY:
return "END_OF_DAY";
case Event.ROLLOVER_FOREGROUND_SERVICE:
return "ROLLOVER_FOREGROUND_SERVICE";
case Event.CONTINUE_PREVIOUS_DAY:
return "CONTINUE_PREVIOUS_DAY";
case Event.CONTINUING_FOREGROUND_SERVICE:
return "CONTINUING_FOREGROUND_SERVICE";
case Event.CONFIGURATION_CHANGE:
return "CONFIGURATION_CHANGE";
case Event.SYSTEM_INTERACTION:
return "SYSTEM_INTERACTION";
case Event.USER_INTERACTION:
return "USER_INTERACTION";
case Event.SHORTCUT_INVOCATION:
return "SHORTCUT_INVOCATION";
case Event.CHOOSER_ACTION:
return "CHOOSER_ACTION";
case Event.NOTIFICATION_SEEN:
return "NOTIFICATION_SEEN";
case Event.STANDBY_BUCKET_CHANGED:
return "STANDBY_BUCKET_CHANGED";
case Event.NOTIFICATION_INTERRUPTION:
return "NOTIFICATION_INTERRUPTION";
case Event.SLICE_PINNED:
return "SLICE_PINNED";
case Event.SLICE_PINNED_PRIV:
return "SLICE_PINNED_PRIV";
case Event.SCREEN_INTERACTIVE:
return "SCREEN_INTERACTIVE";
case Event.SCREEN_NON_INTERACTIVE:
return "SCREEN_NON_INTERACTIVE";
case Event.KEYGUARD_SHOWN:
return "KEYGUARD_SHOWN";
case Event.KEYGUARD_HIDDEN:
return "KEYGUARD_HIDDEN";
case Event.DEVICE_SHUTDOWN:
return "DEVICE_SHUTDOWN";
case Event.DEVICE_STARTUP:
return "DEVICE_STARTUP";
case Event.USER_UNLOCKED:
return "USER_UNLOCKED";
case Event.USER_STOPPED:
return "USER_STOPPED";
case Event.LOCUS_ID_SET:
return "LOCUS_ID_SET";
case Event.APP_COMPONENT_USED:
return "APP_COMPONENT_USED";
default:
return "UNKNOWNTYPE" + eventType;
}
}
4.2 获取用户使用数据
文件:b50477f70bd14479a50e6fa34e18b2a0.dex
类名:com.google.android.sd.biz_dynamic_dex.usage_event.UsageEventExecutor
上面那个是 UsageEventAllExecutor,这个是 UsageEventExecutor,主要拿用户使用 App 相关的数据,比如什么时候打开某个 App、什么时候关闭某个 App,6 得很,真毒瘤
4.3 获取用户使用数据
文件:1a68d982e02fc22b464693a06f528fac.dex
类名:com.google.android.sd.biz_dynamic_dex.app_usage_observer.AppUsageObserver
看样子是注册了 App Usage 的权限,具体 Code 没有出来,不好分析
- Widget 和 icon 相关
经吃瓜群众提醒,App 可以通过 Widget 伪造一个 icon,用户在长按图标卸载这个 App 的时候,你以为卸载了,其实是把他伪造的这个 Widget 给删除了,真正的 App 还在 (不过我没有遇到过,这么搞真的是脑洞大开,且不把 Android 用户当人)
5.1. Vivo 手机添加 Widget
文件:f9b6b139-4516-4ac2-896d-8bc3eb1f2d03.dex
类名:com.google.android.sd.biz_dynamic_dex.vivo_widget.VivoAddWidgetExecutor
这个比较好理解,在 Vivo 手机上加个 Widget
5.2 获取 icon 相关的信息
文件:da60112a4b2848adba2ac11f412cccc7.dex
类名:com.google.android.sd.biz_dynamic_dex.get_icon_info.GetIconInfoExecutor
这个好理解,获取 icon 相关的信息,比如在 Launcher 的哪一行,哪一列,是否在文件夹里面。问题是获取这玩意干嘛???迷
5.3 Oppo 手机添加 Widget
文件:75dcc8ea-d0f9-4222-b8dd-2a83444f9cd6.dex
类名:com.google.android.sd.biz_dynamic_dex.oppoaddwidget.OppoAddWidgetExecutor
5.4 Xiaomi 手机更新图标?
文件:5d372522-b6a4-4c1b-a0b4-8114d342e6c0.dex
类名:com.google.android.sd.biz_dynamic_dex.xm_akasha.XmAkashaExecutor
小米手机上的桌面 icon 、shorcut 相关的操作,小米的同学来认领
- 自启动、关联启动、保活相关
6.1 打开 Oppo 手机自启动
文件:e723d560-c2ee-461e-b2a1-96f85b614f2b.dex
类名:com.google.android.sd.biz_dynamic_dex.oppo_boot_perm.OppoBootPermExecutor
看下面这一堆就知道是和自启动相关的,看来自启动权限是每个 App 都蛋疼的东西啊
6.2 打开 Vivo 关联启动权限
文件:8b56d820-cac2-4ca0-8a3a-1083c5cca7ae.dex
类名:com.google.android.sd.biz_dynamic_dex.vivo_association_start.VivoAssociationStartExecutor
看名字就是和关联启动相关的权限,vivo 的同学来领了
直接写了个节点进去
6.3 关闭华为耗电精灵
文件:7c6e6702-e461-4315-8631-eee246aeba95.dex
类名:com.google.android.sd.biz_dynamic_dex.hw_hide_power_window.HidePowerWindowExecutor
看名字和实现,应该是和华为的耗电精灵有关系,华为的同学可以来看看
6.4 Vivo 机型保活相关
文件:7877ec6850344e7aad5fdd57f6abf238.dex
类名:com.google.android.sd.biz_dynamic_dex.vivo_get_loc.VivoGetLocExecutor
猜测和保活相关,Vivo 的同学可以来认领一下
- 安装卸载相关
7.1 Vivo 手机回滚卸载
文件:d643e0f9a68342bc8403a69e7ee877a7.dex
类名:com.google.android.sd.biz_dynamic_dex.vivo_rollback_uninstall.VivoRollbackUninstallExecutor
这个看上去像是用户卸载 App 之后,回滚到预置的版本,好吧,这个是常规操作
7.2 Vivo 手机 App 卸载
文件:be7a2b643d7e8543f49994ffeb0ee0b6.dex
类名:com.google.android.sd.biz_dynamic_dex.vivo_official_uninstall.OfficialUntiUninstallV3
看名字和实现,也是和卸载回滚相关的
7.3 Vivo 手机 App 卸载相关
文件:183bb87aa7d744a195741ce524577dd0.dex
类名:com.google.android.sd.biz_dynamic_dex.vivo_official_uninstall.VivoOfficialUninstallExecutor
同上
其他
SyncExecutor
文件:f4247da0-6274-44eb-859a-b4c35ec0dd71.dex
类名:com.google.android.sd.biz_dynamic_dex.sync.SyncExecutor
没看懂是干嘛的,核心应该是 Utils.updateSid ,但是没看到实现的地方
UdParseNotifyMessageExecutor
文件:f35735a5cbf445c785237797138d246a.dex
类名:com.google.android.sd.biz_dynamic_dex.ud_parse_nmessage.UdParseNotifyMessageExecutor
看名字应该是解析从远端传来的 Notify Message,具体功能未知
6.3 TDLogcatExecutor
文件
8aeb045fad9343acbbd1a26998b6485a.dex
2aa151e2cfa04acb8fb96e523807ca6b.dex
类名
com.google.android.sd.biz_dynamic_dex.td.logcat.TDLogcatExecutor
com.google.android.sd.biz_dynamic_dex.td.logcat.TDLogcatExecutor
没太看懂这个是干嘛的,像是保活又不像,后面有时间了再慢慢分析
6.4 QueryLBSInfoExecutor
文件:74168acd-14b4-4ff8-842e-f92b794d7abf.dex
类名:com.google.android.sd.biz_dynamic_dex.query_lbs_info.QueryLBSInfoExecutor
获取 LBS Info
6.5 WriteSettingsExecutor
文件:6afc90e406bf46e4a29956aabcdfe004.dex
类名:com.google.android.sd.biz_dynamic_dex.write_settings.WriteSettingsExecutor
看名字应该是个工具类,写 Settings 字段的,至于些什么应该是动态下发的
6.6 OppoSettingExecutor
文件:61517b68-7c09-4021-9aaa-cdebeb9549f2.dex
类名:com.google.android.sd.biz_dynamic_dex.opposettingproxy.OppoSettingExecutor
Setting 代理??没看懂干嘛的,Oppo 的同学来认领,难道是另外一种形式的保活?
6.7 CheckAsterExecutor
文件:561341f5f7976e13efce7491887f1306.dex
类名:com.google.android.sd.biz_dynamic_dex.check_aster.CheckAsterExecutor
Check aster ?不是很懂
6.8 OppoCommunityIdExecutor
文件:538278f3-9f68-4fce-be10-12635b9640b2.dex
类名:com.google.android.sd.biz_dynamic_dex.oppo_community_id.OppoCommunityIdExecutor
获取 Oppo 用户的 ID?要这玩意干么?
6.9 GetSettingsUsernameExecutor
文件:4569a29c-b5a8-4dcf-a3a6-0a2f0bfdd493.dex
类名:com.google.android.sd.biz_dynamic_dex.oppo_get_settings_username.GetSettingsUsernameExecutor
获取 Oppo 手机用户的 username,话说你要这个啥用咧?
6.10 LogcatExecutor
文件:218a37ea-710d-49cb-b872-2a47a1115c69.dex
类名:com.google.android.sd.biz_dynamic_dex.logcat.LogcatExecutor
配置 Log 的参数
6.11 VivoBrowserSettingsExecutor
文件:136d4651-df47-41b4-bb80-2ec0ab1bc775.dex
类名:com.google.android.sd.biz_dynamic_dex.vivo_browser_settings.VivoBrowserSettingsExecutor
Vivo 浏览器相关的设置,不太懂要干嘛
评论区比文章更精彩