首页
社区
课程
招聘
10
[原创]ebpf在Android安全上的应用:结合binder完成一个行为检测沙箱(下篇)
发表于: 2024-4-24 19:13 4359

[原创]ebpf在Android安全上的应用:结合binder完成一个行为检测沙箱(下篇)

2024-4-24 19:13
4359

ebpf在Android安全上的应用:结合binder完成一个行为检测沙箱(下篇)

一、IPC简单介绍

IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。

Android在什么时候会有跨进程通信的需要?Android在请求系统服务的时候会有跨进程通信的需求,例如访问手机通讯录、获取定位等等行为,本文的目标即是实现一个简易的捕捉这些行为的沙箱


二、binder简单介绍

Binder是Android中的一种跨进程通信方式,可以理解为是IPC的一种具体实现方式


三、ServiceManager简单介绍

ServiceManager是Android中一个及其重要的系统服务,从它的名称上就可以知道,它是用于管理系统服务的

ServiceManagerinit进程启动

ServiceManager负责了以下的一些功能:服务的注册与查找、进程间通信、系统服务的启动与唤醒、提供系统服务的清单实例

binder驱动决定了底层的通信详情,那么ServiceManager则相当于导航,告诉具体的通信该怎么走,达到那里等


四、通信分析

4.1 客户端调用JAVA层分析

WifiManager类的getConnectInfo函数(该函数获取wifi信息)为例进行分析

ctrl+左键查看引用,可以发现该函数定义在android.net.wifi.WifiManager类中,如下图所示:

7.png

8.png

从上图可以看到,getConnectInfo函数具体代码只有一句throw new RuntimeException("Stub!");,这告诉我们这个函数是由rom中相同的类去替代执行,该函数在这被定义是编译所需要(PS:可以参考https://blog.csdn.net/ttkatrina/article/details/76180641),在android源码中的目录frameworks/base/wifi/java/amdroid/net/wifi下我们可以找到该类,然后找到该函数的具体实现,如下图所示:

9.png

可以发现该函数调用了IWifiManagergetConnectionInfo函数,在frameworks/base/wifi/java/amdroid/net/wifi目录下可以找到IWifiManager.aidl文件,该aidl中定义了getConnectionInfo函数,如下图所示:

10.png

11.png

这里需要引入一个概念 --- AIDLAIDL是android的一种接口语言,用于公开android服务的接口,以此来实现跨进程的函数调用。AIDL在编译时会生成两个类,即StubProxy两个类,Stub类是服务端抽象层的体现,Proxy是客户端获取的实例,android通过proxy-stub这种设计模式实现了IPC

下面写一个aidl文件然后生成相应的java代码来看看是怎么实现调用的,首先,我们在android studio中随便找一个项目,然后新建一个aidl文件,如下图所示:

12.png

13.png

然后Build->Make Probject即可生成,生成的路径位于build/generated/aidl_source_output_dir/debug/out/包名,如下图所示:

14.png

观察生成后的java文件可发现,Proxy类已经生成,在Proxy类中我们可以找到我们定义的函数,如下图所示:

15.png

具体分析一下该函数,首先通过obtain函数生成了一个Parcel实例,然后调用Parcelwrite系列函数进行写入,其实就是一个序列化的过程,然后调用了IBindertransact函数,跟踪分析一下该函数,在目录frameworks/base/core/java/android/os下可以找到该java文件,如下图所示:

16.png

17.png

可以发现,IBinder仅仅是一个接口,其中定义了transact方法,该方法有4个参数,第一个参数code在我们的远程调用中为函数编号,服务端接受到这个编号后,会去寻找Stub类中的静态变量,从而解析出是调用那个函数,第二个和第三个参数_data_reply为传入的参数和返回的值,都是经过序列化后的数据,最后一个参数flags为指示是否需要阻塞等待结果,0为阻塞等待,1为立即返回。

全局搜索一下,可以发现同目录下的BinderProxy类实现了该接口(PS:值得注意的是,同目录下面还存在一个Binder类,也实现了该接口,但Binder类是服务端的实现,而不是客户端的实现),如下图所示:

18.png

19.png

分析该函数,可以发现最后走向了transactNative函数,到此为止,进行IPC通信客户端java层已经分析完毕

20.png

4.2 客户端调用Native层分析

全局搜索一下transactNative函数,可以发现该函数在native层中注册信息,如下图所示:

21.png

跟踪一下android_os_BinderProxy_transact函数,可以发现该函数首先通过getBPNativeData(env, obj)->mObject.get()获取到了一个BpBinder对象,然后调用了BpBindertransact函数,如下图所示:


[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 10
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2024-5-31 06:49
一路南寻
为你点赞~
2024-5-31 06:19
嫉妒的死远点
为你点赞~
2024-5-31 06:17
東陽不列山
为你点赞~
2024-5-31 06:15
拾海
为你点赞~
2024-5-14 09:27
狄人3
为你点赞~
2024-4-30 16:40
[軍]
为你点赞~
2024-4-26 11:46
令狐双
为你点赞~
2024-4-25 15:31
oacia
为你点赞~
2024-4-25 12:35
你瞒我瞒
为你点赞~
2024-4-25 10:26
最新回复 (4)
雪    币: 3995
活跃值: (31436)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2024-4-25 09:17
1
雪    币: 6
活跃值: (1282)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
我选择修改binder驱动
2024-4-25 14:13
0
雪    币: 1109
活跃值: (3626)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
tracepoints 里就一个 `trace_binder_ioctl(cmd, arg)` 适合使用的,应该改 binder 驱动,多加点 trace_binder_xxxx。
2024-4-25 15:44
0
雪    币: 136
活跃值: (1212)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
"跟进waitForResponse函数,可以发现该函数最重要的就是调用talkWithDriver函数,分析一下talkWithDriver函数,可以发现最终调用了ioctl"
根据原文的这句话 是否可以认为 拦截ioctl系统调用就可以监听所有的binder通信
2024-4-26 11:13
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册