mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
selinux: reject a permission value exceeding the class permission count
commitd14b5d0e97upstream. perm_read() bounds a permission value by SEL_VEC_MAX but never by the nprim of the owning class or common, which is taken verbatim from the policy image. security_get_permissions() then writes perms[value - 1] into an nprim-sized kcalloc() array, so a class declaring fewer permissions than its largest permission value drives an out-of-bounds heap write. The top-level symbol tables are validated this way; the nested per-class permission table is not. Reject a permission whose value exceeds nprim, which is already set when perm_read() runs. Well-formed policies are unaffected. Cc: stable@vger.kernel.org Fixes:55fcf09b3f("selinux: add support for querying object classes and permissions from the running policy") Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me> Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com> [PM: tweak comment for line length] Signed-off-by: Paul Moore <paul@paul-moore.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
841aea4d5a
commit
9b46fba752
@@ -1168,6 +1168,9 @@ static int perm_read(struct policydb *p, struct symtab *s, struct policy_file *f
|
||||
rc = symtab_insert(s, key, perdatum);
|
||||
if (rc)
|
||||
goto bad;
|
||||
/* indexes an nprim-sized array in security_get_permissions() */
|
||||
if (perdatum->value > s->nprim)
|
||||
goto bad;
|
||||
|
||||
return 0;
|
||||
bad:
|
||||
|
||||
Reference in New Issue
Block a user