aboutsummaryrefslogtreecommitdiffstats
path: root/security/selinux/hooks.c
diff options
context:
space:
mode:
authorChris PeBenito <cpebenito@tresys.com>2013-05-03 09:05:39 -0400
committerEric Paris <eparis@redhat.com>2013-07-25 13:03:38 -0400
commit2be4d74f2fd45460d70d4fe65cc1972ef45bf849 (patch)
tree5dd4b74ae295dc6ba58f974a3b748fe7a2f06d3c /security/selinux/hooks.c
parentb04eea886409de7460b5727b5931fb0bd417275f (diff)
Add SELinux policy capability for always checking packet and peer classes.
Currently the packet class in SELinux is not checked if there are no SECMARK rules in the security or mangle netfilter tables. Some systems prefer that packets are always checked, for example, to protect the system should the netfilter rules fail to load or if the nefilter rules were maliciously flushed. Add the always_check_network policy capability which, when enabled, treats SECMARK as enabled, even if there are no netfilter SECMARK rules and treats peer labeling as enabled, even if there is no Netlabel or labeled IPSEC configuration. Includes definition of "redhat1" SELinux policy capability, which exists in the SELinux userpace library, to keep ordering correct. The SELinux userpace portion of this was merged last year, but this kernel change fell on the floor. Signed-off-by: Chris PeBenito <cpebenito@tresys.com> Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'security/selinux/hooks.c')
-rw-r--r--security/selinux/hooks.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index b222e966babe..4fbf2c5f26ce 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -136,12 +136,28 @@ static struct kmem_cache *sel_inode_cache;
136 * This function checks the SECMARK reference counter to see if any SECMARK 136 * This function checks the SECMARK reference counter to see if any SECMARK
137 * targets are currently configured, if the reference counter is greater than 137 * targets are currently configured, if the reference counter is greater than
138 * zero SECMARK is considered to be enabled. Returns true (1) if SECMARK is 138 * zero SECMARK is considered to be enabled. Returns true (1) if SECMARK is
139 * enabled, false (0) if SECMARK is disabled. 139 * enabled, false (0) if SECMARK is disabled. If the always_check_network
140 * policy capability is enabled, SECMARK is always considered enabled.
140 * 141 *
141 */ 142 */
142static int selinux_secmark_enabled(void) 143static int selinux_secmark_enabled(void)
143{ 144{
144 return (atomic_read(&selinux_secmark_refcount) > 0); 145 return (selinux_policycap_alwaysnetwork || atomic_read(&selinux_secmark_refcount));
146}
147
148/**
149 * selinux_peerlbl_enabled - Check to see if peer labeling is currently enabled
150 *
151 * Description:
152 * This function checks if NetLabel or labeled IPSEC is enabled. Returns true
153 * (1) if any are enabled or false (0) if neither are enabled. If the
154 * always_check_network policy capability is enabled, peer labeling
155 * is always considered enabled.
156 *
157 */
158static int selinux_peerlbl_enabled(void)
159{
160 return (selinux_policycap_alwaysnetwork || netlbl_enabled() || selinux_xfrm_enabled());
145} 161}
146 162
147/* 163/*
@@ -4197,7 +4213,7 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
4197 return selinux_sock_rcv_skb_compat(sk, skb, family); 4213 return selinux_sock_rcv_skb_compat(sk, skb, family);
4198 4214
4199 secmark_active = selinux_secmark_enabled(); 4215 secmark_active = selinux_secmark_enabled();
4200 peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled(); 4216 peerlbl_active = selinux_peerlbl_enabled();
4201 if (!secmark_active && !peerlbl_active) 4217 if (!secmark_active && !peerlbl_active)
4202 return 0; 4218 return 0;
4203 4219
@@ -4579,7 +4595,7 @@ static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex,
4579 4595
4580 secmark_active = selinux_secmark_enabled(); 4596 secmark_active = selinux_secmark_enabled();
4581 netlbl_active = netlbl_enabled(); 4597 netlbl_active = netlbl_enabled();
4582 peerlbl_active = netlbl_active || selinux_xfrm_enabled(); 4598 peerlbl_active = selinux_peerlbl_enabled();
4583 if (!secmark_active && !peerlbl_active) 4599 if (!secmark_active && !peerlbl_active)
4584 return NF_ACCEPT; 4600 return NF_ACCEPT;
4585 4601
@@ -4731,7 +4747,7 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
4731 return NF_ACCEPT; 4747 return NF_ACCEPT;
4732#endif 4748#endif
4733 secmark_active = selinux_secmark_enabled(); 4749 secmark_active = selinux_secmark_enabled();
4734 peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled(); 4750 peerlbl_active = selinux_peerlbl_enabled();
4735 if (!secmark_active && !peerlbl_active) 4751 if (!secmark_active && !peerlbl_active)
4736 return NF_ACCEPT; 4752 return NF_ACCEPT;
4737 4753