[PATCH] libsepol: Check for invalid categories when expanding semantic levels
James Carter <[email protected]> Wed, 29 Jul 2026 11:43:23 -0400
| Newsgroups | org.kernel.vger.selinux |
|---|---|
| Message-ID | <[email protected]> |
The function mls_semantic_level_expand() is used before the policy has been validated. A maliciously crafted policy might have gaps in the categories, so a check must be done to verify that the categories referred to actually exist. Signed-off-by: James Carter <[email protected]> --- libsepol/src/expand.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/libsepol/src/expand.c b/libsepol/src/expand.c index 8d7fe519..35f26c23 100644 --- a/libsepol/src/expand.c +++ b/libsepol/src/expand.c @@ -1128,18 +1128,27 @@ int mls_semantic_level_expand(mls_semantic_level_t *sl, mls_level_t *l, return -1; } for (cat = sl->cat; cat; cat = cat->next) { - if (!cat->low || cat->low > cat->high || - cat->high > p->p_cats.nprim) { - ERR(h, "Category range is not valid %s.%s", - (cat->low && cat->low <= p->p_cats.nprim) ? - p->p_cat_val_to_name[cat->low - 1] : - "Invalid", - (cat->high && cat->high <= p->p_cats.nprim) ? - p->p_cat_val_to_name[cat->high - 1] : - "Invalid"); + if (!cat->low || cat->low > p->p_cats.nprim || + !p->p_cat_val_to_name[cat->low - 1]) { + ERR(h, "Low category is invalid"); + return -1; + } + if (!cat->high || cat->high > p->p_cats.nprim || + !p->p_cat_val_to_name[cat->high - 1]) { + ERR(h, "High category is invalid"); + return -1; + } + if (cat->low > cat->high) { + ERR(h, "Category range \"%s.%s\" is not valid", + p->p_cat_val_to_name[cat->low - 1], + p->p_cat_val_to_name[cat->high - 1]); return -1; } for (i = cat->low - 1; i < cat->high; i++) { + if (!p->p_cat_val_to_name[i]) { + ERR(h, "Invalid category in range"); + return -1; + } if (!ebitmap_get_bit(&levdatum->level->cat, i)) { ERR(h, "Category %s can not be associated with " -- 2.55.0