diff --git a/tests/diff.py b/tests/diff.py index f418700..7c38efd 100644 --- a/tests/diff.py +++ b/tests/diff.py @@ -1616,3 +1616,349 @@ class PolicyDifferenceTestNoDiff(unittest.TestCase): def test_modified_properties(self): """NoDiff: no modified properties.""" self.assertFalse(self.diff.modified_properties) + + +class PolicyDifferenceTestMLStoStandard(unittest.TestCase): + + """ + Policy difference test between MLS and standard (non-MLS) policy. + + The left policy is an MLS policy. The right policy is identical to the + left policy, except with MLS disabled. + """ + + @classmethod + def setUpClass(cls): + cls.diff = PolicyDifference(SELinuxPolicy("tests/diff_left.conf"), + SELinuxPolicy("tests/diff_left_standard.conf")) + + def test_added_types(self): + """MLSvsStandardDiff: no added types""" + self.assertFalse(self.diff.added_types) + + def test_removed_types(self): + """MLSvsStandardDiff: no removed types""" + self.assertFalse(self.diff.removed_types) + + def test_modified_types(self): + """MLSvsStandardDiff: no modified types""" + self.assertFalse(self.diff.modified_types) + + def test_added_roles(self): + """MLSvsStandardDiff: no added roles.""" + self.assertFalse(self.diff.added_roles) + + def test_removed_roles(self): + """MLSvsStandardDiff: no removed roles.""" + self.assertFalse(self.diff.removed_roles) + + def test_modified_roles(self): + """MLSvsStandardDiff: no modified roles.""" + self.assertFalse(self.diff.modified_roles) + + def test_added_commons(self): + """MLSvsStandardDiff: no added commons.""" + self.assertFalse(self.diff.added_commons) + + def test_removed_commons(self): + """MLSvsStandardDiff: no removed commons.""" + self.assertFalse(self.diff.removed_commons) + + def test_modified_commons(self): + """MLSvsStandardDiff: no modified commons.""" + self.assertFalse(self.diff.modified_commons) + + def test_added_classes(self): + """MLSvsStandardDiff: no added classes.""" + self.assertFalse(self.diff.added_classes) + + def test_removed_classes(self): + """MLSvsStandardDiff: no removed classes.""" + self.assertFalse(self.diff.removed_classes) + + def test_modified_classes(self): + """MLSvsStandardDiff: no modified classes.""" + self.assertFalse(self.diff.modified_classes) + + def test_added_allows(self): + """MLSvsStandardDiff: no added allow rules.""" + self.assertFalse(self.diff.added_allows) + + def test_removed_allows(self): + """MLSvsStandardDiff: no removed allow rules.""" + self.assertFalse(self.diff.removed_allows) + + def test_modified_allows(self): + """MLSvsStandardDiff: no modified allow rules.""" + self.assertFalse(self.diff.modified_allows) + + def test_added_auditallows(self): + """MLSvsStandardDiff: no added auditallow rules.""" + self.assertFalse(self.diff.added_auditallows) + + def test_removed_auditallows(self): + """MLSvsStandardDiff: no removed auditallow rules.""" + self.assertFalse(self.diff.removed_auditallows) + + def test_modified_auditallows(self): + """MLSvsStandardDiff: no modified auditallow rules.""" + self.assertFalse(self.diff.modified_auditallows) + + def test_added_neverallows(self): + """MLSvsStandardDiff: no added neverallow rules.""" + self.assertFalse(self.diff.added_neverallows) + + def test_removed_neverallows(self): + """MLSvsStandardDiff: no removed neverallow rules.""" + self.assertFalse(self.diff.removed_neverallows) + + def test_modified_neverallows(self): + """MLSvsStandardDiff: no modified neverallow rules.""" + self.assertFalse(self.diff.modified_neverallows) + + def test_added_dontaudits(self): + """MLSvsStandardDiff: no added dontaudit rules.""" + self.assertFalse(self.diff.added_dontaudits) + + def test_removed_dontaudits(self): + """MLSvsStandardDiff: no removed dontaudit rules.""" + self.assertFalse(self.diff.removed_dontaudits) + + def test_modified_dontaudits(self): + """MLSvsStandardDiff: no modified dontaudit rules.""" + self.assertFalse(self.diff.modified_dontaudits) + + def test_added_type_transitions(self): + """MLSvsStandardDiff: no added type_transition rules.""" + self.assertFalse(self.diff.added_type_transitions) + + def test_removed_type_transitions(self): + """MLSvsStandardDiff: no removed type_transition rules.""" + self.assertFalse(self.diff.removed_type_transitions) + + def test_modified_type_transitions(self): + """MLSvsStandardDiff: no modified type_transition rules.""" + self.assertFalse(self.diff.modified_type_transitions) + + def test_added_type_changes(self): + """MLSvsStandardDiff: no added type_change rules.""" + self.assertFalse(self.diff.added_type_changes) + + def test_removed_type_changes(self): + """MLSvsStandardDiff: no removed type_change rules.""" + self.assertFalse(self.diff.removed_type_changes) + + def test_modified_type_changes(self): + """MLSvsStandardDiff: no modified type_change rules.""" + self.assertFalse(self.diff.modified_type_changes) + + def test_added_type_members(self): + """MLSvsStandardDiff: no added type_member rules.""" + self.assertFalse(self.diff.added_type_members) + + def test_removed_type_members(self): + """MLSvsStandardDiff: no removed type_member rules.""" + self.assertFalse(self.diff.removed_type_members) + + def test_modified_type_members(self): + """MLSvsStandardDiff: no modified type_member rules.""" + self.assertFalse(self.diff.modified_type_members) + + def test_added_range_transitions(self): + """MLSvsStandardDiff: no added range_transition rules.""" + self.assertFalse(self.diff.added_range_transitions) + + def test_removed_range_transitions(self): + """MLSvsStandardDiff: all range_transition rules removed.""" + self.assertEqual(self.diff.left_policy.range_transition_count, + len(self.diff.removed_range_transitions)) + + def test_modified_range_transitions(self): + """MLSvsStandardDiff: no modified range_transition rules.""" + self.assertFalse(self.diff.modified_range_transitions) + + def test_added_role_allows(self): + """MLSvsStandardDiff: no added role_allow rules.""" + self.assertFalse(self.diff.added_role_allows) + + def test_removed_role_allows(self): + """MLSvsStandardDiff: no removed role_allow rules.""" + self.assertFalse(self.diff.removed_role_allows) + + def test_modified_role_allows(self): + """MLSvsStandardDiff: no modified role_allow rules.""" + self.assertFalse(self.diff.modified_role_allows) + + def test_added_role_transitions(self): + """MLSvsStandardDiff: no added role_transition rules.""" + self.assertFalse(self.diff.added_role_transitions) + + def test_removed_role_transitions(self): + """MLSvsStandardDiff: no removed role_transition rules.""" + self.assertFalse(self.diff.removed_role_transitions) + + def test_modified_role_transitions(self): + """MLSvsStandardDiff: no modified role_transition rules.""" + self.assertFalse(self.diff.modified_role_transitions) + + def test_added_users(self): + """MLSvsStandardDiff: no added users.""" + self.assertFalse(self.diff.added_users) + + def test_removed_users(self): + """MLSvsStandardDiff: no removed users.""" + self.assertFalse(self.diff.removed_users) + + def test_modified_users(self): + """MLSvsStandardDiff: all users modified.""" + self.assertEqual(self.diff.left_policy.user_count, len(self.diff.modified_users)) + + def test_added_type_attributes(self): + """MLSvsStandardDiff: no added type attribute.""" + self.assertFalse(self.diff.added_type_attributes) + + def test_removed_type_attributes(self): + """MLSvsStandardDiff: no removed type attributes.""" + self.assertFalse(self.diff.removed_type_attributes) + + def test_modified_type_attributes(self): + """MLSvsStandardDiff: no modified type attributes.""" + self.assertFalse(self.diff.modified_type_attributes) + + def test_added_booleans(self): + """MLSvsStandardDiff: no added booleans.""" + self.assertFalse(self.diff.added_booleans) + + def test_removed_booleans(self): + """MLSvsStandardDiff: no removed booleans.""" + self.assertFalse(self.diff.removed_booleans) + + def test_modified_booleans(self): + """MLSvsStandardDiff: no modified booleans.""" + self.assertFalse(self.diff.modified_booleans) + + def test_added_categories(self): + """MLSvsStandardDiff: no added categories.""" + self.assertFalse(self.diff.added_categories) + + def test_removed_categories(self): + """MLSvsStandardDiff: all categories removed.""" + self.assertEqual(self.diff.left_policy.category_count, len(self.diff.removed_categories)) + + def test_modified_categories(self): + """MLSvsStandardDiff: no modified categories.""" + self.assertFalse(self.diff.modified_categories) + + def test_added_sensitivities(self): + """MLSvsStandardDiff: no added sensitivities.""" + self.assertFalse(self.diff.added_sensitivities) + + def test_removed_sensitivities(self): + """MLSvsStandardDiff: all sensitivities removed.""" + self.assertEqual(self.diff.left_policy.level_count, len(self.diff.removed_sensitivities)) + + def test_modified_sensitivities(self): + """MLSvsStandardDiff: no modified sensitivities.""" + self.assertFalse(self.diff.modified_sensitivities) + + def test_added_initialsids(self): + """MLSvsStandardDiff: no added initialsids.""" + self.assertFalse(self.diff.added_initialsids) + + def test_removed_initialsids(self): + """MLSvsStandardDiff: no removed initialsids.""" + self.assertFalse(self.diff.removed_initialsids) + + def test_modified_initialsids(self): + """MLSvsStandardDiff: all initialsids modified.""" + self.assertEqual(self.diff.left_policy.initialsids_count, + len(self.diff.modified_initialsids)) + + def test_added_fs_uses(self): + """MLSvsStandardDiff: no added fs_uses.""" + self.assertFalse(self.diff.added_fs_uses) + + def test_removed_fs_uses(self): + """MLSvsStandardDiff: no removed fs_uses.""" + self.assertFalse(self.diff.removed_fs_uses) + + def test_modified_fs_uses(self): + """MLSvsStandardDiff: all fs_uses modified.""" + self.assertEqual(self.diff.left_policy.fs_use_count, len(self.diff.modified_fs_uses)) + + def test_added_genfscons(self): + """MLSvsStandardDiff: no added genfscons.""" + self.assertFalse(self.diff.added_genfscons) + + def test_removed_genfscons(self): + """MLSvsStandardDiff: no removed genfscons.""" + self.assertFalse(self.diff.removed_genfscons) + + def test_modified_genfscons(self): + """MLSvsStandardDiff: all genfscons modified.""" + self.assertEqual(self.diff.left_policy.genfscon_count, len(self.diff.modified_genfscons)) + + def test_added_levels(self): + """MLSvsStandardDiff: no added levels.""" + self.assertFalse(self.diff.added_levels) + + def test_removed_levels(self): + """MLSvsStandardDiff: all levels removed.""" + self.assertEqual(self.diff.left_policy.level_count, len(self.diff.removed_levels)) + + def test_modified_levels(self): + """MLSvsStandardDiff: no modified levels.""" + self.assertFalse(self.diff.modified_levels) + + def test_added_netifcons(self): + """MLSvsStandardDiff: no added netifcons.""" + self.assertFalse(self.diff.added_netifcons) + + def test_removed_netifcons(self): + """MLSvsStandardDiff: no removed netifcons.""" + self.assertFalse(self.diff.removed_netifcons) + + def test_modified_netifcons(self): + """MLSvsStandardDiff: all netifcons modified.""" + self.assertEqual(self.diff.left_policy.netifcon_count, len(self.diff.modified_netifcons)) + + def test_added_nodecons(self): + """MLSvsStandardDiff: no added nodecons.""" + self.assertFalse(self.diff.added_nodecons) + + def test_removed_nodecons(self): + """MLSvsStandardDiff: no removed nodecons.""" + self.assertFalse(self.diff.removed_nodecons) + + def test_modified_nodecons(self): + """MLSvsStandardDiff: all nodecons modified.""" + self.assertEqual(self.diff.left_policy.nodecon_count, len(self.diff.modified_nodecons)) + + def test_added_polcaps(self): + """MLSvsStandardDiff: no added polcaps.""" + self.assertFalse(self.diff.added_polcaps) + + def test_removed_polcaps(self): + """MLSvsStandardDiff: no removed polcaps.""" + self.assertFalse(self.diff.removed_polcaps) + + def test_added_portcons(self): + """MLSvsStandardDiff: no added portcons.""" + self.assertFalse(self.diff.added_portcons) + + def test_removed_portcons(self): + """MLSvsStandardDiff: no removed portcons.""" + self.assertFalse(self.diff.removed_portcons) + + def test_modified_portcons(self): + """MLSvsStandardDiff: all portcons modified.""" + self.assertEqual(self.diff.left_policy.portcon_count, len(self.diff.modified_portcons)) + + def test_modified_properties(self): + """MLSvsStandardDiff: MLS property modified only.""" + self.assertEqual(1, len(self.diff.modified_properties)) + + name, added, removed = self.diff.modified_properties[0] + self.assertEqual("MLS", name) + self.assertIs(False, added) + self.assertIs(True, removed) diff --git a/tests/diff_left_standard.conf b/tests/diff_left_standard.conf new file mode 100644 index 0000000..953ea38 --- /dev/null +++ b/tests/diff_left_standard.conf @@ -0,0 +1,620 @@ +class infoflow +class infoflow2 +class infoflow3 +class infoflow4 +class infoflow5 +class infoflow6 +class infoflow7 +class removed_class +class modified_add_perm +class modified_remove_perm +class modified_change_common + +sid kernel +sid security +sid matched_sid +sid removed_sid +sid modified_sid + +common infoflow +{ + low_w + med_w + hi_w + low_r + med_r + hi_r +} + +common removed_common +{ + old_com +} + +common modified_remove_perm +{ + same_perm + removed_perm +} + +common modified_add_perm +{ + matched_perm +} + +class infoflow +inherits infoflow + +class infoflow2 +inherits infoflow +{ + super_w + super_r +} + +class infoflow3 +{ + null +} + +class infoflow4 +inherits infoflow + +class infoflow5 +inherits infoflow + +class infoflow6 +inherits infoflow + +class infoflow7 +inherits infoflow +{ + super_w + super_r + super_none + super_both + super_unmapped +} + +class removed_class +{ + null_perm +} + +class modified_add_perm +{ + same_perm +} + +class modified_remove_perm +{ + same_perm + removed_perm +} + +class modified_change_common +inherits removed_common + +attribute mls_exempt; +attribute an_attr; +attribute removed_attr; + +type system; +role system; +role system types system; + +################################################################################ +# Type enforcement declarations and rules + +type removed_type; + +type modified_remove_attr, an_attr; + +type modified_remove_alias alias an_alias; + +type modified_remove_permissive; +permissive modified_remove_permissive; + +type modified_add_attr; + +type modified_add_alias; + +type modified_add_permissive; + +role removed_role; + +role modified_add_type; + +role modified_remove_type; +role modified_remove_type types { system }; + +# booleans +bool same_bool true; +bool removed_bool true; +bool modified_bool false; + +# Allow rule differences +type matched_source; +type matched_target; +allow matched_source matched_target:infoflow hi_w; + +type removed_rule_source; +type removed_rule_target; +allow removed_rule_source removed_rule_target:infoflow hi_r; + +type added_rule_source; +type added_rule_target; + +type modified_rule_add_perms; +allow modified_rule_add_perms self:infoflow hi_r; + +type modified_rule_remove_perms; +allow modified_rule_remove_perms self:infoflow { low_r low_w }; + +type modified_rule_add_remove_perms; +allow modified_rule_add_remove_perms self:infoflow2 { low_w super_w }; + +allow removed_type self:infoflow3 null; + +type move_to_bool; +bool move_to_bool_b false; +allow move_to_bool self:infoflow4 hi_w; + +type move_from_bool; +bool move_from_bool_b false; +if (move_from_bool_b) { +allow move_from_bool self:infoflow4 hi_r; +} + +type switch_block; +bool switch_block_b false; +if (switch_block_b) { +allow system switch_block:infoflow5 hi_r; +allow system switch_block:infoflow6 hi_r; +} else { +allow system switch_block:infoflow7 hi_r; +} + +attribute match_rule_by_attr; +type match_rule_by_attr_A_t, match_rule_by_attr; +type match_rule_by_attr_B_t, match_rule_by_attr; +allow match_rule_by_attr self:infoflow2 super_w; + +attribute unioned_perm_via_attr; +type unioned_perm_via_attr_A_t, unioned_perm_via_attr; +type unioned_perm_via_attr_B_t, unioned_perm_via_attr; +allow unioned_perm_via_attr self:infoflow2 super_w; +allow unioned_perm_via_attr_A_t self:infoflow2 super_r; +allow unioned_perm_via_attr_B_t self:infoflow2 hi_w; + +# Auditallow rule differences +type aa_matched_source; +type aa_matched_target; +auditallow aa_matched_source aa_matched_target:infoflow hi_w; + +type aa_removed_rule_source; +type aa_removed_rule_target; +auditallow aa_removed_rule_source aa_removed_rule_target:infoflow hi_r; + +type aa_added_rule_source; +type aa_added_rule_target; + +type aa_modified_rule_add_perms; +auditallow aa_modified_rule_add_perms self:infoflow hi_r; + +type aa_modified_rule_remove_perms; +auditallow aa_modified_rule_remove_perms self:infoflow { low_r low_w }; + +type aa_modified_rule_add_remove_perms; +auditallow aa_modified_rule_add_remove_perms self:infoflow2 { low_w super_w }; + +auditallow removed_type self:infoflow7 super_unmapped; + +type aa_move_to_bool; +bool aa_move_to_bool_b false; +auditallow aa_move_to_bool self:infoflow4 hi_w; + +type aa_move_from_bool; +bool aa_move_from_bool_b false; +if (aa_move_from_bool_b) { +auditallow aa_move_from_bool self:infoflow4 hi_r; +} + +type aa_switch_block; +bool aa_switch_block_b false; +if (aa_switch_block_b) { +auditallow system aa_switch_block:infoflow5 hi_r; +auditallow system aa_switch_block:infoflow6 hi_r; +} else { +auditallow system aa_switch_block:infoflow7 hi_r; +} + +attribute aa_match_rule_by_attr; +type aa_match_rule_by_attr_A_t, aa_match_rule_by_attr; +type aa_match_rule_by_attr_B_t, aa_match_rule_by_attr; +auditallow aa_match_rule_by_attr self:infoflow2 super_w; + +attribute aa_unioned_perm_via_attr; +type aa_unioned_perm_via_attr_A_t, aa_unioned_perm_via_attr; +type aa_unioned_perm_via_attr_B_t, aa_unioned_perm_via_attr; +auditallow aa_unioned_perm_via_attr self:infoflow2 super_w; +auditallow aa_unioned_perm_via_attr_A_t self:infoflow2 super_r; +auditallow aa_unioned_perm_via_attr_B_t self:infoflow2 hi_w; + +# Dontaudit rule differences +type da_matched_source; +type da_matched_target; +dontaudit da_matched_source da_matched_target:infoflow hi_w; + +type da_removed_rule_source; +type da_removed_rule_target; +dontaudit da_removed_rule_source da_removed_rule_target:infoflow hi_r; + +type da_added_rule_source; +type da_added_rule_target; + +type da_modified_rule_add_perms; +dontaudit da_modified_rule_add_perms self:infoflow hi_r; + +type da_modified_rule_remove_perms; +dontaudit da_modified_rule_remove_perms self:infoflow { low_r low_w }; + +type da_modified_rule_add_remove_perms; +dontaudit da_modified_rule_add_remove_perms self:infoflow2 { low_w super_w }; + +dontaudit removed_type self:infoflow7 super_both; + +type da_move_to_bool; +bool da_move_to_bool_b false; +dontaudit da_move_to_bool self:infoflow4 hi_w; + +type da_move_from_bool; +bool da_move_from_bool_b false; +if (da_move_from_bool_b) { +dontaudit da_move_from_bool self:infoflow4 hi_r; +} + +type da_switch_block; +bool da_switch_block_b false; +if (da_switch_block_b) { +dontaudit system da_switch_block:infoflow5 hi_r; +dontaudit system da_switch_block:infoflow6 hi_r; +} else { +dontaudit system da_switch_block:infoflow7 hi_r; +} + +attribute da_match_rule_by_attr; +type da_match_rule_by_attr_A_t, da_match_rule_by_attr; +type da_match_rule_by_attr_B_t, da_match_rule_by_attr; +dontaudit da_match_rule_by_attr self:infoflow2 super_w; + +attribute da_unioned_perm_via_attr; +type da_unioned_perm_via_attr_A_t, da_unioned_perm_via_attr; +type da_unioned_perm_via_attr_B_t, da_unioned_perm_via_attr; +dontaudit da_unioned_perm_via_attr self:infoflow2 super_w; +dontaudit da_unioned_perm_via_attr_A_t self:infoflow2 super_r; +dontaudit da_unioned_perm_via_attr_B_t self:infoflow2 hi_w; + +# Neverallow rule differences +type na_matched_source; +type na_matched_target; +neverallow na_matched_source na_matched_target:infoflow hi_w; + +type na_removed_rule_source; +type na_removed_rule_target; +neverallow na_removed_rule_source na_removed_rule_target:infoflow hi_r; + +type na_added_rule_source; +type na_added_rule_target; + +type na_modified_rule_add_perms; +neverallow na_modified_rule_add_perms self:infoflow hi_r; + +type na_modified_rule_remove_perms; +neverallow na_modified_rule_remove_perms self:infoflow { low_r low_w }; + +type na_modified_rule_add_remove_perms; +neverallow na_modified_rule_add_remove_perms self:infoflow2 { low_w super_w }; + +neverallow removed_type self:removed_class null_perm; + +attribute na_match_rule_by_attr; +type na_match_rule_by_attr_A_t, na_match_rule_by_attr; +type na_match_rule_by_attr_B_t, na_match_rule_by_attr; +neverallow na_match_rule_by_attr self:infoflow2 super_w; + +attribute na_unioned_perm_via_attr; +type na_unioned_perm_via_attr_A_t, na_unioned_perm_via_attr; +type na_unioned_perm_via_attr_B_t, na_unioned_perm_via_attr; +neverallow na_unioned_perm_via_attr self:infoflow2 super_w; +neverallow na_unioned_perm_via_attr_A_t self:infoflow2 super_r; +neverallow na_unioned_perm_via_attr_B_t self:infoflow2 hi_w; + +# type_transition rule differences +type tt_matched_source; +type tt_matched_target; +type_transition tt_matched_source tt_matched_target:infoflow system; + +type tt_removed_rule_source; +type tt_removed_rule_target; +type_transition tt_removed_rule_source tt_removed_rule_target:infoflow system; + +type tt_added_rule_source; +type tt_added_rule_target; + +type tt_old_type; +type tt_new_type; +type_transition tt_matched_source system:infoflow tt_old_type; + +type_transition removed_type system:infoflow4 system; + +type tt_move_to_bool; +bool tt_move_to_bool_b false; +type_transition tt_move_to_bool system:infoflow3 system; + +type tt_move_from_bool; +bool tt_move_from_bool_b false; +if (tt_move_from_bool_b) { +type_transition tt_move_from_bool system:infoflow4 system; +} + +type tt_switch_block; +bool tt_switch_block_b false; +if (tt_switch_block_b) { +type_transition system tt_switch_block:infoflow5 system; +type_transition system tt_switch_block:infoflow6 system; +} else { +type_transition system tt_switch_block:infoflow7 system; +} + +attribute tt_match_rule_by_attr; +type tt_match_rule_by_attr_A_t, tt_match_rule_by_attr; +type tt_match_rule_by_attr_B_t, tt_match_rule_by_attr; +type_transition tt_match_rule_by_attr system:infoflow2 system; + +attribute tt_unioned_perm_via_attr; +type tt_unioned_perm_via_attr_A_t, tt_unioned_perm_via_attr; +type tt_unioned_perm_via_attr_B_t, tt_unioned_perm_via_attr; +type_transition tt_unioned_perm_via_attr system:infoflow2 system; +type_transition tt_unioned_perm_via_attr_A_t system:infoflow2 system; +type_transition tt_unioned_perm_via_attr_B_t system:infoflow2 system; + +# type_change rule differences +type tc_matched_source; +type tc_matched_target; +type_change tc_matched_source tc_matched_target:infoflow system; + +type tc_removed_rule_source; +type tc_removed_rule_target; +type_change tc_removed_rule_source tc_removed_rule_target:infoflow system; + +type tc_added_rule_source; +type tc_added_rule_target; + +type tc_old_type; +type tc_new_type; +type_change tc_matched_source system:infoflow tc_old_type; + +type_change removed_type system:infoflow4 system; + +type tc_move_to_bool; +bool tc_move_to_bool_b false; +type_change tc_move_to_bool system:infoflow3 system; + +type tc_move_from_bool; +bool tc_move_from_bool_b false; +if (tc_move_from_bool_b) { +type_change tc_move_from_bool system:infoflow4 system; +} + +type tc_switch_block; +bool tc_switch_block_b false; +if (tc_switch_block_b) { +type_change system tc_switch_block:infoflow5 system; +type_change system tc_switch_block:infoflow6 system; +} else { +type_change system tc_switch_block:infoflow7 system; +} + +attribute tc_match_rule_by_attr; +type tc_match_rule_by_attr_A_t, tc_match_rule_by_attr; +type tc_match_rule_by_attr_B_t, tc_match_rule_by_attr; +type_change tc_match_rule_by_attr system:infoflow2 system; + +attribute tc_unioned_perm_via_attr; +type tc_unioned_perm_via_attr_A_t, tc_unioned_perm_via_attr; +type tc_unioned_perm_via_attr_B_t, tc_unioned_perm_via_attr; +type_change tc_unioned_perm_via_attr system:infoflow2 system; +type_change tc_unioned_perm_via_attr_A_t system:infoflow2 system; +type_change tc_unioned_perm_via_attr_B_t system:infoflow2 system; + +# type_member rule differences +type tm_matched_source; +type tm_matched_target; +type_member tm_matched_source tm_matched_target:infoflow system; + +type tm_removed_rule_source; +type tm_removed_rule_target; +type_member tm_removed_rule_source tm_removed_rule_target:infoflow system; + +type tm_added_rule_source; +type tm_added_rule_target; + +type tm_old_type; +type tm_new_type; +type_member tm_matched_source system:infoflow tm_old_type; + +type_member removed_type system:infoflow4 system; + +type tm_move_to_bool; +bool tm_move_to_bool_b false; +type_member tm_move_to_bool system:infoflow3 system; + +type tm_move_from_bool; +bool tm_move_from_bool_b false; +if (tm_move_from_bool_b) { +type_member tm_move_from_bool system:infoflow4 system; +} + +type tm_switch_block; +bool tm_switch_block_b false; +if (tm_switch_block_b) { +type_member system tm_switch_block:infoflow5 system; +type_member system tm_switch_block:infoflow6 system; +} else { +type_member system tm_switch_block:infoflow7 system; +} + +attribute tm_match_rule_by_attr; +type tm_match_rule_by_attr_A_t, tm_match_rule_by_attr; +type tm_match_rule_by_attr_B_t, tm_match_rule_by_attr; +type_member tm_match_rule_by_attr system:infoflow2 system; + +attribute tm_unioned_perm_via_attr; +type tm_unioned_perm_via_attr_A_t, tm_unioned_perm_via_attr; +type tm_unioned_perm_via_attr_B_t, tm_unioned_perm_via_attr; +type_member tm_unioned_perm_via_attr system:infoflow2 system; +type_member tm_unioned_perm_via_attr_A_t system:infoflow2 system; +type_member tm_unioned_perm_via_attr_B_t system:infoflow2 system; + +type rt_matched_source; +type rt_matched_target; + +type rt_removed_rule_source; +type rt_removed_rule_target; + +type rt_added_rule_source; +type rt_added_rule_target; + + + +# range transitions cannot be conditional. +#type rt_move_to_bool; +#bool rt_move_to_bool_b false; + +#type rt_move_from_bool; +#bool rt_move_from_bool_b false; +#if (rt_move_from_bool_b) { +#} + +#type rt_switch_block; +#bool rt_switch_block_b false; +#if (rt_switch_block_b) { +#} else { +#} + +attribute rt_match_rule_by_attr; +type rt_match_rule_by_attr_A_t, rt_match_rule_by_attr; +type rt_match_rule_by_attr_B_t, rt_match_rule_by_attr; + +attribute rt_unioned_perm_via_attr; +type rt_unioned_perm_via_attr_A_t, rt_unioned_perm_via_attr; +type rt_unioned_perm_via_attr_B_t, rt_unioned_perm_via_attr; + +# role allow +role matched_source_r; +role matched_target_r; +allow matched_source_r matched_target_r; + +role removed_rule_source_r; +role removed_rule_target_r; +allow removed_rule_source_r removed_rule_target_r; + +role added_rule_source_r; +role added_rule_target_r; + +allow removed_role system; + +# role_transition +role role_tr_matched_source; +type role_tr_matched_target; +role_transition role_tr_matched_source role_tr_matched_target:infoflow system; + +role role_tr_removed_rule_source; +type role_tr_removed_rule_target; +role_transition role_tr_removed_rule_source role_tr_removed_rule_target:infoflow5 system; + +role role_tr_added_rule_source; +type role_tr_added_rule_target; + +role_transition removed_role system:infoflow4 system; + +role role_tr_old_role; +role role_tr_new_role; +role_transition role_tr_matched_source role_tr_matched_target:infoflow3 role_tr_old_role; + +################################################################################ + +# policycaps +policycap open_perms; +policycap network_peer_controls; + +#users +user system roles system; + +user removed_user roles system; + +user modified_add_role roles system; +user modified_remove_role roles { system removed_role }; +user modified_change_level roles system; +user modified_change_range roles system; + +#normal constraints +constrain infoflow hi_w (u1 == u2); + +#isids +sid kernel system:system:system +sid security system:system:system +sid matched_sid system:system:system +sid removed_sid removed_user:system:system +sid modified_sid system:system:system + +#fs_use +fs_use_trans devpts system:object_r:system; +fs_use_xattr ext3 system:object_r:system; +fs_use_task pipefs system:object_r:system; +fs_use_task removed_fsuse system:object_r:system; +fs_use_trans modified_fsuse removed_user:object_r:system; + +#genfscon +genfscon proc / system:object_r:system +genfscon proc /sys system:object_r:system +genfscon selinuxfs / system:object_r:system +genfscon removed_genfs / system:object_r:system +genfscon change_path /old system:object_r:system +genfscon modified_genfs / -s removed_user:object_r:system + +# matched portcons +portcon tcp 80 system:object_r:system +portcon udp 80 system:object_r:system +portcon udp 30-40 system:object_r:system + +# removed portcons +portcon udp 1024 system:object_r:system +portcon tcp 1024-1026 system:object_r:system + +# modified portcons +portcon udp 3024 removed_user:object_r:system +portcon tcp 3024-3026 removed_user:object_r:system + +netifcon eth0 system:object_r:system system:object_r:system +netifcon removed_netif system:object_r:system system:object_r:system +netifcon mod_ctx_netif removed_user:object_r:system system:object_r:system +netifcon mod_pkt_netif system:object_r:system removed_user:object_r:system +netifcon mod_both_netif removed_user:object_r:system removed_user:object_r:system + +# matched nodecons +nodecon 127.0.0.1 255.255.255.255 system:object_r:system +nodecon ::1 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff system:object_r:system + +# removed nodecons +nodecon 127.0.0.2 255.255.255.255 removed_user:object_r:system +nodecon ::2 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff removed_user:object_r:system + +# modified nodecons +nodecon 127.0.0.3 255.255.255.255 modified_change_level:object_r:system +nodecon ::3 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff modified_change_level:object_r:system + +# change netmask (add/remove) +nodecon 127.0.0.5 255.255.255.255 system:object_r:system +nodecon ::5 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff system:object_r:system