From 1601132086b054adc70e7f8f38ed24574c90bc37 Mon Sep 17 00:00:00 2001
From: Stephen Smalley <sds@tycho.nsa.gov>
Date: Mon, 24 Feb 2014 15:06:11 -0500
Subject: [PATCH] Clean up socket rules.

Replace * or any permission set containing create with
create_socket_perms or create_stream_socket_perms.

Add net_domain() to all domains using network sockets and
delete rules already covered by domain.te or net.te.

For netlink_route_socket, only nlmsg_write needs to be separately
granted to specific domains that are permitted to modify the routing
table.   Clarification:  read/write permissions are just ability to
perform read/recv() or write/send() on the socket, whereas nlmsg_read/
nlmsg_write permissions control ability to observe or modify the
underlying kernel state accessed via the socket.
See security/selinux/nlmsgtab.c in the kernel for the mapping of
netlink message types to nlmsg_read or nlmsg_write.

Delete legacy rule for b/12061011.

This change does not touch any rules where only read/write were allowed
to a socket created by another domain (inherited across exec or
received across socket or binder IPC).  We may wish to rewrite some or all
of those rules with the rw_socket_perms macro but that is a separate
change.

Change-Id: Ib0637ab86f6d388043eff928e5d96beb02e5450e
Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
---
 bluetooth.te      |  8 ++++++--
 clatd.te          |  2 +-
 dhcp.te           |  3 +--
 dnsmasq.te        |  5 ++---
 domain.te         |  3 ++-
 drmserver.te      |  4 ++--
 dumpstate.te      |  3 ---
 hostapd.te        |  7 ++++---
 logd.te           |  1 -
 mtp.te            |  3 ---
 net.te            | 13 +------------
 netd.te           |  8 +++-----
 ppp.te            |  3 ++-
 racoon.te         |  8 ++++----
 rild.te           |  9 ++++-----
 surfaceflinger.te |  2 +-
 system_server.te  | 10 +++-------
 tee.te            |  2 +-
 ueventd.te        |  2 +-
 vold.te           |  2 +-
 wpa_supplicant.te | 10 ++++++----
 21 files changed, 45 insertions(+), 63 deletions(-)

diff --git a/bluetooth.te b/bluetooth.te
index d1fed20e6..16e7b0b85 100644
--- a/bluetooth.te
+++ b/bluetooth.te
@@ -20,17 +20,21 @@ allow bluetooth { tun_device uhid_device hci_attach_dev }:chr_file rw_file_perms
 # Other domains that can create and use bluetooth sockets.
 # SELinux does not presently define a specific socket class for
 # bluetooth sockets, nor does it distinguish among the bluetooth protocols.
-allow bluetoothdomain self:socket *;
+# TODO: This should no longer be needed with bluedroid for bluetooth
+# but may be getting used for other non-bluetooth sockets that has no
+# specific class defined.  Consider taking to specific domains.
+allow bluetoothdomain self:socket create_socket_perms;
 
 # sysfs access.
 allow bluetooth sysfs_bluetooth_writable:file rw_file_perms;
 allow bluetooth self:capability net_admin;
 
 # Allow clients to use a socket provided by the bluetooth app.
+# TODO:  See if this is still required under bluedroid.
 allow bluetoothdomain bluetooth:unix_stream_socket { read write shutdown };
 
 # tethering
-allow bluetooth self:{ tun_socket udp_socket } { ioctl create };
+allow bluetooth self:tun_socket create_socket_perms;
 allow bluetooth efs_file:dir search;
 
 # Talk to init over the property socket.
diff --git a/clatd.te b/clatd.te
index ec2df7e04..497110293 100644
--- a/clatd.te
+++ b/clatd.te
@@ -19,7 +19,7 @@ allow clatd self:capability { net_admin setuid setgid };
 # TODO: Run clatd in vpn group to avoid need for this on /dev/tun.
 allow clatd self:capability dac_override;
 
-allow clatd self:netlink_route_socket { create_socket_perms nlmsg_write };
+allow clatd self:netlink_route_socket nlmsg_write;
 allow clatd self:tun_socket create_socket_perms;
 allow clatd tun_device:chr_file rw_file_perms;
 allow clatd proc_net:file rw_file_perms;;
diff --git a/dhcp.te b/dhcp.te
index c930b0fec..89346d5a2 100644
--- a/dhcp.te
+++ b/dhcp.te
@@ -9,8 +9,7 @@ net_domain(dhcp)
 allow dhcp cgroup:dir { create write add_name };
 allow dhcp self:capability { setgid setuid net_admin net_raw net_bind_service };
 allow dhcp self:packet_socket create_socket_perms;
-allow dhcp self:netlink_route_socket { create_socket_perms nlmsg_write };
-allow dhcp self:rawip_socket create_socket_perms;
+allow dhcp self:netlink_route_socket nlmsg_write;
 allow dhcp shell_exec:file rx_file_perms;
 allow dhcp system_file:file rx_file_perms;
 # For /proc/sys/net/ipv4/conf/*/promote_secondaries
diff --git a/dnsmasq.te b/dnsmasq.te
index 0e1658080..fcf7c6d3d 100644
--- a/dnsmasq.te
+++ b/dnsmasq.te
@@ -3,10 +3,9 @@ type dnsmasq, domain;
 permissive_or_unconfined(dnsmasq)
 type dnsmasq_exec, exec_type, file_type;
 
+net_domain(dnsmasq)
+
 allow dnsmasq self:capability { net_bind_service setgid setuid };
-allow dnsmasq self:tcp_socket create_socket_perms;
 
 allow dnsmasq dhcp_data_file:dir w_dir_perms;
 allow dnsmasq dhcp_data_file:file create_file_perms;
-allow dnsmasq port:tcp_socket name_bind;
-allow dnsmasq node:tcp_socket node_bind;
diff --git a/domain.te b/domain.te
index 878ac9f05..013126baa 100644
--- a/domain.te
+++ b/domain.te
@@ -16,7 +16,8 @@ allow domain self:fd use;
 allow domain self:dir r_dir_perms;
 allow domain self:lnk_file r_file_perms;
 allow domain self:{ fifo_file file } rw_file_perms;
-allow domain self:{ unix_dgram_socket unix_stream_socket } *;
+allow domain self:unix_dgram_socket { create_socket_perms sendto };
+allow domain self:unix_stream_socket { create_stream_socket_perms connectto };
 
 # Inherit or receive open files from others.
 allow domain init:fd use;
diff --git a/drmserver.te b/drmserver.te
index eb050a2cd..a11700c1b 100644
--- a/drmserver.te
+++ b/drmserver.te
@@ -5,6 +5,8 @@ type drmserver_exec, exec_type, file_type;
 init_daemon_domain(drmserver)
 typeattribute drmserver mlstrustedsubject;
 
+net_domain(drmserver)
+
 # Perform Binder IPC to system server.
 binder_use(drmserver)
 binder_call(drmserver, system_server)
@@ -17,8 +19,6 @@ binder_call(drmserver, mediaserver)
 allow drmserver sdcard_type:dir search;
 allow drmserver drm_data_file:dir create_dir_perms;
 allow drmserver drm_data_file:file create_file_perms;
-allow drmserver self:{ tcp_socket udp_socket } *;
-allow drmserver port:tcp_socket name_connect;
 allow drmserver tee_device:chr_file rw_file_perms;
 allow drmserver platform_app_data_file:file { read write getattr };
 allow drmserver app_data_file:file { read write getattr };
diff --git a/dumpstate.te b/dumpstate.te
index 8ecb6cc24..749cc469e 100644
--- a/dumpstate.te
+++ b/dumpstate.te
@@ -47,9 +47,6 @@ allow dumpstate { appdomain system_server }:process signal;
 # This list comes from native_processes_to_dump in dumpstate/utils.c
 allow dumpstate { drmserver mediaserver sdcardd surfaceflinger }:process signal;
 
-# The /system/bin/ip command needs this for routing table information.
-allow dumpstate self:netlink_route_socket { write getattr setopt };
-
 # The vdc command needs to talk to the vold socket.
 unix_socket_connect(dumpstate, vold, vold)
 
diff --git a/hostapd.te b/hostapd.te
index e6e88e958..184b26f28 100644
--- a/hostapd.te
+++ b/hostapd.te
@@ -3,11 +3,12 @@ type hostapd, domain;
 permissive_or_unconfined(hostapd)
 type hostapd_exec, exec_type, file_type;
 
+net_domain(hostapd)
+
 allow hostapd self:capability { net_admin net_raw setuid setgid };
 allow hostapd self:netlink_socket create_socket_perms;
-allow hostapd self:packet_socket { create write read };
-allow hostapd self:netlink_route_socket { bind create write nlmsg_write read };
-allow hostapd self:udp_socket { create ioctl };
+allow hostapd self:packet_socket create_socket_perms;
+allow hostapd self:netlink_route_socket nlmsg_write;
 
 allow hostapd wifi_data_file:file rw_file_perms;
 allow hostapd wifi_data_file:dir create_dir_perms;
diff --git a/logd.te b/logd.te
index a1e3a53ec..796f7bbee 100644
--- a/logd.te
+++ b/logd.te
@@ -3,7 +3,6 @@ type logd, domain;
 type logd_exec, exec_type, file_type;
 
 init_daemon_domain(logd)
-allow logd self:unix_stream_socket *;
 
 allow logd self:capability { setuid setgid sys_nice };
 
diff --git a/mtp.te b/mtp.te
index 9681daf49..320f4af61 100644
--- a/mtp.te
+++ b/mtp.te
@@ -7,10 +7,7 @@ init_daemon_domain(mtp)
 net_domain(mtp)
 
 # pptp policy
-allow mtp self:tcp_socket create_socket_perms;
 allow mtp self:socket create_socket_perms;
-allow mtp self:rawip_socket create_socket_perms;
 allow mtp self:capability net_raw;
 allow mtp ppp:process signal;
-allow mtp port:tcp_socket name_connect;
 allow mtp vpn_data_file:dir search;
diff --git a/net.te b/net.te
index c67f456fd..9942efe4a 100644
--- a/net.te
+++ b/net.te
@@ -13,18 +13,7 @@ allow netdomain node_type:{ tcp_socket udp_socket } node_bind;
 allow netdomain port_type:udp_socket name_bind;
 allow netdomain port_type:tcp_socket name_bind;
 # See changes to the routing table.
-allow netdomain self:netlink_route_socket {
-    read
-    bind
-    create
-    nlmsg_read
-    ioctl
-    getattr
-    setattr
-    getopt
-    setopt
-    shutdown
-};
+allow netdomain self:netlink_route_socket { create_socket_perms nlmsg_read };
 
 # Talks to netd via dnsproxyd socket.
 unix_socket_connect(netdomain, dnsproxyd, netd)
diff --git a/netd.te b/netd.te
index b8d26f957..19fcad22e 100644
--- a/netd.te
+++ b/netd.te
@@ -15,11 +15,9 @@ allow netd self:capability { net_admin net_raw kill };
 # sufficient testing of the fsetid removal.
 # dontaudit netd self:capability fsetid;
 
-allow netd self:netlink_kobject_uevent_socket *;
-allow netd self:netlink_route_socket *;
-allow netd self:netlink_nflog_socket *;
-allow netd self:rawip_socket *;
-allow netd self:unix_stream_socket *;
+allow netd self:netlink_kobject_uevent_socket create_socket_perms;
+allow netd self:netlink_route_socket nlmsg_write;
+allow netd self:netlink_nflog_socket create_socket_perms;
 allow netd shell_exec:file rx_file_perms;
 allow netd system_file:file x_file_perms;
 allow netd devpts:chr_file rw_file_perms;
diff --git a/ppp.te b/ppp.te
index 21838f16d..bcab33909 100644
--- a/ppp.te
+++ b/ppp.te
@@ -5,10 +5,11 @@ type ppp_device, dev_type;
 type ppp_exec, exec_type, file_type;
 domain_auto_trans(mtp, ppp_exec, ppp)
 
+net_domain(ppp)
+
 allow ppp mtp:socket rw_socket_perms;
 allow ppp ppp_device:chr_file rw_file_perms;
 allow ppp self:capability net_admin;
-allow ppp self:udp_socket create_socket_perms;
 allow ppp system_file:file rx_file_perms;
 allow ppp vpn_data_file:dir w_dir_perms;
 allow ppp vpn_data_file:file create_file_perms;
diff --git a/racoon.te b/racoon.te
index 596cf7ee3..1fbdb07fa 100644
--- a/racoon.te
+++ b/racoon.te
@@ -6,17 +6,17 @@ type racoon_exec, exec_type, file_type;
 init_daemon_domain(racoon)
 typeattribute racoon mlstrustedsubject;
 
+net_domain(racoon)
+
 binder_call(racoon, servicemanager)
 binder_call(racoon, keystore)
 
 allow racoon tun_device:chr_file r_file_perms;
 allow racoon cgroup:dir { add_name create };
 allow racoon kernel:system module_request;
-allow racoon port:udp_socket name_bind;
-allow racoon node:udp_socket node_bind;
 
-allow racoon self:{ key_socket udp_socket } create_socket_perms;
-allow racoon self:tun_socket create;
+allow racoon self:key_socket create_socket_perms;
+allow racoon self:tun_socket create_socket_perms;
 allow racoon self:capability { net_admin net_bind_service net_raw setuid };
 
 # XXX: should we give ip-up-vpn its own label (currently racoon domain)
diff --git a/rild.te b/rild.te
index 8de5c59ad..ea4d34f62 100644
--- a/rild.te
+++ b/rild.te
@@ -5,7 +5,7 @@ type rild_exec, exec_type, file_type;
 
 init_daemon_domain(rild)
 net_domain(rild)
-allow rild self:netlink_route_socket { setopt write };
+allow rild self:netlink_route_socket nlmsg_write;
 allow rild kernel:system module_request;
 unix_socket_connect(rild, property, init)
 unix_socket_connect(rild, qemud, qemud)
@@ -38,10 +38,9 @@ allow rild gps_device:chr_file rw_file_perms;
 
 allow rild tty_device:chr_file rw_file_perms;
 
-# Allow rild to create, bind, read, write to itself through a netlink socket
-allow rild self:netlink_socket { create bind read write };
-
-allow rild self:netlink_kobject_uevent_socket { bind create getopt read setopt };
+# Allow rild to create and use netlink sockets.
+allow rild self:netlink_socket create_socket_perms;
+allow rild self:netlink_kobject_uevent_socket create_socket_perms;
 
 # Access to wake locks
 allow rild sysfs_wake_lock:file rw_file_perms;
diff --git a/surfaceflinger.te b/surfaceflinger.te
index 2a3087b6f..7d73696ab 100644
--- a/surfaceflinger.te
+++ b/surfaceflinger.te
@@ -28,7 +28,7 @@ allow surfaceflinger video_device:dir r_dir_perms;
 allow surfaceflinger video_device:chr_file rw_file_perms;
 
 # Create and use netlink kobject uevent sockets.
-allow surfaceflinger self:netlink_kobject_uevent_socket *;
+allow surfaceflinger self:netlink_kobject_uevent_socket create_socket_perms;
 
 # Set properties.
 allow surfaceflinger system_prop:property_service set;
diff --git a/system_server.te b/system_server.te
index ca95abf4a..2d5c331e6 100644
--- a/system_server.te
+++ b/system_server.te
@@ -21,10 +21,6 @@ allow system_server zygote:fd use;
 allow system_server zygote:process sigchld;
 allow system_server zygote_tmpfs:file read;
 
-# Needed to close the zygote socket, which involves getopt / getattr
-# This should be deleted after b/12061011 is fixed
-allow system_server zygote:unix_stream_socket { getopt getattr };
-
 # system server gets network and bluetooth permissions.
 net_domain(system_server)
 bluetooth_domain(system_server)
@@ -54,7 +50,7 @@ dontaudit system_server self:capability sys_ptrace;
 allow system_server kernel:system module_request;
 
 # Use netlink uevent sockets.
-allow system_server self:netlink_kobject_uevent_socket *;
+allow system_server self:netlink_kobject_uevent_socket create_socket_perms;
 
 # Kill apps.
 allow system_server appdomain:process { sigkill signal };
@@ -75,10 +71,10 @@ allow system_server qtaguid_device:chr_file rw_file_perms;
 allow system_server debugfs:file r_file_perms;
 
 # WifiWatchdog uses a packet_socket
-allow system_server self:packet_socket *;
+allow system_server self:packet_socket create_socket_perms;
 
 # 3rd party VPN clients require a tun_socket to be created
-allow system_server self:tun_socket create;
+allow system_server self:tun_socket create_socket_perms;
 
 # Notify init of death.
 allow system_server init:process sigchld;
diff --git a/tee.te b/tee.te
index a0d0d9830..7cf6ecd8d 100644
--- a/tee.te
+++ b/tee.te
@@ -11,4 +11,4 @@ allow tee self:capability { dac_override };
 allow tee tee_device:chr_file rw_file_perms;
 allow tee tee_data_file:dir rw_dir_perms;
 allow tee tee_data_file:file create_file_perms;
-allow tee self:netlink_socket { create bind read };
+allow tee self:netlink_socket create_socket_perms;
diff --git a/ueventd.te b/ueventd.te
index 2af8e94bb..e80fa32b8 100644
--- a/ueventd.te
+++ b/ueventd.te
@@ -19,6 +19,6 @@ allow ueventd dev_type:dir create_dir_perms;
 allow ueventd dev_type:lnk_file { create unlink };
 allow ueventd dev_type:chr_file { create setattr unlink };
 allow ueventd dev_type:blk_file { create setattr unlink };
-allow ueventd self:netlink_kobject_uevent_socket *;
+allow ueventd self:netlink_kobject_uevent_socket create_socket_perms;
 allow ueventd efs_file:dir search;
 allow ueventd efs_file:file r_file_perms;
diff --git a/vold.te b/vold.te
index 18c909de6..d434b5e1a 100644
--- a/vold.te
+++ b/vold.te
@@ -19,7 +19,7 @@ allow vold tmpfs:filesystem { mount unmount };
 allow vold tmpfs:dir create_dir_perms;
 allow vold tmpfs:dir mounton;
 allow vold self:capability { net_admin dac_override mknod sys_admin chown fowner fsetid };
-allow vold self:netlink_kobject_uevent_socket *;
+allow vold self:netlink_kobject_uevent_socket create_socket_perms;
 allow vold app_data_file:dir search;
 allow vold app_data_file:file rw_file_perms;
 allow vold loop_device:blk_file rw_file_perms;
diff --git a/wpa_supplicant.te b/wpa_supplicant.te
index fd454bf95..5961f981f 100644
--- a/wpa_supplicant.te
+++ b/wpa_supplicant.te
@@ -3,13 +3,15 @@ type wpa, domain;
 type wpa_exec, exec_type, file_type;
 
 init_daemon_domain(wpa)
+
+net_domain(wpa)
+
 allow wpa kernel:system module_request;
 allow wpa self:capability { setuid net_admin setgid net_raw };
 allow wpa cgroup:dir create_dir_perms;
-allow wpa self:netlink_route_socket *;
-allow wpa self:netlink_socket *;
-allow wpa self:packet_socket *;
-allow wpa self:udp_socket *;
+allow wpa self:netlink_route_socket nlmsg_write;
+allow wpa self:netlink_socket create_socket_perms;
+allow wpa self:packet_socket create_socket_perms;
 allow wpa wifi_data_file:dir create_dir_perms;
 allow wpa wifi_data_file:file create_file_perms;
 unix_socket_send(wpa, system_wpa, system_server)
-- 
GitLab