diff mbox series

[v3,6/6] libsepol/tests: add cond xperm neverallow tests

Message ID 20241025154824.140073-6-cgoettsche@seltendoof.de (mailing list archive)
State New
Headers show
Series [v3,1/6] libsepol: misc assertion cleanup | expand

Commit Message

Christian Göttsche Oct. 25, 2024, 3:48 p.m. UTC
From: Christian Göttsche <cgzones@googlemail.com>

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

Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
---
v3:
  add patch
---
 libsepol/tests/helpers.c                      |   1 +
 .../policies/test-neverallow/policy_cond.conf | 251 ++++++++++++++++++
 libsepol/tests/test-neverallow.c              |  57 ++++
 3 files changed, 309 insertions(+)
 create mode 100644 libsepol/tests/policies/test-neverallow/policy_cond.conf
diff mbox series

Patch

diff --git a/libsepol/tests/helpers.c b/libsepol/tests/helpers.c
index 1192734b..97ddfe8e 100644
--- a/libsepol/tests/helpers.c
+++ b/libsepol/tests/helpers.c
@@ -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);
diff --git a/libsepol/tests/policies/test-neverallow/policy_cond.conf b/libsepol/tests/policies/test-neverallow/policy_cond.conf
new file mode 100644
index 00000000..c81fc01d
--- /dev/null
+++ b/libsepol/tests/policies/test-neverallow/policy_cond.conf
@@ -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);
diff --git a/libsepol/tests/test-neverallow.c b/libsepol/tests/test-neverallow.c
index 80f91bf5..9c3001c4 100644
--- a/libsepol/tests/test-neverallow.c
+++ b/libsepol/tests/test-neverallow.c
@@ -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;
 }