Commit 2a714903 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'next-smack' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security

Pull smack updates from James Morris:
 "Two minor fixes"

* 'next-smack' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security:
  Smack: Privilege check on key operations
  Smack: fix dereferenced before check
parents 3c29548f d19dfe58
...@@ -321,6 +321,7 @@ struct smack_known *smk_import_entry(const char *, int); ...@@ -321,6 +321,7 @@ struct smack_known *smk_import_entry(const char *, int);
void smk_insert_entry(struct smack_known *skp); void smk_insert_entry(struct smack_known *skp);
struct smack_known *smk_find_entry(const char *); struct smack_known *smk_find_entry(const char *);
bool smack_privileged(int cap); bool smack_privileged(int cap);
bool smack_privileged_cred(int cap, const struct cred *cred);
void smk_destroy_label_list(struct list_head *list); void smk_destroy_label_list(struct list_head *list);
/* /*
......
...@@ -623,26 +623,24 @@ struct smack_known *smack_from_secid(const u32 secid) ...@@ -623,26 +623,24 @@ struct smack_known *smack_from_secid(const u32 secid)
LIST_HEAD(smack_onlycap_list); LIST_HEAD(smack_onlycap_list);
DEFINE_MUTEX(smack_onlycap_lock); DEFINE_MUTEX(smack_onlycap_lock);
/* /**
* smack_privileged_cred - are all privilege requirements met by cred
* @cap: The requested capability
* @cred: the credential to use
*
* Is the task privileged and allowed to be privileged * Is the task privileged and allowed to be privileged
* by the onlycap rule. * by the onlycap rule.
* *
* Returns true if the task is allowed to be privileged, false if it's not. * Returns true if the task is allowed to be privileged, false if it's not.
*/ */
bool smack_privileged(int cap) bool smack_privileged_cred(int cap, const struct cred *cred)
{ {
struct smack_known *skp = smk_of_current(); struct task_smack *tsp = cred->security;
struct smack_known *skp = tsp->smk_task;
struct smack_known_list_elem *sklep; struct smack_known_list_elem *sklep;
int rc; int rc;
/* rc = cap_capable(cred, &init_user_ns, cap, SECURITY_CAP_AUDIT);
* All kernel tasks are privileged
*/
if (unlikely(current->flags & PF_KTHREAD))
return true;
rc = cap_capable(current_cred(), &init_user_ns, cap,
SECURITY_CAP_AUDIT);
if (rc) if (rc)
return false; return false;
...@@ -662,3 +660,23 @@ bool smack_privileged(int cap) ...@@ -662,3 +660,23 @@ bool smack_privileged(int cap)
return false; return false;
} }
/**
* smack_privileged - are all privilege requirements met
* @cap: The requested capability
*
* Is the task privileged and allowed to be privileged
* by the onlycap rule.
*
* Returns true if the task is allowed to be privileged, false if it's not.
*/
bool smack_privileged(int cap)
{
/*
* All kernel tasks are privileged
*/
if (unlikely(current->flags & PF_KTHREAD))
return true;
return smack_privileged_cred(cap, current_cred());
}
...@@ -2866,12 +2866,16 @@ static int smack_socket_connect(struct socket *sock, struct sockaddr *sap, ...@@ -2866,12 +2866,16 @@ static int smack_socket_connect(struct socket *sock, struct sockaddr *sap,
#endif #endif
#ifdef SMACK_IPV6_SECMARK_LABELING #ifdef SMACK_IPV6_SECMARK_LABELING
struct smack_known *rsp; struct smack_known *rsp;
struct socket_smack *ssp = sock->sk->sk_security; struct socket_smack *ssp;
#endif #endif
if (sock->sk == NULL) if (sock->sk == NULL)
return 0; return 0;
#ifdef SMACK_IPV6_SECMARK_LABELING
ssp = sock->sk->sk_security;
#endif
switch (sock->sk->sk_family) { switch (sock->sk->sk_family) {
case PF_INET: case PF_INET:
if (addrlen < sizeof(struct sockaddr_in)) if (addrlen < sizeof(struct sockaddr_in))
...@@ -4365,6 +4369,10 @@ static int smack_key_permission(key_ref_t key_ref, ...@@ -4365,6 +4369,10 @@ static int smack_key_permission(key_ref_t key_ref,
*/ */
if (tkp == NULL) if (tkp == NULL)
return -EACCES; return -EACCES;
if (smack_privileged_cred(CAP_MAC_OVERRIDE, cred))
return 0;
#ifdef CONFIG_AUDIT #ifdef CONFIG_AUDIT
smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_KEY); smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_KEY);
ad.a.u.key_struct.key = keyp->serial; ad.a.u.key_struct.key = keyp->serial;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment