]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
apparmor: fix absroot causing audited secids to begin with =
authorJohn Johansen <john.johansen@canonical.com>
Tue, 14 Dec 2021 10:59:28 +0000 (02:59 -0800)
committerJohn Johansen <john.johansen@canonical.com>
Sat, 9 Jul 2022 22:13:58 +0000 (15:13 -0700)
AppArmor is prefixing secids that are converted to secctx with the =
to indicate the secctx should only be parsed from an absolute root
POV. This allows catching errors where secctx are reparsed back into
internal labels.

Unfortunately because audit is using secid to secctx conversion this
means that subject and object labels can result in a very unfortunate
== that can break audit parsing.

eg. the subj==unconfined term in the below audit message

type=USER_LOGIN msg=audit(1639443365.233:160): pid=1633 uid=0 auid=1000
ses=3 subj==unconfined msg='op=login id=1000 exe="/usr/sbin/sshd"
hostname=192.168.122.1 addr=192.168.122.1 terminal=/dev/pts/1 res=success'

Fix this by switch the prepending of = to a _. This still works as a
special character to flag this case without breaking audit. Also move
this check behind debug as it should not be needed during normal
operqation.

Fixes: 26b7899510ae ("apparmor: add support for absolute root view based labels")
Reported-by: Casey Schaufler <casey@schaufler-ca.com>
Signed-off-by: John Johansen <john.johansen@canonical.com>
security/apparmor/include/lib.h
security/apparmor/label.c

index e2e8df0c6f1c931ce22d5cb21cf84ed08ee72c32..f42359f58eb5878bf3241405b4d2845d3c61dca5 100644 (file)
  */
 
 #define DEBUG_ON (aa_g_debug)
+/*
+ * split individual debug cases out in preparation for finer grained
+ * debug controls in the future.
+ */
+#define AA_DEBUG_LABEL DEBUG_ON
 #define dbg_printk(__fmt, __args...) pr_debug(__fmt, ##__args)
 #define AA_DEBUG(fmt, args...)                                         \
        do {                                                            \
index 0b0265da19267a91dc19d23b898a244ccde89e8a..4bdb558696e8fc68e0146dd4a7d128c67fb06e6c 100644 (file)
@@ -1631,9 +1631,9 @@ int aa_label_snxprint(char *str, size_t size, struct aa_ns *ns,
        AA_BUG(!str && size != 0);
        AA_BUG(!label);
 
-       if (flags & FLAG_ABS_ROOT) {
+       if (AA_DEBUG_LABEL && (flags & FLAG_ABS_ROOT)) {
                ns = root_ns;
-               len = snprintf(str, size, "=");
+               len = snprintf(str, size, "_");
                update_for_len(total, len, size, str);
        } else if (!ns) {
                ns = labels_ns(label);
@@ -1895,7 +1895,8 @@ struct aa_label *aa_label_strn_parse(struct aa_label *base, const char *str,
        AA_BUG(!str);
 
        str = skipn_spaces(str, n);
-       if (str == NULL || (*str == '=' && base != &root_ns->unconfined->label))
+       if (str == NULL || (AA_DEBUG_LABEL && *str == '_' &&
+                           base != &root_ns->unconfined->label))
                return ERR_PTR(-EINVAL);
 
        len = label_count_strn_entries(str, end - str);