81 lines
3.5 KiB
Diff
81 lines
3.5 KiB
Diff
From fffb16093c6eb4a316f530ac5813459277dfd40b Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
|
Date: Thu, 9 Dec 2021 17:49:16 +0100
|
|
Subject: [PATCH] libsepol: validate expanded user range and level
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Check those contains valid values.
|
|
|
|
==57532==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x603000001178 at pc 0x000000564c04 bp 0x7ffed7a5ad90 sp 0x7ffed7a5ad88
|
|
READ of size 8 at 0x603000001178 thread T0
|
|
#0 0x564c03 in level_to_str ./libsepol/src/kernel_to_conf.c:1901:19
|
|
#1 0x564c03 in range_to_str ./libsepol/src/kernel_to_conf.c:1926:9
|
|
#2 0x564c03 in write_user_decl_rules_to_conf ./libsepol/src/kernel_to_conf.c:2367:12
|
|
#3 0x55b137 in sepol_kernel_policydb_to_conf ./libsepol/src/kernel_to_conf.c:3184:7
|
|
#4 0x55a34f in LLVMFuzzerTestOneInput ./libsepol/fuzz/binpolicy-fuzzer.c:38:9
|
|
#5 0x45aed3 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) fuzzer.o
|
|
#6 0x446a12 in fuzzer::RunOneTest(fuzzer::Fuzzer*, char const*, unsigned long) fuzzer.o
|
|
#7 0x44c93b in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) fuzzer.o
|
|
#8 0x475dd2 in main (./out/binpolicy-fuzzer+0x475dd2)
|
|
#9 0x7f2c2e1a77ec in __libc_start_main csu/../csu/libc-start.c:332:16
|
|
#10 0x423689 in _start (./out/binpolicy-fuzzer+0x423689)
|
|
|
|
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
|
|
|
Reference: https://github.com/SELinuxProject/selinux/commit/fffb16093c6eb4a316f530ac5813459277dfd40b
|
|
Conflict: Context adaptation
|
|
---
|
|
libsepol/src/policydb_validate.c | 21 +++++++++++++++++++--
|
|
1 file changed, 19 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/libsepol/src/policydb_validate.c b/libsepol/src/policydb_validate.c
|
|
index 03ab4445a8..adaa3fb2d8 100644
|
|
--- a/libsepol/src/policydb_validate.c
|
|
+++ b/libsepol/src/policydb_validate.c
|
|
@@ -294,7 +294,20 @@ bad:
|
|
return -1;
|
|
}
|
|
|
|
-static int validate_user_datum(sepol_handle_t *handle, user_datum_t *user, validate_t flavors[])
|
|
+static int validate_mls_range(mls_range_t *range, validate_t *sens, validate_t *cats)
|
|
+{
|
|
+ if (validate_mls_level(&range->level[0], sens, cats))
|
|
+ goto bad;
|
|
+ if (validate_mls_level(&range->level[1], sens, cats))
|
|
+ goto bad;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+ bad:
|
|
+ return -1;
|
|
+}
|
|
+
|
|
+static int validate_user_datum(sepol_handle_t *handle, user_datum_t *user, validate_t flavors[], int mls)
|
|
{
|
|
if (validate_value(user->s.value, &flavors[SYM_USERS]))
|
|
goto bad;
|
|
@@ -304,6 +317,10 @@ static int validate_user_datum(sepol_handle_t *handle, user_datum_t *user, valid
|
|
goto bad;
|
|
if (validate_mls_semantic_level(&user->dfltlevel, &flavors[SYM_LEVELS], &flavors[SYM_CATS]))
|
|
goto bad;
|
|
+ if (mls && validate_mls_range(&user->exp_range, &flavors[SYM_LEVELS], &flavors[SYM_CATS]))
|
|
+ goto bad;
|
|
+ if (mls && validate_mls_level(&user->exp_dfltlevel, &flavors[SYM_LEVELS], &flavors[SYM_CATS]))
|
|
+ goto bad;
|
|
if (user->bounds && validate_value(user->bounds, &flavors[SYM_USERS]))
|
|
goto bad;
|
|
|
|
@@ -364,7 +381,7 @@ static int validate_datum_arrays(sepol_handle_t *handle, policydb_t *p, validate
|
|
if (p->user_val_to_struct[i]) {
|
|
if (ebitmap_get_bit(&flavors[SYM_USERS].gaps, i))
|
|
goto bad;
|
|
- if (validate_user_datum(handle, p->user_val_to_struct[i], flavors))
|
|
+ if (validate_user_datum(handle, p->user_val_to_struct[i], flavors, p->mls))
|
|
goto bad;
|
|
} else {
|
|
if (!ebitmap_get_bit(&flavors[SYM_USERS].gaps, i))
|
|
--
|
|
2.33.0
|