All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH -v3] SELinux: special dontaudit for access checks
@ 2010-05-03 22:29 Eric Paris
  2010-05-03 22:46 ` Eric Paris
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Eric Paris @ 2010-05-03 22:29 UTC (permalink / raw)
  To: selinux; +Cc: sds, jmorris

Currently there are a number of applications (nautilus being the main one) which
calls access() on files in order to determine how they should be displayed.  It
is normal and expected that nautilus will want to see if files are executable
or if they are really read/write-able.  access() should return the real
permission.  SELinux policy checks are done in access() and can result in lots
of AVC denials as policy denies RWX on files which DAC allows.  Currently
SELinux must dontaudit actual attempts to read/write/execute a file in
order to silence these messages (and not flood the logs.)  But dontaudit rules
like that can hide real attacks.  This patch addes a new common file
permission audit_access.  This permission is special in that it is meaningless
and should never show up in an allow rule.  Instead the only place this
permission has meaning is in a dontaudit rule like so:

dontaudit nautilus_t sbin_t:file audit_access

With such a rule if nautilus just checks access() we will still get denied and
thus userspace will still get the correct answer but we will not log the denial.
If nautilus attempted to actually perform one of the forbidden actions
(rather than just querying access(2) about it) we would still log a denial.
This type of dontaudit rule should be used sparingly, as it could be a
method for an attacker to probe the system permissions without detection.

Signed-off-by: Eric Paris <eparis@redhat.com>
---

 include/linux/lsm_audit.h           |    5 +++++
 security/selinux/avc.c              |   24 ++++++++++++++++++++++--
 security/selinux/hooks.c            |   20 +++++++++++++++-----
 security/selinux/include/classmap.h |    2 +-
 4 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/include/linux/lsm_audit.h b/include/linux/lsm_audit.h
index 6907251..788f0ab 100644
--- a/include/linux/lsm_audit.h
+++ b/include/linux/lsm_audit.h
@@ -90,6 +90,11 @@ struct common_audit_data {
 			u32 requested;
 			u32 audited;
 			u32 denied;
+			/*
+			 * auditdeny is a bit tricky and unintuitive.  See the
+			 * comments in avc.c for it's meaning and usage.
+			 */
+			u32 auditdeny;
 			struct av_decision *avd;
 			int result;
 		} selinux_audit_data;
diff --git a/security/selinux/avc.c b/security/selinux/avc.c
index 7f1a304..64e7fec 100644
--- a/security/selinux/avc.c
+++ b/security/selinux/avc.c
@@ -489,9 +489,29 @@ void avc_audit(u32 ssid, u32 tsid,
 	struct common_audit_data stack_data;
 	u32 denied, audited;
 	denied = requested & ~avd->allowed;
-	if (denied)
+	if (denied) {
 		audited = denied & avd->auditdeny;
-	else if (result)
+		/*
+		 * a->selinux_audit_data.auditdeny it TRICKY!  Setting a bit in
+		 * this field means that ANY denials should NOT be audited if
+		 * the policy contains an explicit dontaudit rule for that
+		 * permission.  Take notice that this is unrelated to the
+		 * actual permissions that were denied.  As an example lets
+		 * assume:
+		 *
+		 * denied == READ
+		 * avd.auditdeny & ACCESS == 0 (not set means explicit rule)
+		 * selinux_audit_data.auditdeny & ACCESS == 1
+		 *
+		 * We will NOT audit the denial even though the denied
+		 * permission was READ and the auditdeny checks were for
+		 * ACCESS
+		 */
+		if (a &&
+		    a->selinux_audit_data.auditdeny &&
+		    !(a->selinux_audit_data.auditdeny & avd->auditdeny))
+			audited = 0;
+	} else if (result)
 		audited = denied = requested;
 	else
 		audited = requested & avd->auditallow;
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index f48010d..09f1f6d 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -2698,16 +2698,26 @@ static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *na
 static int selinux_inode_permission(struct inode *inode, int mask)
 {
 	const struct cred *cred = current_cred();
+	struct common_audit_data ad;
+	u32 perms;
+	bool from_access;
 
+	from_access = mask & MAY_ACCESS;
 	mask &= (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND);
 
-	if (!mask) {
-		/* No permission to check.  Existence test. */
+	/* No permission to check.  Existence test. */
+	if (!mask)
 		return 0;
-	}
 
-	return inode_has_perm(cred, inode,
-			      file_mask_to_av(inode->i_mode, mask), NULL);
+	COMMON_AUDIT_DATA_INIT(&ad, FS);
+	ad.u.fs.inode = inode;
+
+	if (from_access)
+		ad.selinux_audit_data.auditdeny |= FILE__AUDIT_ACCESS;
+
+	perms = file_mask_to_av(inode->i_mode, mask);
+
+	return inode_has_perm(cred, inode, perms, &ad);
 }
 
 static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h
index 8b32e95..d64603e 100644
--- a/security/selinux/include/classmap.h
+++ b/security/selinux/include/classmap.h
@@ -2,7 +2,7 @@
     "getattr", "setattr", "lock", "relabelfrom", "relabelto", "append"
 
 #define COMMON_FILE_PERMS COMMON_FILE_SOCK_PERMS, "unlink", "link", \
-    "rename", "execute", "swapon", "quotaon", "mounton"
+    "rename", "execute", "swapon", "quotaon", "mounton", "audit_access"
 
 #define COMMON_SOCK_PERMS COMMON_FILE_SOCK_PERMS, "bind", "connect", \
     "listen", "accept", "getopt", "setopt", "shutdown", "recvfrom",  \


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH -v3] SELinux: special dontaudit for access checks
  2010-05-03 22:29 [PATCH -v3] SELinux: special dontaudit for access checks Eric Paris
@ 2010-05-03 22:46 ` Eric Paris
  2010-05-04 13:49 ` Stephen Smalley
  2010-05-04 22:50 ` James Morris
  2 siblings, 0 replies; 8+ messages in thread
From: Eric Paris @ 2010-05-03 22:46 UTC (permalink / raw)
  To: Eric Paris; +Cc: selinux, sds, jmorris

On Mon, May 3, 2010 at 6:29 PM, Eric Paris <eparis@redhat.com> wrote:

> --- a/include/linux/lsm_audit.h
> +++ b/include/linux/lsm_audit.h
> @@ -90,6 +90,11 @@ struct common_audit_data {
>                        u32 requested;
>                        u32 audited;
>                        u32 denied;
> +                       /*
> +                        * auditdeny is a bit tricky and unintuitive.  See the
> +                        * comments in avc.c for it's meaning and usage.

I really do know the difference between it's and its.  I'll fix if
another patch is needed.  Else I'll leave it up to James to fix during
merge or not fix it....


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH -v3] SELinux: special dontaudit for access checks
  2010-05-03 22:29 [PATCH -v3] SELinux: special dontaudit for access checks Eric Paris
  2010-05-03 22:46 ` Eric Paris
@ 2010-05-04 13:49 ` Stephen Smalley
  2010-05-04 22:50 ` James Morris
  2 siblings, 0 replies; 8+ messages in thread
From: Stephen Smalley @ 2010-05-04 13:49 UTC (permalink / raw)
  To: Eric Paris; +Cc: selinux, jmorris

On Mon, 2010-05-03 at 18:29 -0400, Eric Paris wrote:
> Currently there are a number of applications (nautilus being the main one) which
> calls access() on files in order to determine how they should be displayed.  It
> is normal and expected that nautilus will want to see if files are executable
> or if they are really read/write-able.  access() should return the real
> permission.  SELinux policy checks are done in access() and can result in lots
> of AVC denials as policy denies RWX on files which DAC allows.  Currently
> SELinux must dontaudit actual attempts to read/write/execute a file in
> order to silence these messages (and not flood the logs.)  But dontaudit rules
> like that can hide real attacks.  This patch addes a new common file
> permission audit_access.  This permission is special in that it is meaningless
> and should never show up in an allow rule.  Instead the only place this
> permission has meaning is in a dontaudit rule like so:
> 
> dontaudit nautilus_t sbin_t:file audit_access
> 
> With such a rule if nautilus just checks access() we will still get denied and
> thus userspace will still get the correct answer but we will not log the denial.
> If nautilus attempted to actually perform one of the forbidden actions
> (rather than just querying access(2) about it) we would still log a denial.
> This type of dontaudit rule should be used sparingly, as it could be a
> method for an attacker to probe the system permissions without detection.
> 
> Signed-off-by: Eric Paris <eparis@redhat.com>

Acked-by:  Stephen Smalley <sds@tycho.nsa.gov>

> ---
> 
>  include/linux/lsm_audit.h           |    5 +++++
>  security/selinux/avc.c              |   24 ++++++++++++++++++++++--
>  security/selinux/hooks.c            |   20 +++++++++++++++-----
>  security/selinux/include/classmap.h |    2 +-
>  4 files changed, 43 insertions(+), 8 deletions(-)
> 
> diff --git a/include/linux/lsm_audit.h b/include/linux/lsm_audit.h
> index 6907251..788f0ab 100644
> --- a/include/linux/lsm_audit.h
> +++ b/include/linux/lsm_audit.h
> @@ -90,6 +90,11 @@ struct common_audit_data {
>  			u32 requested;
>  			u32 audited;
>  			u32 denied;
> +			/*
> +			 * auditdeny is a bit tricky and unintuitive.  See the
> +			 * comments in avc.c for it's meaning and usage.
> +			 */
> +			u32 auditdeny;
>  			struct av_decision *avd;
>  			int result;
>  		} selinux_audit_data;
> diff --git a/security/selinux/avc.c b/security/selinux/avc.c
> index 7f1a304..64e7fec 100644
> --- a/security/selinux/avc.c
> +++ b/security/selinux/avc.c
> @@ -489,9 +489,29 @@ void avc_audit(u32 ssid, u32 tsid,
>  	struct common_audit_data stack_data;
>  	u32 denied, audited;
>  	denied = requested & ~avd->allowed;
> -	if (denied)
> +	if (denied) {
>  		audited = denied & avd->auditdeny;
> -	else if (result)
> +		/*
> +		 * a->selinux_audit_data.auditdeny it TRICKY!  Setting a bit in
> +		 * this field means that ANY denials should NOT be audited if
> +		 * the policy contains an explicit dontaudit rule for that
> +		 * permission.  Take notice that this is unrelated to the
> +		 * actual permissions that were denied.  As an example lets
> +		 * assume:
> +		 *
> +		 * denied == READ
> +		 * avd.auditdeny & ACCESS == 0 (not set means explicit rule)
> +		 * selinux_audit_data.auditdeny & ACCESS == 1
> +		 *
> +		 * We will NOT audit the denial even though the denied
> +		 * permission was READ and the auditdeny checks were for
> +		 * ACCESS
> +		 */
> +		if (a &&
> +		    a->selinux_audit_data.auditdeny &&
> +		    !(a->selinux_audit_data.auditdeny & avd->auditdeny))
> +			audited = 0;
> +	} else if (result)
>  		audited = denied = requested;
>  	else
>  		audited = requested & avd->auditallow;
> diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> index f48010d..09f1f6d 100644
> --- a/security/selinux/hooks.c
> +++ b/security/selinux/hooks.c
> @@ -2698,16 +2698,26 @@ static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *na
>  static int selinux_inode_permission(struct inode *inode, int mask)
>  {
>  	const struct cred *cred = current_cred();
> +	struct common_audit_data ad;
> +	u32 perms;
> +	bool from_access;
>  
> +	from_access = mask & MAY_ACCESS;
>  	mask &= (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND);
>  
> -	if (!mask) {
> -		/* No permission to check.  Existence test. */
> +	/* No permission to check.  Existence test. */
> +	if (!mask)
>  		return 0;
> -	}
>  
> -	return inode_has_perm(cred, inode,
> -			      file_mask_to_av(inode->i_mode, mask), NULL);
> +	COMMON_AUDIT_DATA_INIT(&ad, FS);
> +	ad.u.fs.inode = inode;
> +
> +	if (from_access)
> +		ad.selinux_audit_data.auditdeny |= FILE__AUDIT_ACCESS;
> +
> +	perms = file_mask_to_av(inode->i_mode, mask);
> +
> +	return inode_has_perm(cred, inode, perms, &ad);
>  }
>  
>  static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
> diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h
> index 8b32e95..d64603e 100644
> --- a/security/selinux/include/classmap.h
> +++ b/security/selinux/include/classmap.h
> @@ -2,7 +2,7 @@
>      "getattr", "setattr", "lock", "relabelfrom", "relabelto", "append"
>  
>  #define COMMON_FILE_PERMS COMMON_FILE_SOCK_PERMS, "unlink", "link", \
> -    "rename", "execute", "swapon", "quotaon", "mounton"
> +    "rename", "execute", "swapon", "quotaon", "mounton", "audit_access"
>  
>  #define COMMON_SOCK_PERMS COMMON_FILE_SOCK_PERMS, "bind", "connect", \
>      "listen", "accept", "getopt", "setopt", "shutdown", "recvfrom",  \
> 
> 
> --
> This message was distributed to subscribers of the selinux mailing list.
> If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
> the words "unsubscribe selinux" without quotes as the message.
-- 
Stephen Smalley
National Security Agency


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH -v3] SELinux: special dontaudit for access checks
  2010-05-03 22:29 [PATCH -v3] SELinux: special dontaudit for access checks Eric Paris
  2010-05-03 22:46 ` Eric Paris
  2010-05-04 13:49 ` Stephen Smalley
@ 2010-05-04 22:50 ` James Morris
  2010-05-05 14:08   ` Eric Paris
  2 siblings, 1 reply; 8+ messages in thread
From: James Morris @ 2010-05-04 22:50 UTC (permalink / raw)
  To: Eric Paris; +Cc: selinux, sds

On Mon, 3 May 2010, Eric Paris wrote:

> Signed-off-by: Eric Paris <eparis@redhat.com>
> ---

This does not apply to my tree, please fix.

-- 
James Morris
<jmorris@namei.org>

--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH -v3] SELinux: special dontaudit for access checks
  2010-05-04 22:50 ` James Morris
@ 2010-05-05 14:08   ` Eric Paris
  2010-05-06  0:03     ` James Morris
  2010-07-22 23:21     ` James Morris
  0 siblings, 2 replies; 8+ messages in thread
From: Eric Paris @ 2010-05-05 14:08 UTC (permalink / raw)
  To: James Morris; +Cc: selinux, sds

On Wed, 2010-05-05 at 08:50 +1000, James Morris wrote:
> On Mon, 3 May 2010, Eric Paris wrote:
> 
> > Signed-off-by: Eric Paris <eparis@redhat.com>
> > ---
> 
> This does not apply to my tree, please fix.

Patches sent should be applied in this order:

re-introduce MAY_ACCESS
http://marc.info/?l=linux-fsdevel&m=127085147411199&w=2

LSM explicit masking
http://marc.info/?l=linux-fsdevel&m=127085147211188&w=2

SELinux audit_access
http://marc.info/?l=selinux&m=127292585028408&w=2

open in common perms
http://marc.info/?l=selinux&m=127111467103490&w=2

execmod in common perms
http://marc.info/?l=selinux&m=127111467103486&w=2

If you prefer I can send them all again as a series or as a single mbox.
Or you can just apply them in the correct order....

-Eric


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH -v3] SELinux: special dontaudit for access checks
  2010-05-05 14:08   ` Eric Paris
@ 2010-05-06  0:03     ` James Morris
  2010-05-06 21:23       ` Eric Paris
  2010-07-22 23:21     ` James Morris
  1 sibling, 1 reply; 8+ messages in thread
From: James Morris @ 2010-05-06  0:03 UTC (permalink / raw)
  To: Eric Paris; +Cc: selinux, sds

On Wed, 5 May 2010, Eric Paris wrote:

> On Wed, 2010-05-05 at 08:50 +1000, James Morris wrote:
> > On Mon, 3 May 2010, Eric Paris wrote:
> > 
> > > Signed-off-by: Eric Paris <eparis@redhat.com>
> > > ---
> > 
> > This does not apply to my tree, please fix.
> 
> Patches sent should be applied in this order:
> 
> re-introduce MAY_ACCESS
> http://marc.info/?l=linux-fsdevel&m=127085147411199&w=2

This changes filesystem code (e.g. logic in NFS), but has no comments or 
signoff from fs/vfs folk, as I indicated to you off-list.  Do you think 
it's ok to go in anyway?


-- 
James Morris
<jmorris@namei.org>

--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH -v3] SELinux: special dontaudit for access checks
  2010-05-06  0:03     ` James Morris
@ 2010-05-06 21:23       ` Eric Paris
  0 siblings, 0 replies; 8+ messages in thread
From: Eric Paris @ 2010-05-06 21:23 UTC (permalink / raw)
  To: James Morris; +Cc: selinux, sds

On Thu, 2010-05-06 at 10:03 +1000, James Morris wrote:
> On Wed, 5 May 2010, Eric Paris wrote:
> 
> > On Wed, 2010-05-05 at 08:50 +1000, James Morris wrote:
> > > On Mon, 3 May 2010, Eric Paris wrote:
> > > 
> > > > Signed-off-by: Eric Paris <eparis@redhat.com>
> > > > ---
> > > 
> > > This does not apply to my tree, please fix.
> > 
> > Patches sent should be applied in this order:
> > 
> > re-introduce MAY_ACCESS
> > http://marc.info/?l=linux-fsdevel&m=127085147411199&w=2
> 
> This changes filesystem code (e.g. logic in NFS), but has no comments or 
> signoff from fs/vfs folk, as I indicated to you off-list.  Do you think 
> it's ok to go in anyway?

It changes NO logic, just breaks one flag into 2.  If it does change any
logic the patch is busted!  So yes I believe it is perfectly safe to go
in.  I, however, poked Al again (about the 3rd time) just in case he has
a better suggestion.

-Eric


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH -v3] SELinux: special dontaudit for access checks
  2010-05-05 14:08   ` Eric Paris
  2010-05-06  0:03     ` James Morris
@ 2010-07-22 23:21     ` James Morris
  1 sibling, 0 replies; 8+ messages in thread
From: James Morris @ 2010-07-22 23:21 UTC (permalink / raw)
  To: Eric Paris; +Cc: selinux, sds

On Wed, 5 May 2010, Eric Paris wrote:

> On Wed, 2010-05-05 at 08:50 +1000, James Morris wrote:
> > On Mon, 3 May 2010, Eric Paris wrote:
> > 
> > > Signed-off-by: Eric Paris <eparis@redhat.com>
> > > ---
> > 
> > This does not apply to my tree, please fix.
> 
> Patches sent should be applied in this order:
> 
> re-introduce MAY_ACCESS
> http://marc.info/?l=linux-fsdevel&m=127085147411199&w=2
> 
> LSM explicit masking
> http://marc.info/?l=linux-fsdevel&m=127085147211188&w=2
> 
> SELinux audit_access
> http://marc.info/?l=selinux&m=127292585028408&w=2
> 
> open in common perms
> http://marc.info/?l=selinux&m=127111467103490&w=2
> 
> execmod in common perms
> http://marc.info/?l=selinux&m=127111467103486&w=2
> 
> If you prefer I can send them all again as a series or as a single mbox.
> Or you can just apply them in the correct order....

I'm getting:

security/selinux/hooks.c: In function selinux_inode_permission:
security/selinux/hooks.c:2662: error: FILE__AUDIT_ACCESS undeclared (first 
use in this function)

Looks like av_permissions.h is not being built.   Can you resend all this 
as a patchset against my current tree ?



-- 
James Morris
<jmorris@namei.org>

--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with
the words "unsubscribe selinux" without quotes as the message.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2010-07-22 23:21 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-05-03 22:29 [PATCH -v3] SELinux: special dontaudit for access checks Eric Paris
2010-05-03 22:46 ` Eric Paris
2010-05-04 13:49 ` Stephen Smalley
2010-05-04 22:50 ` James Morris
2010-05-05 14:08   ` Eric Paris
2010-05-06  0:03     ` James Morris
2010-05-06 21:23       ` Eric Paris
2010-07-22 23:21     ` James Morris

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.