Re: [PATCH v9 5/6] IMA: Add support to limit measuring keys
From: Lakshmi Ramasubramanian
Date: Wed Nov 27 2019 - 19:44:30 EST
On 11/27/19 10:52 AM, Mimi Zohar wrote:
Hi Mimi,
+static bool ima_match_keyring(struct ima_rule_entry *rule,
+ const char *keyring)
+{
+ /*
+ * "keyrings=" is specified in the policy in the format below:
+ * keyrings=.builtin_trusted_keys|.ima|.evm
+ *
+ * Each keyring name in the option is separated by a '|' and
+ * the last keyring name is null terminated.
+ *
+ * The given keyring is considered matched only if
+ * the whole keyring name matched a keyring name specified
+ * in the "keyrings=" option.
+ */
+ p = strstr(rule->keyrings, keyring);
+ if (p) {
+ /*
+ * Found a substring match. Check if the character
+ * at the end of the keyring name is | (keyring name
+ * separator) or is the terminating null character.
+ * If yes, we have a whole string match.
+ */
+ p += strlen(keyring);
+ if (*p == '|' || *p == '\0')
+ return true;
+ }
+
Using "while strsep()" would simplify this code, removing the need for
such a long comment.
Mimi
strsep() modifies the source string (replaces the delimiter with '\0'
and also updates the source string pointer). I am not sure it can be
used for our scenario. Please correct me if I am wrong.
Initial IMA policy:
-------------------
measure func=KEY_CHECK
keyrings=.ima|.evm|.builtin_trusted_keys|.blacklist template=ima-buf
Policy after adding a key to .ima keyring:
------------------------------------------
measure func=KEY_CHECK keyrings=.evm|.builtin_trusted_keys|.blacklist
template=ima-buf
Policy after adding a key to a keyring that is not listed in the policy:
------------------------------------------------------------------------
measure func=KEY_CHECK keyrings= template=ima-buf
********************************************************************************
Please see the description from the man page for strsep():
http://man7.org/linux/man-pages/man3/strsep.3.html
char *strsep(char **stringp, const char *delim);
This function finds the first token in the string *stringp, that is
delimited by one of the bytes in the string delim. This token is
terminated by overwriting the delimiter with a null byte ('\0'), and
*stringp is updated to point past the token.
thanks,
-lakshmi