]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
UBUNTU: SAUCE: apparmor: ensure that dfa state tables have entries
authorJohn Johansen <john.johansen@canonical.com>
Tue, 31 Mar 2020 06:37:54 +0000 (23:37 -0700)
committerSeth Forshee <seth.forshee@canonical.com>
Thu, 9 Apr 2020 20:58:27 +0000 (15:58 -0500)
Currently it is possible to specify a state machine table with 0 length,
this is not valid as optional tables are specified by not defining
the table as present. Further this allows by-passing the base tables
range check against the next/check tables.

Fixes: d901d6a298dc ("apparmor: dfa split verification of table headers")
Reported-by: Mike Salvatore <mike.salvatore@canonical.com>
Signed-off-by: John Johansen <john.johansen@canonical.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
security/apparmor/match.c

index 651dbb6e38b8142f9636fe0aab406f936bf101f0..beb64cf02c0ce10a8c27815dc0be837b4c5bd0a3 100644 (file)
@@ -97,6 +97,9 @@ static struct table_header *unpack_table(char *blob, size_t bsize)
              th.td_flags == YYTD_DATA8))
                goto out;
 
+       /* if we have a table it must have some entries */
+       if (th.td_lolen == 0)
+               goto out;
        tsize = table_size(th.td_lolen, th.td_flags);
        if (bsize < tsize)
                goto out;
@@ -198,6 +201,8 @@ static int verify_dfa(struct aa_dfa *dfa)
 
        state_count = dfa->tables[YYTD_ID_BASE]->td_lolen;
        trans_count = dfa->tables[YYTD_ID_NXT]->td_lolen;
+       if (state_count == 0)
+               goto out;
        for (i = 0; i < state_count; i++) {
                if (!(BASE_TABLE(dfa)[i] & MATCH_FLAG_DIFF_ENCODE) &&
                    (DEFAULT_TABLE(dfa)[i] >= state_count))