-
-
[原创]从Android底层调用原理来谈黑产攻防
-
2023-8-10 17:47
13503
-
最近忙于公司事务,今天刚好抽出时间对最近的研究成果来说道说道,受到珍惜Any大神的文章启发,特地研究了一下Binder驱动的原理,分享出来给大家。
参考:
https://bbs.kanxue.com/thread-277637.htm
http://aospxref.com/android-13.0.0_r3/
https://github.com/torvalds/linux/blob/master/drivers/android/binder.c#L5610
1.序言
众所周知,安卓AOSP是开放源代码,那么能否从安卓系统源代码中获得在黑产攻防中的优势呢?
2.一切的根源 -- Binder
![Linux Binder驱动](upload/attach/202308/862224_FZE9FYXDF477WYY.png)
梦开始的地方,Google为Linux写的Binder驱动
那么Binder的工作原理是什么呢?
在安卓中涉及很多功能的调用,而像socket pipe这样的通道虽然方便用于传递数据,但是不方便用于应用级之间的调用,因为Android中system_server也是运行在用户级的(而非内核级)。如果使用socket、pipe的话,则无法通过内核的特权级接口获取到调用者的身份。
Binder调用为什么就安全呢?
1 | 调用者 - - - > 接受者信息 + 数据 - - - > Linux Binder驱动 - - - > 发送者信息 + 数据 - - - > 被调用者
|
所以,被调用者能相对安全的获取到调用者的身份(Java层的Binder.getCallingUid()和Binder.getCallingPid()),然后被调用者就可以通过Binder驱动返回的可信信息里的uid知道是哪个App在进行调用。
Android Framework是怎么完成接口调用的?
1 | Framework - - - > AIDL - - - > Binder - - - > SystemServer
|
假如你调用的是WifiManager.getWifiInfo(),那么路径如下:
1 | WifiManager.java - - - > IWifiManager.aidl - - - > Binder.translate - - - > Binder驱动
|
然后来到SystemServer这边:
1 | Binder驱动 - - - > Binder.execTranslate - - - > IWifiManager.onTranslate - - - > WifiManagerService.getWifiInfo()
|
3.接口调用的最后一道门Binder.java和BinderProxy.java
BinderProxy.java
![图片描述](upload/attach/202308/862224_N37HWS6R4BQB5QY.png)
所有AIDL的调用最后都会经过到这里来,然后转发到C++的Binder接口,发送给Linux内核里的Binder驱动
Binder.java
![图片描述](upload/attach/202308/862224_P47HGMWWCG35YND.png)
所有通过AIDL对SystemServer或者其他服务进行的调用,都会被另一端的C++ Binder接口转发到Binder.execTranslate方法,然后分发到相应的服务去
4.怎么攻?怎么防?
========= 攻 ===========
有很多办法。
例如,直接Hook BinderProxy.translate,亦或者更底层的方法,直接在SystemServer拦截execTranslate方法
.
======== 防 ========
1.对部分重要的方法采用Binder.translate的直接调用,绕过对framework的调用,防止定制ROM对framework修改的攻击
难点:兼容性不太好,需要花大量时间去兼容
.
2.基于第一点,采取更底层的方法使用C++层的接口直接和Binder驱动通信
难点:兼容性更不友好,Binder驱动更新频繁,而且每个版本的数据格式也在变化。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2023-8-14 18:00
被恋空编辑
,原因: