Skip to content

Commit 6c2ab7c

Browse files
bryamzxzgregkh
authored andcommitted
selinux: reject a permission value exceeding the class permission count
[ Upstream commit d14b5d0 ] 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: 55fcf09 ("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> (cherry picked from commit d14b5d0) Signed-off-by: Wentao Guan <guanwentao@uniontech.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 8c07940 commit 6c2ab7c

1 file changed

Lines changed: 3 additions & 0 deletions

File tree

security/selinux/ss/policydb.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,6 +1148,9 @@ static int perm_read(struct policydb *p, struct symtab *s, struct policy_file *f
11481148
rc = -EINVAL;
11491149
if (perdatum->value < 1 || perdatum->value > SEL_VEC_MAX)
11501150
goto bad;
1151+
/* indexes an nprim-sized array in security_get_permissions() */
1152+
if (perdatum->value > s->nprim)
1153+
goto bad;
11511154

11521155
rc = str_read(&key, GFP_KERNEL, fp, len);
11531156
if (rc)

0 commit comments

Comments
 (0)