selinux: Report permissive mode in avc: denied messages.
authorStephen Smalley <sds@tycho.nsa.gov>
Tue, 29 Apr 2014 18:29:04 +0000 (11:29 -0700)
committerStephen Smalley <sds@tycho.nsa.gov>
Thu, 1 May 2014 17:19:04 +0000 (10:19 -0700)
We cannot presently tell from an avc: denied message whether access was in
fact denied or was allowed due to global or per-domain permissive mode.
Add a permissive= field to the avc message to reflect this information.

Change-Id: I78176f8184e01226ece12f0eb38760cdcdc1ff87
Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
security/selinux/avc.c
security/selinux/hooks.c
security/selinux/include/avc.h

index dad36a6ab45f628860ef4c5c097d2a5abce15b4a..c223a32c0bb326d8d8f31e8e3f30990c9ddd3c4f 100644 (file)
@@ -444,11 +444,15 @@ static void avc_audit_post_callback(struct audit_buffer *ab, void *a)
        avc_dump_query(ab, ad->selinux_audit_data->ssid,
                           ad->selinux_audit_data->tsid,
                           ad->selinux_audit_data->tclass);
+       if (ad->selinux_audit_data->denied) {
+               audit_log_format(ab, " permissive=%u",
+                                ad->selinux_audit_data->result ? 0 : 1);
+       }
 }
 
 /* This is the slow part of avc audit with big stack footprint */
 noinline int slow_avc_audit(u32 ssid, u32 tsid, u16 tclass,
-               u32 requested, u32 audited, u32 denied,
+               u32 requested, u32 audited, u32 denied, int result,
                struct common_audit_data *a,
                unsigned flags)
 {
@@ -477,6 +481,7 @@ noinline int slow_avc_audit(u32 ssid, u32 tsid, u16 tclass,
        sad.tsid = tsid;
        sad.audited = audited;
        sad.denied = denied;
+       sad.result = result;
 
        a->selinux_audit_data = &sad;
 
index 11918d7ddb6e9a9477d7efb3f2807fe419427019..44087388010c32b9bd51bcd8ee5004e69e088f0a 100644 (file)
@@ -2714,6 +2714,7 @@ static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *na
 
 static noinline int audit_inode_permission(struct inode *inode,
                                           u32 perms, u32 audited, u32 denied,
+                                          int result,
                                           unsigned flags)
 {
        struct common_audit_data ad;
@@ -2724,7 +2725,7 @@ static noinline int audit_inode_permission(struct inode *inode,
        ad.u.inode = inode;
 
        rc = slow_avc_audit(current_sid(), isec->sid, isec->sclass, perms,
-                           audited, denied, &ad, flags);
+                           audited, denied, result, &ad, flags);
        if (rc)
                return rc;
        return 0;
@@ -2766,7 +2767,7 @@ static int selinux_inode_permission(struct inode *inode, int mask)
        if (likely(!audited))
                return rc;
 
-       rc2 = audit_inode_permission(inode, perms, audited, denied, flags);
+       rc2 = audit_inode_permission(inode, perms, audited, denied, rc, flags);
        if (rc2)
                return rc2;
        return rc;
index 92d0ab561db80cb4aa253815149a35e02d6175d1..28a08a891704a3f12adad6f37a7e8a306ac4d65f 100644 (file)
@@ -102,7 +102,7 @@ static inline u32 avc_audit_required(u32 requested,
 }
 
 int slow_avc_audit(u32 ssid, u32 tsid, u16 tclass,
-                  u32 requested, u32 audited, u32 denied,
+                  u32 requested, u32 audited, u32 denied, int result,
                   struct common_audit_data *a,
                   unsigned flags);
 
@@ -137,7 +137,7 @@ static inline int avc_audit(u32 ssid, u32 tsid,
        if (likely(!audited))
                return 0;
        return slow_avc_audit(ssid, tsid, tclass,
-                             requested, audited, denied,
+                             requested, audited, denied, result,
                              a, flags);
 }