| From 4351c294b8c1028077280f761e158d167b592974 Mon Sep 17 00:00:00 2001 |
| From: Mimi Zohar <zohar@linux.vnet.ibm.com> |
| Date: Wed, 5 Nov 2014 07:53:55 -0500 |
| Subject: ima: extend "mask" policy matching support |
| |
| From: Mimi Zohar <zohar@linux.vnet.ibm.com> |
| |
| commit 4351c294b8c1028077280f761e158d167b592974 upstream. |
| |
| The current "mask" policy option matches files opened as MAY_READ, |
| MAY_WRITE, MAY_APPEND or MAY_EXEC. This patch extends the "mask" |
| option to match files opened containing one of these modes. For |
| example, "mask=^MAY_READ" would match files opened read-write. |
| |
| Signed-off-by: Mimi Zohar <zohar@linux.vnet.ibm.com> |
| Signed-off-by: Dr. Greg Wettstein <gw@idfusion.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| Documentation/ABI/testing/ima_policy | 3 ++- |
| security/integrity/ima/ima_policy.c | 20 +++++++++++++++----- |
| 2 files changed, 17 insertions(+), 6 deletions(-) |
| |
| --- a/Documentation/ABI/testing/ima_policy |
| +++ b/Documentation/ABI/testing/ima_policy |
| @@ -26,7 +26,8 @@ Description: |
| option: [[appraise_type=]] [permit_directio] |
| |
| base: func:= [BPRM_CHECK][MMAP_CHECK][FILE_CHECK][MODULE_CHECK] |
| - mask:= [MAY_READ] [MAY_WRITE] [MAY_APPEND] [MAY_EXEC] |
| + mask:= [[^]MAY_READ] [[^]MAY_WRITE] [[^]MAY_APPEND] |
| + [[^]MAY_EXEC] |
| fsmagic:= hex value |
| fsuuid:= file system UUID (e.g 8bcbe394-4f13-4144-be8e-5aa9ea2ce2f6) |
| uid:= decimal value |
| --- a/security/integrity/ima/ima_policy.c |
| +++ b/security/integrity/ima/ima_policy.c |
| @@ -27,6 +27,7 @@ |
| #define IMA_UID 0x0008 |
| #define IMA_FOWNER 0x0010 |
| #define IMA_FSUUID 0x0020 |
| +#define IMA_INMASK 0x0040 |
| #define IMA_EUID 0x0080 |
| |
| #define UNKNOWN 0 |
| @@ -172,6 +173,9 @@ static bool ima_match_rules(struct ima_r |
| return false; |
| if ((rule->flags & IMA_MASK) && rule->mask != mask) |
| return false; |
| + if ((rule->flags & IMA_INMASK) && |
| + (!(rule->mask & mask) && func != POST_SETATTR)) |
| + return false; |
| if ((rule->flags & IMA_FSMAGIC) |
| && rule->fsmagic != inode->i_sb->s_magic) |
| return false; |
| @@ -425,6 +429,7 @@ static void ima_log_string(struct audit_ |
| static int ima_parse_rule(char *rule, struct ima_rule_entry *entry) |
| { |
| struct audit_buffer *ab; |
| + char *from; |
| char *p; |
| int result = 0; |
| |
| @@ -513,18 +518,23 @@ static int ima_parse_rule(char *rule, st |
| if (entry->mask) |
| result = -EINVAL; |
| |
| - if ((strcmp(args[0].from, "MAY_EXEC")) == 0) |
| + from = args[0].from; |
| + if (*from == '^') |
| + from++; |
| + |
| + if ((strcmp(from, "MAY_EXEC")) == 0) |
| entry->mask = MAY_EXEC; |
| - else if (strcmp(args[0].from, "MAY_WRITE") == 0) |
| + else if (strcmp(from, "MAY_WRITE") == 0) |
| entry->mask = MAY_WRITE; |
| - else if (strcmp(args[0].from, "MAY_READ") == 0) |
| + else if (strcmp(from, "MAY_READ") == 0) |
| entry->mask = MAY_READ; |
| - else if (strcmp(args[0].from, "MAY_APPEND") == 0) |
| + else if (strcmp(from, "MAY_APPEND") == 0) |
| entry->mask = MAY_APPEND; |
| else |
| result = -EINVAL; |
| if (!result) |
| - entry->flags |= IMA_MASK; |
| + entry->flags |= (*args[0].from == '^') |
| + ? IMA_INMASK : IMA_MASK; |
| break; |
| case Opt_fsmagic: |
| ima_log_string(ab, "fsmagic", args[0].from); |