[Trusty][CVE-2014-3917] (upstream) auditsc: audit_krule mask accesses need bounds checking

Chris J Arges chris.j.arges at canonical.com
Thu Jul 24 20:10:08 UTC 2014


As we discussed, this patch was already applied to master-next.
Thanks!
--chris j arges

On 07/24/2014 02:36 PM, Rafael David Tinoco wrote:
> From 99424193549932e0b54a41c349a1aabbe85160be Mon Sep 17 00:00:00
> 2001 From: Andy Lutomirski <luto at amacapital.net> Date: Wed, 28 May
> 2014 23:09:58 -0400 Subject: auditsc: audit_krule mask accesses
> need bounds checking
> 
> CVE-2014-3917
> 
> BugLink: http://bugs.launchpad.net/bugs/1302605
> 
> auditsc: audit_krule mask accesses need bounds checking
> 
> Fixes an easy DoS and possible information disclosure.
> 
> This does nothing about the broken state of x32 auditing.
> 
> eparis: If the admin has enabled auditd and has specifically
> loaded audit rules.  This bug has been around since before git.
> Wow...
> 
> OriginalAuthor: Andy Lutomirski <luto at amacapital.net> 
> Signed-off-by: Andy Lutomirski <luto at amacapital.net> (cherry-picked
> from commit a3c54931199565930d6d84f4c3456f6440aefd41 v3.16-rc6) 
> Signed-off-by: Eric Paris <eparis at redhat.com> Signed-off-by: Linus
> Torvalds <torvalds at linux-foundation.org> Signed-off-by: Rafael
> David Tinoco <rafael.tinoco at canonical.com> --- kernel/auditsc.c |
> 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9
> deletions(-)
> 
> diff --git a/kernel/auditsc.c b/kernel/auditsc.c index
> b590eae..d36a620 100644 --- a/kernel/auditsc.c +++
> b/kernel/auditsc.c @@ -720,6 +720,22 @@ static enum audit_state
> audit_filter_task(struct task_struct *tsk, char **key) return
> AUDIT_BUILD_CONTEXT; }
> 
> +static int audit_in_mask(const struct audit_krule *rule, unsigned
> long val) +{ +	int word, bit; + +	if (val > 0xffffffff) +		return
> false; + +	word = AUDIT_WORD(val); +	if (word >=
> AUDIT_BITMASK_SIZE) +		return false; + +	bit = AUDIT_BIT(val); + +
> return rule->mask[word] & bit; +} + /* At syscall entry and exit
> time, this filter is called if the * audit_state is not low enough
> that auditing cannot take place, but is * also not high enough that
> we already know we have to write an audit @@ -737,11 +753,8 @@
> static enum audit_state audit_filter_syscall(struct task_struct
> *tsk,
> 
> rcu_read_lock(); if (!list_empty(list)) { -		int word =
> AUDIT_WORD(ctx->major); -		int bit  = AUDIT_BIT(ctx->major); - 
> list_for_each_entry_rcu(e, list, list) { -			if
> ((e->rule.mask[word] & bit) == bit && +			if
> (audit_in_mask(&e->rule, ctx->major) && audit_filter_rules(tsk,
> &e->rule, ctx, NULL, &state, false)) { rcu_read_unlock(); @@
> -761,20 +774,16 @@ static enum audit_state
> audit_filter_syscall(struct task_struct *tsk, static int
> audit_filter_inode_name(struct task_struct *tsk, struct audit_names
> *n, struct audit_context *ctx) { -	int word, bit; int h =
> audit_hash_ino((u32)n->ino); struct list_head *list =
> &audit_inode_hash[h]; struct audit_entry *e; enum audit_state
> state;
> 
> -	word = AUDIT_WORD(ctx->major); -	bit  = AUDIT_BIT(ctx->major); - 
> if (list_empty(list)) return 0;
> 
> list_for_each_entry_rcu(e, list, list) { -		if ((e->rule.mask[word]
> & bit) == bit && +		if (audit_in_mask(&e->rule, ctx->major) && 
> audit_filter_rules(tsk, &e->rule, ctx, n, &state, false)) { 
> ctx->current_state = state; return 1;
> 
> 
> 




More information about the kernel-team mailing list