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()函数进行处理。