Paranoid network.
Robert Love [Mon, 16 Apr 2012 07:10:03 +0000 (12:10 +0530)]
With CONFIG_ANDROID_PARANOID_NETWORK, require specific uids/gids to instantiate
network sockets.

Signed-off-by: Robert Love <rlove@google.com>

paranoid networking: Use in_egroup_p() to check group membership

The previous group_search() caused trouble for partners with module builds.
in_egroup_p() is also cleaner.

Signed-off-by: Nick Pelly <npelly@google.com>

Fix 2.6.29 build.

Signed-off-by: Arve Hjønnevåg <arve@android.com>

net: Fix compilation of the IPv6 module

Fix compilation of the IPv6 module -- current->euid does not exist anymore,
current_euid() is what needs to be used.

Signed-off-by: Steinar H. Gunderson <sesse@google.com>

Conflicts:

net/Kconfig
net/ipv4/af_inet.c
net/ipv6/af_inet6.c

Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>

net/Kconfig
net/ipv4/af_inet.c
net/ipv6/af_inet6.c

index c8ee300..61ff70d 100644 (file)
@@ -10,7 +10,7 @@ menuconfig NET
          The reason is that some programs need kernel networking support even
          when running on a stand-alone machine that isn't connected to any
          other computer.
-         
+
          If you are upgrading from an older kernel, you
          should consider updating your networking tools too because changes
          in the kernel and the tools often go hand in hand. The tools are
@@ -85,14 +85,6 @@ config ANDROID_PARANOID_NETWORK
        help
                none
 
-config NET_ACTIVITY_STATS
-       bool "Network activity statistics tracking"
-       default y
-       help
-        Network activity statistics are useful for tracking wireless
-        modem activity on 2G, 3G, 4G wireless networks. Counts number of
-        transmissions and groups them in specified time buckets.
-
 config NETWORK_SECMARK
        bool "Security Marking"
        help
@@ -302,7 +294,7 @@ config NET_TCPPROBE
 
        Documentation on how to use TCP connection probing can be found
        at:
-       
+
          http://www.linuxfoundation.org/collaborate/workgroups/networking/tcpprobe
 
        To compile this code as a module, choose M here: the
index 0b71165..73a3845 100644 (file)
 
 #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
 
 /* The inetsw table contains everything that inet_create needs to
@@ -272,6 +262,28 @@ static inline int inet_netns_ok(struct net *net, int protocol)
        return ipprot->netns_ok;
 }
 
+#ifdef CONFIG_ANDROID_PARANOID_NETWORK
+static inline int current_has_network(void)
+{
+       return (!current_euid() || in_egroup_p(AID_INET) ||
+               in_egroup_p(AID_NET_RAW));
+}
+static inline int current_has_cap(int cap)
+{
+       if (cap == CAP_NET_RAW && in_egroup_p(AID_NET_RAW))
+               return 1;
+       return capable(cap);
+}
+# else
+static inline int current_has_network(void)
+{
+       return 1;
+}
+static inline int current_has_cap(int cap)
+{
+       return capable(cap);
+}
+#endif
 
 /*
  *     Create an inet socket.
@@ -344,7 +356,7 @@ lookup_protocol:
        }
 
        err = -EPERM;
-       if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
+       if (sock->type == SOCK_RAW && !kern && !current_has_cap(CAP_NET_RAW))
                goto out_rcu_unlock;
 
        err = -EAFNOSUPPORT;
index 29625e9..a5e8f1b 100644 (file)
 
 #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
 
 MODULE_AUTHOR("Cast of dozens");
@@ -109,6 +99,29 @@ static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk)
        return (struct ipv6_pinfo *)(((u8 *)sk) + offset);
 }
 
+#ifdef CONFIG_ANDROID_PARANOID_NETWORK
+static inline int current_has_network(void)
+{
+       return (!current_euid() || in_egroup_p(AID_INET) ||
+               in_egroup_p(AID_NET_RAW));
+}
+static inline int current_has_cap(int cap)
+{
+       if (cap == CAP_NET_RAW && in_egroup_p(AID_NET_RAW))
+               return 1;
+       return capable(cap);
+}
+# else
+static inline int current_has_network(void)
+{
+       return 1;
+}
+static inline int current_has_cap(int cap)
+{
+       return capable(cap);
+}
+#endif
+
 static int inet6_create(struct net *net, struct socket *sock, int protocol,
                        int kern)
 {
@@ -176,7 +189,7 @@ lookup_protocol:
        }
 
        err = -EPERM;
-       if (sock->type == SOCK_RAW && !kern && !capable(CAP_NET_RAW))
+       if (sock->type == SOCK_RAW && !kern && !current_has_cap(CAP_NET_RAW))
                goto out_rcu_unlock;
 
        sock->ops = answer->ops;