- Android系统级深入开发
- 韩超 梁泉
- 402字
- 2020-08-26 21:43:42
4.3.7 Android Paranoid网络
Android Paranoid网络是一个对Linux内核网络部分的改动,通过这个改动增加了网络的认证机制。这个特性通过宏ANDROID_PARANOID_NETWORK来进行使能。
这个特性主要影响了Linux源代码中以下一些文件:
net/ipv4/af_inet.c:IPV4的协议文件
net/ipv6/af_inet6.c:IPV6的协议文件
net/bluetooth/af_bluetooth.c:蓝牙的协议文件
security/commoncap.c:安全性的文件
事实上,af_inet.c,af_inet6.c和af_bluetooth.c是3种不同的网络协议中处理协议方面的文件,它们在逻辑上是并列的关系。
Android的头文件include/linux/android_aid.h中定义了关于网络的部分AID,这个内容和标准的Linux有所区别,如下所示:
#ifndef _LINUX_ANDROID_AID_H #define _LINUX_ANDROID_AID_H #define AID_NET_BT_ADMIN 3001 #define AID_NET_BT 3002 #define AID_INET 3003 #define AID_NET_RAW 3004 #define AID_NET_ADMIN 3005 #endif
在net/ipv4/af_inet.c中,相关的内容如下所示:
#ifdef CONFIG_ANDROID_PARANOID_NETWORK #include <linux/android_aid.h> static inline int current_has_network(void) { return in_egroup_p(AID_INET) || capable(CAP_NET_RAW); } #else static inline int current_has_network(void) { return 1; } #endif
在这个地方,进一步检查了AID,如果符合才返回1,如果没有附加这个特性,则直接返回1。
在安全性的文件security/commoncap.c中,相关的内容如下所示:
int cap_capable(struct task_struct *tsk, const struct cred *cred, int cap, int audit) { #ifdef CONFIG_ANDROID_PARANOID_NETWORK if (cap == CAP_NET_RAW && in_egroup_p(AID_NET_RAW)) return 0; if (cap == CAP_NET_ADMIN && in_egroup_p(AID_NET_ADMIN)) return 0; #endif return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM; }
这里的工作是检查能力方面,增加了对AID的判断。如果AID符合,则直接返回0,不再使用cap_raised()函数进行处理。