-
-
[原创]从Android底层调用原理来谈黑产攻防
-
发表于:
2023-8-10 17:47
14814
-
最近忙于公司事务,今天刚好抽出时间对最近的研究成果来说道说道,受到珍惜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
众所周知,安卓AOSP是开放源代码,那么能否从安卓系统源代码中获得在黑产攻防中的优势呢?
梦开始的地方,Google为Linux写的Binder驱动
在安卓中涉及很多功能的调用,而像socket pipe这样的通道虽然方便用于传递数据,但是不方便用于应用级之间的调用,因为Android中system_server也是运行在用户级的(而非内核级)。如果使用socket、pipe的话,则无法通过内核的特权级接口获取到调用者的身份。
所以,被调用者能相对安全的获取到调用者的身份(Java层的Binder.getCallingUid()和Binder.getCallingPid()),然后被调用者就可以通过Binder驱动返回的可信信息里的uid知道是哪个App在进行调用。
假如你调用的是WifiManager.getWifiInfo(),那么路径如下:
然后来到SystemServer这边:
BinderProxy.java
所有AIDL的调用最后都会经过到这里来,然后转发到C++的Binder接口,发送给Linux内核里的Binder驱动
Binder.java
所有通过AIDL对SystemServer或者其他服务进行的调用,都会被另一端的C++ Binder接口转发到Binder.execTranslate方法,然后分发到相应的服务去
有很多办法。
例如,直接Hook BinderProxy.translate,亦或者更底层的方法,直接在SystemServer拦截execTranslate方法
.
1.对部分重要的方法采用Binder.translate的直接调用,绕过对framework的调用,防止定制ROM对framework修改的攻击
难点:兼容性不太好,需要花大量时间去兼容
.
2.基于第一点,采取更底层的方法使用C++层的接口直接和Binder驱动通信
难点:兼容性更不友好,Binder驱动更新频繁,而且每个版本的数据格式也在变化。
调用者
-
-
-
> 接受者信息
+
数据
-
-
-
> Linux Binder驱动
-
-
-
> 发送者信息
+
数据
-
-
-
> 被调用者
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2023-8-14 18:00
被恋空编辑
,原因: