]> git.hungrycats.org Git - linux/commitdiff
selinux: reject a permission value exceeding the class permission count
authorBryam Vargas <hexlabsecurity@proton.me>
Thu, 27 Aug 2026 18:06:08 +0000 (02:06 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 2 Sep 2026 12:31:46 +0000 (14:31 +0200)
[ Upstream commit d14b5d0e97fccd27974fedc03b903408872907fd ]

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: 55fcf09b3fe4 ("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 d14b5d0e97fccd27974fedc03b903408872907fd)
Signed-off-by: Wentao Guan <guanwentao@uniontech.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
security/selinux/ss/policydb.c

index b87a512446197e29041fa155782b3c6875834ca4..926dae3731a0da5fd31b776f764d251c8612ae8a 100644 (file)
@@ -1160,6 +1160,9 @@ static int perm_read(struct policydb *p, struct symtab *s, struct policy_file *f
        rc = -EINVAL;
        if (perdatum->value < 1 || perdatum->value > SEL_VEC_MAX)
                goto bad;
+       /* indexes an nprim-sized array in security_get_permissions() */
+       if (perdatum->value > s->nprim)
+               goto bad;
 
        rc = str_read(&key, GFP_KERNEL, fp, len);
        if (rc)