]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
Smack: Privilege check on key operations
authorCasey Schaufler <casey@schaufler-ca.com>
Mon, 8 Jan 2018 18:25:32 +0000 (10:25 -0800)
committerCasey Schaufler <casey@schaufler-ca.com>
Wed, 10 Jan 2018 17:29:14 +0000 (09:29 -0800)
Smack: Privilege check on key operations

Operations on key objects are subjected to Smack policy
even if the process is privileged. This is inconsistent
with the general behavior of Smack and may cause issues
with authentication by privileged daemons. This patch
allows processes with CAP_MAC_OVERRIDE to access keys
even if the Smack rules indicate otherwise.

Reported-by: Jose Bollo <jobol@nonadev.net>
Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
security/smack/smack.h
security/smack/smack_access.c
security/smack/smack_lsm.c

index 6a71fc7831ab58b0b8a85468eb783a7c895b7892..f7db791fb5660ad14479af3d4b48e104d8bc37ed 100644 (file)
@@ -321,6 +321,7 @@ struct smack_known *smk_import_entry(const char *, int);
 void smk_insert_entry(struct smack_known *skp);
 struct smack_known *smk_find_entry(const char *);
 bool smack_privileged(int cap);
+bool smack_privileged_cred(int cap, const struct cred *cred);
 void smk_destroy_label_list(struct list_head *list);
 
 /*
index 1a3004189447e6130351b1e87cdc150cfd7e3436..9a4c0ad46518d12d38564a703fdc51f3b202a5ae 100644 (file)
@@ -623,26 +623,24 @@ struct smack_known *smack_from_secid(const u32 secid)
 LIST_HEAD(smack_onlycap_list);
 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
  * by the onlycap rule.
  *
  * 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;
        int rc;
 
-       /*
-        * 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);
+       rc = cap_capable(cred, &init_user_ns, cap, SECURITY_CAP_AUDIT);
        if (rc)
                return false;
 
@@ -662,3 +660,23 @@ bool smack_privileged(int cap)
 
        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());
+}
index 30f2c3d1c11c6b1d8e69e36f925b7974c2f9638e..03fdecba93bb2b238d91e0e29efa0783c7e84b72 100644 (file)
@@ -4369,6 +4369,10 @@ static int smack_key_permission(key_ref_t key_ref,
         */
        if (tkp == NULL)
                return -EACCES;
+
+       if (smack_privileged_cred(CAP_MAC_OVERRIDE, cred))
+               return 0;
+
 #ifdef CONFIG_AUDIT
        smk_ad_init(&ad, __func__, LSM_AUDIT_DATA_KEY);
        ad.a.u.key_struct.key = keyp->serial;