| From: Jann Horn <jannh@google.com> |
| Date: Tue, 28 May 2019 17:32:26 +0200 |
| Subject: apparmor: enforce nullbyte at end of tag string |
| |
| commit 8404d7a674c49278607d19726e0acc0cae299357 upstream. |
| |
| A packed AppArmor policy contains null-terminated tag strings that are read |
| by unpack_nameX(). However, unpack_nameX() uses string functions on them |
| without ensuring that they are actually null-terminated, potentially |
| leading to out-of-bounds accesses. |
| |
| Make sure that the tag string is null-terminated before passing it to |
| strcmp(). |
| |
| Fixes: 736ec752d95e ("AppArmor: policy routines for loading and unpacking policy") |
| Signed-off-by: Jann Horn <jannh@google.com> |
| Signed-off-by: John Johansen <john.johansen@canonical.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| security/apparmor/policy_unpack.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/security/apparmor/policy_unpack.c |
| +++ b/security/apparmor/policy_unpack.c |
| @@ -177,7 +177,7 @@ static bool unpack_nameX(struct aa_ext * |
| char *tag = NULL; |
| size_t size = unpack_u16_chunk(e, &tag); |
| /* if a name is specified it must match. otherwise skip tag */ |
| - if (name && (!size || strcmp(name, tag))) |
| + if (name && (!size || tag[size-1] != '\0' || strcmp(name, tag))) |
| goto fail; |
| } else if (name) { |
| /* if a name is specified and there is no name tag fail */ |