libsepol/tests: add cond xperm neverallow tests

Add some tests to verify assertion checking works for extended
permissions in conditional policies.

Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
Acked-by: James Carter <jwcart2@gmail.com>
This commit is contained in:
Christian Göttsche 2024-11-11 14:51:07 +01:00 committed by James Carter
parent c8f9dff384
commit 77da320e29
3 changed files with 309 additions and 0 deletions

View File

@ -53,6 +53,7 @@ int test_load_policy(policydb_t * p, int policy_type, int mls, const char *test_
p->policy_type = policy_type;
p->mls = mls;
p->policyvers = MOD_POLICYDB_VERSION_MAX;
if (read_source_policy(p, filename, test_name)) {
fprintf(stderr, "failed to read policy %s\n", filename);

View File

@ -0,0 +1,251 @@
class process
class blk_file
class chr_file
class dir
class fifo_file
class file
class lnk_file
class sock_file
sid kernel
sid security
sid unlabeled
sid file
sid port
sid netif
sid netmsg
sid node
sid devnull
class process { dyntransition transition }
class file { getattr ioctl open read write }
bool boolean1 false;
bool boolean2 true;
ifdef(`enable_mls',`
sensitivity s0;
dominance { s0 }
category c0; category c1; category c2; category c3;
category c4; category c5; category c6; category c7;
category c8; category c9; category c10; category c11;
category c12; category c13; category c14; category c15;
category c16; category c17; category c18; category c19;
category c20; category c21; category c22; category c23;
level s0:c0.c23;
mlsconstrain file { write } ( h1 dom h2 );
')
########################################
#
# Test start
#
########################################
## Test 1 (basic - fail)
type test1_t;
if boolean1 {
allow test1_t self : file read;
}
neverallow test1_t * : file *;
## Test 2 (basic - fail)
attribute test2_a;
type test2_1_t, test2_a;
type test2_2_t;
if !boolean1 {
allow test2_1_t test2_1_t : file write;
allow test2_2_t test2_2_t : file write;
}
neverallow test2_a * : file *;
## Test 3 (xperm - no xperm in one branch - fail)
type test3_t;
if boolean1 {
allow test3_t self : file ioctl;
} else {
allowxperm test3_t self : file ioctl 0x1;
}
neverallowxperm test3_t self : file ioctl 0x4;
## Test 4 (xperm - xperm in neither branch - fail)
type test4_t;
allow test4_t self : file ioctl;
if boolean1 {
allow test4_t self : file read;
} else {
allow test4_t self : file write;
}
neverallowxperm test4_t self : file ioctl 0x4;
## Test 5 (xperm - xperm in both branches - no failure)
type test5_t;
allow test5_t self : file ioctl;
if boolean1 {
allowxperm test5_t self : file ioctl 0x1;
} else {
allowxperm test5_t self : file ioctl 0x2;
}
neverallowxperm test5_t self : file ioctl 0x4; # nofail
## Test 6 (xperm - failure in one branch - fail)
type test6_t;
if boolean1 {
allow test6_t self : file ioctl;
allowxperm test6_t self : file ioctl 0x1;
} else {
allow test6_t self : file write;
}
neverallowxperm test6_t self : file ioctl 0x1;
## Test 7 (xperm - failure in both branches - fail)
type test7_t;
if boolean1 {
allow test7_t self : file ioctl;
allowxperm test7_t self : file ioctl 0x1;
} else {
allow test7_t self : file ioctl;
allowxperm test7_t self : file ioctl 0x2;
}
neverallowxperm test7_t self : file ioctl { 0x1-0x2 };
## Test 8 (xperm - different xperm in both branches - no failure)
type test8_t;
allow test8_t self : file ioctl;
if boolean1 {
allowxperm test8_t self : file ioctl 0x1;
} else {
allowxperm test8_t self : file ioctl 0x2;
}
neverallowxperm test8_t self : file ioctl 0x3; # nofail
## Test 9 (xperm - rules split into two booleans - no failure)
type test9_t;
allow test9_t self : file ioctl;
if boolean1 {
allowxperm test9_t self : file ioctl 0x1;
}
if !boolean2 {
allowxperm test9_t self : file ioctl 0x1;
}
neverallowxperm test9_t self : file ioctl 0x4;
## Test 10 (xperm - valid usage in one branch - no failure)
type test10_t;
if boolean1 {
allow test10_t self : file ioctl;
allowxperm test10_t self : file ioctl 0x1;
} else {
allow test10_t self : file write;
}
neverallowxperm test10_t self : file ioctl 0x2; # nofail
## Test 11 (xperm - valid usage in both branches - no failure)
type test11_t;
if boolean1 {
allow test11_t self : file ioctl;
allowxperm test11_t self : file ioctl 0x1;
} else {
allow test11_t self : file ioctl;
allowxperm test11_t self : file ioctl 0x2;
}
neverallowxperm test11_t self : file ioctl 0x3; # nofail
## Test 12 (xperm - base allow in one branch - fail)
type test12_t;
if boolean1 {
allow test12_t self : file ioctl;
} else {
allow test12_t self : file write;
}
neverallowxperm test12_t self : file ioctl 0x1;
## Test 13 (xperm - invalid second branch - fail)
type test13_t;
allow test13_t self : file ioctl;
if boolean1 {
allow test13_t self : file ioctl;
allowxperm test13_t self : file ioctl 0x1;
} else {
allow test13_t self : file write;
}
neverallowxperm test13_t self : file ioctl 0x1;
## Test 14 (xperm - invalid second branch - fail)
type test14_t;
allow test14_t self : file ioctl;
if boolean1 {
allow test14_t self : file ioctl;
allowxperm test14_t self : file ioctl 0x1;
} else {
allow test14_t self : file write;
}
neverallowxperm test14_t self : file ioctl 0x2;
## Test 15 (xperm - base uncond in one branch - fail)
type test15_t;
allow test15_t self : file ioctl;
allowxperm test15_t self : file ioctl 0x1;
if boolean1 {
allow test15_t self : file ioctl;
} else {
allow test15_t self : file write;
}
neverallowxperm test15_t self : file ioctl 0x2;
########################################
#
# Test End
#
########################################
type sys_isid;
role sys_role;
role sys_role types sys_isid;
gen_user(sys_user,, sys_role, s0, s0 - s0:c0.c23)
sid kernel gen_context(sys_user:sys_role:sys_isid, s0)
sid security gen_context(sys_user:sys_role:sys_isid, s0)
sid unlabeled gen_context(sys_user:sys_role:sys_isid, s0)
sid file gen_context(sys_user:sys_role:sys_isid, s0)
sid port gen_context(sys_user:sys_role:sys_isid, s0)
sid netif gen_context(sys_user:sys_role:sys_isid, s0)
sid netmsg gen_context(sys_user:sys_role:sys_isid, s0)
sid node gen_context(sys_user:sys_role:sys_isid, s0)
sid devnull gen_context(sys_user:sys_role:sys_isid, s0)
fs_use_trans devpts gen_context(sys_user:sys_role:sys_isid, s0);
fs_use_trans devtmpfs gen_context(sys_user:sys_role:sys_isid, s0);

View File

@ -293,6 +293,58 @@ static void test_neverallow_not_self(void)
policydb_destroy(&base_expanded);
}
static void test_neverallow_cond(void)
{
policydb_t basemod, base_expanded;
sepol_handle_t *handle;
static const char *const expected_messages[] = {
"16 neverallow failures occurred",
"neverallow on line 58 of policies/test-neverallow/policy_cond.conf.std (or line 58 of policies/test-neverallow/policy_cond.conf.std) violated by allow test1_t test1_t:file { read };",
"neverallow on line 70 of policies/test-neverallow/policy_cond.conf.std (or line 70 of policies/test-neverallow/policy_cond.conf.std) violated by allow test2_1_t test2_1_t:file { write };",
"neverallowxperm on line 81 of policies/test-neverallow/policy_cond.conf.std (or line 81 of policies/test-neverallow/policy_cond.conf.std) violated by\n allow test3_t test3_t:file { ioctl };",
"neverallowxperm on line 93 of policies/test-neverallow/policy_cond.conf.std (or line 93 of policies/test-neverallow/policy_cond.conf.std) violated by\n allow test4_t test4_t:file { ioctl };",
"neverallowxperm on line 117 of policies/test-neverallow/policy_cond.conf.std (or line 117 of policies/test-neverallow/policy_cond.conf.std) violated by\n allowxperm test6_t test6_t:file ioctl { 0x1 };",
"neverallowxperm on line 130 of policies/test-neverallow/policy_cond.conf.std (or line 130 of policies/test-neverallow/policy_cond.conf.std) violated by\n allowxperm test7_t test7_t:file ioctl { 0x2 };",
"neverallowxperm on line 130 of policies/test-neverallow/policy_cond.conf.std (or line 130 of policies/test-neverallow/policy_cond.conf.std) violated by\n allowxperm test7_t test7_t:file ioctl { 0x1 };",
"neverallowxperm on line 130 of policies/test-neverallow/policy_cond.conf.std (or line 130 of policies/test-neverallow/policy_cond.conf.std) violated by\n allowxperm test7_t test7_t:file ioctl { 0x2 };",
"neverallowxperm on line 130 of policies/test-neverallow/policy_cond.conf.std (or line 130 of policies/test-neverallow/policy_cond.conf.std) violated by\n allowxperm test7_t test7_t:file ioctl { 0x1 };",
"neverallowxperm on line 155 of policies/test-neverallow/policy_cond.conf.std (or line 155 of policies/test-neverallow/policy_cond.conf.std) violated by\n allow test9_t test9_t:file { ioctl };",
"neverallowxperm on line 191 of policies/test-neverallow/policy_cond.conf.std (or line 191 of policies/test-neverallow/policy_cond.conf.std) violated by\n allow test12_t test12_t:file { ioctl };",
"neverallowxperm on line 204 of policies/test-neverallow/policy_cond.conf.std (or line 204 of policies/test-neverallow/policy_cond.conf.std) violated by\n allowxperm test13_t test13_t:file ioctl { 0x1 };",
"neverallowxperm on line 204 of policies/test-neverallow/policy_cond.conf.std (or line 204 of policies/test-neverallow/policy_cond.conf.std) violated by\n allow test13_t test13_t:file { ioctl };",
"neverallowxperm on line 204 of policies/test-neverallow/policy_cond.conf.std (or line 204 of policies/test-neverallow/policy_cond.conf.std) violated by\n allowxperm test13_t test13_t:file ioctl { 0x1 };",
"neverallowxperm on line 217 of policies/test-neverallow/policy_cond.conf.std (or line 217 of policies/test-neverallow/policy_cond.conf.std) violated by\n allow test14_t test14_t:file { ioctl };",
"neverallowxperm on line 230 of policies/test-neverallow/policy_cond.conf.std (or line 230 of policies/test-neverallow/policy_cond.conf.std) violated by\n allow test15_t test15_t:file { ioctl };",
};
if (policydb_init(&base_expanded))
CU_FAIL_FATAL("Failed to initialize policy");
if (test_load_policy(&basemod, POLICY_BASE, mls, "test-neverallow", "policy_cond.conf"))
CU_FAIL_FATAL("Failed to load policy");
if (link_modules(NULL, &basemod, NULL, 0, 0))
CU_FAIL_FATAL("Failed to link base module");
if (expand_module(NULL, &basemod, &base_expanded, 0, 0))
CU_FAIL_FATAL("Failed to expand policy");
if ((handle = sepol_handle_create()) == NULL)
CU_FAIL_FATAL("Failed to initialize handle");
sepol_msg_set_callback(handle, msg_handler, NULL);
if (check_assertions(handle, &base_expanded, base_expanded.global->branch_list->avrules) != -1)
CU_FAIL("Assertions did not trigger");
messages_check(ARRAY_SIZE(expected_messages), expected_messages);
sepol_handle_destroy(handle);
messages_clean();
policydb_destroy(&basemod);
policydb_destroy(&base_expanded);
}
int neverallow_add_tests(CU_pSuite suite)
{
/*
@ -317,5 +369,10 @@ int neverallow_add_tests(CU_pSuite suite)
return CU_get_error();
}
if (NULL == CU_add_test(suite, "neverallow_cond", test_neverallow_cond)) {
CU_cleanup_registry();
return CU_get_error();
}
return 0;
}