aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/scsi_netlink.c2
-rw-r--r--include/linux/security.h14
-rw-r--r--kernel/audit.c4
-rw-r--r--net/core/rtnetlink.c2
-rw-r--r--net/decnet/netfilter/dn_rtmsg.c2
-rw-r--r--net/ipv4/netfilter/ip_queue.c2
-rw-r--r--net/ipv6/netfilter/ip6_queue.c2
-rw-r--r--net/netfilter/nfnetlink.c2
-rw-r--r--net/netlink/genetlink.c2
-rw-r--r--net/xfrm/xfrm_user.c2
-rw-r--r--security/capability.c1
-rw-r--r--security/commoncap.c8
-rw-r--r--security/security.c6
-rw-r--r--security/selinux/hooks.c19
14 files changed, 10 insertions, 58 deletions
diff --git a/drivers/scsi/scsi_netlink.c b/drivers/scsi/scsi_netlink.c
index 26a8a45584ef..feee1cc39ea0 100644
--- a/drivers/scsi/scsi_netlink.c
+++ b/drivers/scsi/scsi_netlink.c
@@ -111,7 +111,7 @@ scsi_nl_rcv_msg(struct sk_buff *skb)
111 goto next_msg; 111 goto next_msg;
112 } 112 }
113 113
114 if (security_netlink_recv(skb, CAP_SYS_ADMIN)) { 114 if (!capable(CAP_SYS_ADMIN)) {
115 err = -EPERM; 115 err = -EPERM;
116 goto next_msg; 116 goto next_msg;
117 } 117 }
diff --git a/include/linux/security.h b/include/linux/security.h
index e345a9313a60..ba2d531c123f 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -95,7 +95,6 @@ struct xfrm_user_sec_ctx;
95struct seq_file; 95struct seq_file;
96 96
97extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb); 97extern int cap_netlink_send(struct sock *sk, struct sk_buff *skb);
98extern int cap_netlink_recv(struct sk_buff *skb, int cap);
99 98
100void reset_security_ops(void); 99void reset_security_ops(void);
101 100
@@ -792,12 +791,6 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts)
792 * @skb contains the sk_buff structure for the netlink message. 791 * @skb contains the sk_buff structure for the netlink message.
793 * Return 0 if the information was successfully saved and message 792 * Return 0 if the information was successfully saved and message
794 * is allowed to be transmitted. 793 * is allowed to be transmitted.
795 * @netlink_recv:
796 * Check permission before processing the received netlink message in
797 * @skb.
798 * @skb contains the sk_buff structure for the netlink message.
799 * @cap indicates the capability required
800 * Return 0 if permission is granted.
801 * 794 *
802 * Security hooks for Unix domain networking. 795 * Security hooks for Unix domain networking.
803 * 796 *
@@ -1556,7 +1549,6 @@ struct security_operations {
1556 struct sembuf *sops, unsigned nsops, int alter); 1549 struct sembuf *sops, unsigned nsops, int alter);
1557 1550
1558 int (*netlink_send) (struct sock *sk, struct sk_buff *skb); 1551 int (*netlink_send) (struct sock *sk, struct sk_buff *skb);
1559 int (*netlink_recv) (struct sk_buff *skb, int cap);
1560 1552
1561 void (*d_instantiate) (struct dentry *dentry, struct inode *inode); 1553 void (*d_instantiate) (struct dentry *dentry, struct inode *inode);
1562 1554
@@ -1803,7 +1795,6 @@ void security_d_instantiate(struct dentry *dentry, struct inode *inode);
1803int security_getprocattr(struct task_struct *p, char *name, char **value); 1795int security_getprocattr(struct task_struct *p, char *name, char **value);
1804int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size); 1796int security_setprocattr(struct task_struct *p, char *name, void *value, size_t size);
1805int security_netlink_send(struct sock *sk, struct sk_buff *skb); 1797int security_netlink_send(struct sock *sk, struct sk_buff *skb);
1806int security_netlink_recv(struct sk_buff *skb, int cap);
1807int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen); 1798int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen);
1808int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid); 1799int security_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid);
1809void security_release_secctx(char *secdata, u32 seclen); 1800void security_release_secctx(char *secdata, u32 seclen);
@@ -2478,11 +2469,6 @@ static inline int security_netlink_send(struct sock *sk, struct sk_buff *skb)
2478 return cap_netlink_send(sk, skb); 2469 return cap_netlink_send(sk, skb);
2479} 2470}
2480 2471
2481static inline int security_netlink_recv(struct sk_buff *skb, int cap)
2482{
2483 return cap_netlink_recv(skb, cap);
2484}
2485
2486static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) 2472static inline int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
2487{ 2473{
2488 return -EOPNOTSUPP; 2474 return -EOPNOTSUPP;
diff --git a/kernel/audit.c b/kernel/audit.c
index 0a1355ca3d79..f3ba55fa0b70 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -601,13 +601,13 @@ static int audit_netlink_ok(struct sk_buff *skb, u16 msg_type)
601 case AUDIT_TTY_SET: 601 case AUDIT_TTY_SET:
602 case AUDIT_TRIM: 602 case AUDIT_TRIM:
603 case AUDIT_MAKE_EQUIV: 603 case AUDIT_MAKE_EQUIV:
604 if (security_netlink_recv(skb, CAP_AUDIT_CONTROL)) 604 if (!capable(CAP_AUDIT_CONTROL))
605 err = -EPERM; 605 err = -EPERM;
606 break; 606 break;
607 case AUDIT_USER: 607 case AUDIT_USER:
608 case AUDIT_FIRST_USER_MSG ... AUDIT_LAST_USER_MSG: 608 case AUDIT_FIRST_USER_MSG ... AUDIT_LAST_USER_MSG:
609 case AUDIT_FIRST_USER_MSG2 ... AUDIT_LAST_USER_MSG2: 609 case AUDIT_FIRST_USER_MSG2 ... AUDIT_LAST_USER_MSG2:
610 if (security_netlink_recv(skb, CAP_AUDIT_WRITE)) 610 if (!capable(CAP_AUDIT_WRITE))
611 err = -EPERM; 611 err = -EPERM;
612 break; 612 break;
613 default: /* bad msg */ 613 default: /* bad msg */
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 99d9e953fe39..d3a628196716 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1931,7 +1931,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
1931 sz_idx = type>>2; 1931 sz_idx = type>>2;
1932 kind = type&3; 1932 kind = type&3;
1933 1933
1934 if (kind != 2 && security_netlink_recv(skb, CAP_NET_ADMIN)) 1934 if (kind != 2 && !capable(CAP_NET_ADMIN))
1935 return -EPERM; 1935 return -EPERM;
1936 1936
1937 if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { 1937 if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) {
diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c
index 69975e0bcdea..1531135130db 100644
--- a/net/decnet/netfilter/dn_rtmsg.c
+++ b/net/decnet/netfilter/dn_rtmsg.c
@@ -108,7 +108,7 @@ static inline void dnrmg_receive_user_skb(struct sk_buff *skb)
108 if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) 108 if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len)
109 return; 109 return;
110 110
111 if (security_netlink_recv(skb, CAP_NET_ADMIN)) 111 if (!capable(CAP_NET_ADMIN))
112 RCV_SKB_FAIL(-EPERM); 112 RCV_SKB_FAIL(-EPERM);
113 113
114 /* Eventually we might send routing messages too */ 114 /* Eventually we might send routing messages too */
diff --git a/net/ipv4/netfilter/ip_queue.c b/net/ipv4/netfilter/ip_queue.c
index e59aabd0eae4..ffabb2674718 100644
--- a/net/ipv4/netfilter/ip_queue.c
+++ b/net/ipv4/netfilter/ip_queue.c
@@ -430,7 +430,7 @@ __ipq_rcv_skb(struct sk_buff *skb)
430 if (type <= IPQM_BASE) 430 if (type <= IPQM_BASE)
431 return; 431 return;
432 432
433 if (security_netlink_recv(skb, CAP_NET_ADMIN)) 433 if (!capable(CAP_NET_ADMIN))
434 RCV_SKB_FAIL(-EPERM); 434 RCV_SKB_FAIL(-EPERM);
435 435
436 spin_lock_bh(&queue_lock); 436 spin_lock_bh(&queue_lock);
diff --git a/net/ipv6/netfilter/ip6_queue.c b/net/ipv6/netfilter/ip6_queue.c
index e63c3972a739..5e5ce778be7f 100644
--- a/net/ipv6/netfilter/ip6_queue.c
+++ b/net/ipv6/netfilter/ip6_queue.c
@@ -431,7 +431,7 @@ __ipq_rcv_skb(struct sk_buff *skb)
431 if (type <= IPQM_BASE) 431 if (type <= IPQM_BASE)
432 return; 432 return;
433 433
434 if (security_netlink_recv(skb, CAP_NET_ADMIN)) 434 if (!capable(CAP_NET_ADMIN))
435 RCV_SKB_FAIL(-EPERM); 435 RCV_SKB_FAIL(-EPERM);
436 436
437 spin_lock_bh(&queue_lock); 437 spin_lock_bh(&queue_lock);
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c
index 1905976b5135..e6c2b8f32180 100644
--- a/net/netfilter/nfnetlink.c
+++ b/net/netfilter/nfnetlink.c
@@ -130,7 +130,7 @@ static int nfnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
130 const struct nfnetlink_subsystem *ss; 130 const struct nfnetlink_subsystem *ss;
131 int type, err; 131 int type, err;
132 132
133 if (security_netlink_recv(skb, CAP_NET_ADMIN)) 133 if (!capable(CAP_NET_ADMIN))
134 return -EPERM; 134 return -EPERM;
135 135
136 /* All the messages must at least contain nfgenmsg */ 136 /* All the messages must at least contain nfgenmsg */
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index 482fa571b4ee..05fedbf489a5 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -516,7 +516,7 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
516 return -EOPNOTSUPP; 516 return -EOPNOTSUPP;
517 517
518 if ((ops->flags & GENL_ADMIN_PERM) && 518 if ((ops->flags & GENL_ADMIN_PERM) &&
519 security_netlink_recv(skb, CAP_NET_ADMIN)) 519 !capable(CAP_NET_ADMIN))
520 return -EPERM; 520 return -EPERM;
521 521
522 if (nlh->nlmsg_flags & NLM_F_DUMP) { 522 if (nlh->nlmsg_flags & NLM_F_DUMP) {
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index 0256b8a0a7cf..71de86698efa 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -2290,7 +2290,7 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
2290 link = &xfrm_dispatch[type]; 2290 link = &xfrm_dispatch[type];
2291 2291
2292 /* All operations require privileges, even GET */ 2292 /* All operations require privileges, even GET */
2293 if (security_netlink_recv(skb, CAP_NET_ADMIN)) 2293 if (!capable(CAP_NET_ADMIN))
2294 return -EPERM; 2294 return -EPERM;
2295 2295
2296 if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) || 2296 if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) ||
diff --git a/security/capability.c b/security/capability.c
index 2984ea4f776f..a2c064d10448 100644
--- a/security/capability.c
+++ b/security/capability.c
@@ -999,7 +999,6 @@ void __init security_fixup_ops(struct security_operations *ops)
999 set_to_cap_if_null(ops, sem_semctl); 999 set_to_cap_if_null(ops, sem_semctl);
1000 set_to_cap_if_null(ops, sem_semop); 1000 set_to_cap_if_null(ops, sem_semop);
1001 set_to_cap_if_null(ops, netlink_send); 1001 set_to_cap_if_null(ops, netlink_send);
1002 set_to_cap_if_null(ops, netlink_recv);
1003 set_to_cap_if_null(ops, d_instantiate); 1002 set_to_cap_if_null(ops, d_instantiate);
1004 set_to_cap_if_null(ops, getprocattr); 1003 set_to_cap_if_null(ops, getprocattr);
1005 set_to_cap_if_null(ops, setprocattr); 1004 set_to_cap_if_null(ops, setprocattr);
diff --git a/security/commoncap.c b/security/commoncap.c
index 89f02ff66af9..7817a763444d 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -56,14 +56,6 @@ int cap_netlink_send(struct sock *sk, struct sk_buff *skb)
56 return 0; 56 return 0;
57} 57}
58 58
59int cap_netlink_recv(struct sk_buff *skb, int cap)
60{
61 if (!cap_raised(current_cap(), cap))
62 return -EPERM;
63 return 0;
64}
65EXPORT_SYMBOL(cap_netlink_recv);
66
67/** 59/**
68 * cap_capable - Determine whether a task has a particular effective capability 60 * cap_capable - Determine whether a task has a particular effective capability
69 * @cred: The credentials to use 61 * @cred: The credentials to use
diff --git a/security/security.c b/security/security.c
index 8900c5c4db5c..85481a9c5632 100644
--- a/security/security.c
+++ b/security/security.c
@@ -922,12 +922,6 @@ int security_netlink_send(struct sock *sk, struct sk_buff *skb)
922 return security_ops->netlink_send(sk, skb); 922 return security_ops->netlink_send(sk, skb);
923} 923}
924 924
925int security_netlink_recv(struct sk_buff *skb, int cap)
926{
927 return security_ops->netlink_recv(skb, cap);
928}
929EXPORT_SYMBOL(security_netlink_recv);
930
931int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen) 925int security_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
932{ 926{
933 return security_ops->secid_to_secctx(secid, secdata, seclen); 927 return security_ops->secid_to_secctx(secid, secdata, seclen);
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 14f94cd29c80..3e37d25a9bbe 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -4713,24 +4713,6 @@ static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
4713 return selinux_nlmsg_perm(sk, skb); 4713 return selinux_nlmsg_perm(sk, skb);
4714} 4714}
4715 4715
4716static int selinux_netlink_recv(struct sk_buff *skb, int capability)
4717{
4718 int err;
4719 struct common_audit_data ad;
4720 u32 sid;
4721
4722 err = cap_netlink_recv(skb, capability);
4723 if (err)
4724 return err;
4725
4726 COMMON_AUDIT_DATA_INIT(&ad, CAP);
4727 ad.u.cap = capability;
4728
4729 security_task_getsecid(current, &sid);
4730 return avc_has_perm(sid, sid, SECCLASS_CAPABILITY,
4731 CAP_TO_MASK(capability), &ad);
4732}
4733
4734static int ipc_alloc_security(struct task_struct *task, 4716static int ipc_alloc_security(struct task_struct *task,
4735 struct kern_ipc_perm *perm, 4717 struct kern_ipc_perm *perm,
4736 u16 sclass) 4718 u16 sclass)
@@ -5459,7 +5441,6 @@ static struct security_operations selinux_ops = {
5459 .vm_enough_memory = selinux_vm_enough_memory, 5441 .vm_enough_memory = selinux_vm_enough_memory,
5460 5442
5461 .netlink_send = selinux_netlink_send, 5443 .netlink_send = selinux_netlink_send,
5462 .netlink_recv = selinux_netlink_recv,
5463 5444
5464 .bprm_set_creds = selinux_bprm_set_creds, 5445 .bprm_set_creds = selinux_bprm_set_creds,
5465 .bprm_committing_creds = selinux_bprm_committing_creds, 5446 .bprm_committing_creds = selinux_bprm_committing_creds,