PolicyDifference: implement TE rule difference

Closes #43
This commit is contained in:
Chris PeBenito 2016-01-02 18:17:39 -05:00
parent c1ebfeb3e7
commit c913989f8c
6 changed files with 1740 additions and 2 deletions

View File

@ -19,6 +19,7 @@
from .commons import CommonDifference from .commons import CommonDifference
from .objclass import ObjClassDifference from .objclass import ObjClassDifference
from .roles import RolesDifference from .roles import RolesDifference
from .terules import TERulesDifference
from .types import TypesDifference from .types import TypesDifference
__all__ = ['PolicyDifference'] __all__ = ['PolicyDifference']
@ -27,6 +28,7 @@ __all__ = ['PolicyDifference']
class PolicyDifference(CommonDifference, class PolicyDifference(CommonDifference,
ObjClassDifference, ObjClassDifference,
RolesDifference, RolesDifference,
TERulesDifference,
TypesDifference): TypesDifference):
""" """

432
setools/diff/terules.py Normal file
View File

@ -0,0 +1,432 @@
# Copyright 2015, Tresys Technology, LLC
#
# This file is part of SETools.
#
# SETools is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as
# published by the Free Software Foundation, either version 2.1 of
# the License, or (at your option) any later version.
#
# SETools is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with SETools. If not, see
# <http://www.gnu.org/licenses/>.
#
from collections import namedtuple
from ..policyrep.exception import RuleNotConditional, RuleUseError, TERuleNoFilename
from .conditional import ConditionalExprWrapper
from .descriptors import DiffResultDescriptor
from .difference import Difference, SymbolWrapper
modified_avrule_record = namedtuple("modified_avrule", ["rule",
"added_perms",
"removed_perms",
"matched_perms"])
modified_terule_record = namedtuple("modified_terule", ["rule", "added_default", "removed_default"])
class TERulesDifference(Difference):
"""
Determine the difference in type enforcement rules
between two policies.
"""
added_allows = DiffResultDescriptor("diff_allows")
removed_allows = DiffResultDescriptor("diff_allows")
modified_allows = DiffResultDescriptor("diff_allows")
added_auditallows = DiffResultDescriptor("diff_auditallows")
removed_auditallows = DiffResultDescriptor("diff_auditallows")
modified_auditallows = DiffResultDescriptor("diff_auditallows")
added_neverallows = DiffResultDescriptor("diff_neverallows")
removed_neverallows = DiffResultDescriptor("diff_neverallows")
modified_neverallows = DiffResultDescriptor("diff_neverallows")
added_dontaudits = DiffResultDescriptor("diff_dontaudits")
removed_dontaudits = DiffResultDescriptor("diff_dontaudits")
modified_dontaudits = DiffResultDescriptor("diff_dontaudits")
added_type_transitions = DiffResultDescriptor("diff_type_transitions")
removed_type_transitions = DiffResultDescriptor("diff_type_transitions")
modified_type_transitions = DiffResultDescriptor("diff_type_transitions")
added_type_changes = DiffResultDescriptor("diff_type_changes")
removed_type_changes = DiffResultDescriptor("diff_type_changes")
modified_type_changes = DiffResultDescriptor("diff_type_changes")
added_type_members = DiffResultDescriptor("diff_type_members")
removed_type_members = DiffResultDescriptor("diff_type_members")
modified_type_members = DiffResultDescriptor("diff_type_members")
# Lists of rules for each policy
_left_allows = None
_right_allows = None
_left_auditallows = None
_right_auditallows = None
_left_neverallows = None
_right_neverallows = None
_left_dontaudits = None
_right_dontaudits = None
_left_type_transitions = None
_right_type_transitions = None
_left_type_changes = None
_right_type_changes = None
_left_type_members = None
_right_type_members = None
def diff_allows(self):
"""Generate the difference in allow rules between the policies."""
self.log.info(
"Generating allow differences from {0.left_policy} to {0.right_policy}".format(self))
if self._left_allows is None or self._right_allows is None:
self._create_rule_lists()
self.added_allows, self.removed_allows, self.modified_allows = self._diff_av_rules(
self._expand_generator(self._left_allows, AVRuleWrapper),
self._expand_generator(self._right_allows, AVRuleWrapper))
def diff_auditallows(self):
"""Generate the difference in auditallow rules between the policies."""
self.log.info(
"Generating auditallow differences from {0.left_policy} to {0.right_policy}".
format(self))
if self._left_auditallows is None or self._right_auditallows is None:
self._create_rule_lists()
self.added_auditallows, \
self.removed_auditallows, \
self.modified_auditallows = self._diff_av_rules(
self._expand_generator(self._left_auditallows, AVRuleWrapper),
self._expand_generator(self._right_auditallows, AVRuleWrapper))
def diff_neverallows(self):
"""Generate the difference in neverallow rules between the policies."""
self.log.info(
"Generating neverallow differences from {0.left_policy} to {0.right_policy}".
format(self))
if self._left_neverallows is None or self._right_neverallows is None:
self._create_rule_lists()
self.added_neverallows, \
self.removed_neverallows, \
self.modified_neverallows = self._diff_av_rules(
self._expand_generator(self._left_neverallows, AVRuleWrapper),
self._expand_generator(self._right_neverallows, AVRuleWrapper))
def diff_dontaudits(self):
"""Generate the difference in dontaudit rules between the policies."""
self.log.info(
"Generating dontaudit differences from {0.left_policy} to {0.right_policy}".
format(self))
if self._left_dontaudits is None or self._right_dontaudits is None:
self._create_rule_lists()
self.added_dontaudits, \
self.removed_dontaudits, \
self.modified_dontaudits = self._diff_av_rules(
self._expand_generator(self._left_dontaudits, AVRuleWrapper),
self._expand_generator(self._right_dontaudits, AVRuleWrapper))
def diff_type_transitions(self):
"""Generate the difference in type_transition rules between the policies."""
self.log.info(
"Generating type_transition differences from {0.left_policy} to {0.right_policy}".
format(self))
if self._left_type_transitions is None or self._right_type_transitions is None:
self._create_rule_lists()
self.added_type_transitions, \
self.removed_type_transitions, \
self.modified_type_transitions = self._diff_te_rules(
self._expand_generator(self._left_type_transitions, TERuleWrapper),
self._expand_generator(self._right_type_transitions, TERuleWrapper))
def diff_type_changes(self):
"""Generate the difference in type_change rules between the policies."""
self.log.info(
"Generating type_change differences from {0.left_policy} to {0.right_policy}".
format(self))
if self._left_type_changes is None or self._right_type_changes is None:
self._create_rule_lists()
self.added_type_changes, \
self.removed_type_changes, \
self.modified_type_changes = self._diff_te_rules(
self._expand_generator(self._left_type_changes, TERuleWrapper),
self._expand_generator(self._right_type_changes, TERuleWrapper))
def diff_type_members(self):
"""Generate the difference in type_member rules between the policies."""
self.log.info(
"Generating type_member differences from {0.left_policy} to {0.right_policy}".
format(self))
if self._left_type_members is None or self._right_type_members is None:
self._create_rule_lists()
self.added_type_members, \
self.removed_type_members, \
self.modified_type_members = self._diff_te_rules(
self._expand_generator(self._left_type_members, TERuleWrapper),
self._expand_generator(self._right_type_members, TERuleWrapper))
#
# Internal functions
#
def _create_rule_lists(self):
"""Create rule lists for both policies."""
self._left_allows = []
self._left_auditallows = []
self._left_neverallows = []
self._left_dontaudits = []
self._left_type_transitions = []
self._left_type_changes = []
self._left_type_members = []
for rule in self.left_policy.terules():
# do not expand yet, to keep memory
# use down as long as possible
if rule.ruletype == "allow":
self._left_allows.append(rule)
elif rule.ruletype == "auditallow":
self._left_auditallows.append(rule)
elif rule.ruletype == "neverallow":
self._left_neverallows.append(rule)
elif rule.ruletype == "dontaudit":
self._left_dontaudits.append(rule)
elif rule.ruletype == "type_transition":
self._left_type_transitions.append(rule)
elif rule.ruletype == "type_change":
self._left_type_changes.append(rule)
elif rule.ruletype == "type_member":
self._left_type_members.append(rule)
else:
raise TypeError("Unknown rule type: {0}".format(rule.ruletype))
self._right_allows = []
self._right_auditallows = []
self._right_neverallows = []
self._right_dontaudits = []
self._right_type_transitions = []
self._right_type_changes = []
self._right_type_members = []
for rule in self.right_policy.terules():
# do not expand yet, to keep memory
# use down as long as possible
if rule.ruletype == "allow":
self._right_allows.append(rule)
elif rule.ruletype == "auditallow":
self._right_auditallows.append(rule)
elif rule.ruletype == "neverallow":
self._right_neverallows.append(rule)
elif rule.ruletype == "dontaudit":
self._right_dontaudits.append(rule)
elif rule.ruletype == "type_transition":
self._right_type_transitions.append(rule)
elif rule.ruletype == "type_change":
self._right_type_changes.append(rule)
elif rule.ruletype == "type_member":
self._right_type_members.append(rule)
else:
raise TypeError("Unknown rule type: {0}".format(rule.ruletype))
@staticmethod
def _expand_generator(rule_list, Wrapper):
"""Generator that yields a wrapped, expanded rule list."""
# this is to delay creating any containers
# as long as possible, since rule lists
# are typically massive.
for unexpanded_rule in rule_list:
for expanded_rule in unexpanded_rule.expand():
yield Wrapper(expanded_rule)
def _diff_av_rules(self, left_list, right_list):
"""Common method for comparing access vector rules."""
added, removed, matched = self._set_diff(left_list, right_list)
modified = []
for left_rule, right_rule in matched:
# Criteria for modified rules
# 1. change to permissions
added_perms, removed_perms, matched_perms = self._set_diff(left_rule.perms,
right_rule.perms)
# the final set comprehension is to avoid having lists
# like [("perm1", "perm1"), ("perm2", "perm2")], as the
# matched_perms return from _set_diff is a set of tuples
if added_perms or removed_perms:
modified.append(modified_avrule_record(left_rule,
added_perms,
removed_perms,
set(p[0] for p in matched_perms)))
return added, removed, modified
def _diff_te_rules(self, left_list, right_list):
"""Common method for comparing type_* rules."""
added, removed, matched = self._set_diff(left_list, right_list)
modified = []
for left_rule, right_rule in matched:
# Criteria for modified rules
# 1. change to default type
if str(left_rule.default) != str(right_rule.default):
modified.append(modified_terule_record(left_rule,
right_rule.default,
left_rule.default))
return added, removed, modified
def _reset_diff(self):
"""Reset diff results on policy changes."""
self.log.debug("Resetting TE rule differences")
self.added_allows = None
self.removed_allows = None
self.modified_allows = None
self.added_auditallows = None
self.removed_auditallows = None
self.modified_auditallows = None
self.added_neverallows = None
self.removed_neverallows = None
self.modified_neverallows = None
self.added_dontaudits = None
self.removed_dontaudits = None
self.modified_dontaudits = None
self.added_type_transitions = None
self.removed_type_transitions = None
self.modified_type_transitions = None
self.added_type_changes = None
self.removed_type_changes = None
self.modified_type_changes = None
self.added_type_members = None
self.removed_type_members = None
self.modified_type_members = None
# Sets of rules for each policy
self._left_allows = None
self._right_allows = None
self._left_auditallows = None
self._right_auditallows = None
self._left_neverallows = None
self._right_neverallows = None
self._left_dontaudits = None
self._right_dontaudits = None
self._left_type_transitions = None
self._right_type_transitions = None
self._left_type_changes = None
self._right_type_changes = None
self._left_type_members = None
self._right_type_members = None
class AVRuleWrapper(object):
"""Wrap access vector rules to allow set operations."""
def __init__(self, rule):
self.origin = rule
self.ruletype = rule.ruletype
self.source = SymbolWrapper(rule.source)
self.target = SymbolWrapper(rule.target)
self.tclass = SymbolWrapper(rule.tclass)
self.key = hash(rule)
try:
self.conditional = ConditionalExprWrapper(rule.conditional)
self.conditional_block = rule.conditional_block
except RuleNotConditional:
self.conditional = None
self.conditional_block = None
def __hash__(self):
return self.key
def __lt__(self, other):
return self.origin < other.origin
def __eq__(self, other):
# because TERuleDifference groups rules by ruletype,
# the ruletype always matches.
return self.source == other.source and \
self.target == other.target and \
self.tclass == other.tclass and \
self.conditional == other.conditional and \
self.conditional_block == other.conditional_block
def __ne__(self, other):
return not self == other
class TERuleWrapper(object):
"""Wrap type_* rules to allow set operations."""
def __init__(self, rule):
self.origin = rule
self.ruletype = rule.ruletype
self.source = SymbolWrapper(rule.source)
self.target = SymbolWrapper(rule.target)
self.tclass = SymbolWrapper(rule.tclass)
self.key = hash(rule)
try:
self.conditional = ConditionalExprWrapper(rule.conditional)
self.conditional_block = rule.conditional_block
except RuleNotConditional:
self.conditional = None
self.conditional_block = None
try:
self.filename = rule.filename
except (RuleUseError, TERuleNoFilename):
self.filename = None
def __hash__(self):
return self.key
def __lt__(self, other):
return self.origin < other.origin
def __eq__(self, other):
# because TERuleDifference groups rules by ruletype,
# the ruletype always matches.
return self.source == other.source and \
self.target == other.target and \
self.tclass == other.tclass and \
self.conditional == other.conditional and \
self.conditional_block == other.conditional_block and \
self.filename == self.filename
def __ne__(self, other):
return not self == other

View File

@ -19,8 +19,10 @@ import unittest
from setools import SELinuxPolicy, PolicyDifference from setools import SELinuxPolicy, PolicyDifference
from .mixins import ValidateRule
class PolicyDifferenceTest(unittest.TestCase):
class PolicyDifferenceTest(ValidateRule, unittest.TestCase):
"""Policy difference tests.""" """Policy difference tests."""
@ -208,6 +210,532 @@ class PolicyDifferenceTest(unittest.TestCase):
self.assertSetEqual(set(["new_com"]), self.assertSetEqual(set(["new_com"]),
self.diff.modified_classes["modified_change_common"].added_perms) self.diff.modified_classes["modified_change_common"].added_perms)
#
# Allow rules
#
def test_added_allow_rules(self):
"""Diff: added allow rules."""
rules = sorted(self.diff.added_allows)
self.assertEqual(5, len(rules))
# added rule with existing types
self.validate_rule(rules[0], "allow", "added_rule_source", "added_rule_target", "infoflow",
set(["med_w"]))
# added rule with new type
self.validate_rule(rules[1], "allow", "added_type", "added_type", "infoflow2",
set(["med_w"]))
# rule moved out of a conditional
self.validate_rule(rules[2], "allow", "move_from_bool", "move_from_bool", "infoflow4",
set(["hi_r"]))
# rule moved into a conditional
self.validate_rule(rules[3], "allow", "move_to_bool", "move_to_bool", "infoflow4",
set(["hi_w"]), cond="move_to_bool_b", cond_block=True)
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[4], "allow", "system", "switch_block", "infoflow6",
set(["hi_r"]), cond="switch_block_b", cond_block=False)
def test_removed_allow_rules(self):
"""Diff: removed allow rules."""
rules = sorted(self.diff.removed_allows)
self.assertEqual(5, len(rules))
# rule moved out of a conditional
self.validate_rule(rules[0], "allow", "move_from_bool", "move_from_bool", "infoflow4",
set(["hi_r"]), cond="move_from_bool_b", cond_block=True)
# rule moved into a conditional
self.validate_rule(rules[1], "allow", "move_to_bool", "move_to_bool", "infoflow4",
set(["hi_w"]))
# removed rule with existing types
self.validate_rule(rules[2], "allow", "removed_rule_source", "removed_rule_target",
"infoflow", set(["hi_r"]))
# removed rule with new type
self.validate_rule(rules[3], "allow", "removed_type", "removed_type", "infoflow3",
set(["null"]))
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[4], "allow", "system", "switch_block", "infoflow6",
set(["hi_r"]), cond="switch_block_b", cond_block=True)
def test_modified_allow_rules(self):
"""Diff: modified allow rules."""
l = sorted(self.diff.modified_allows)
self.assertEqual(3, len(l))
# add permissions
rule, added_perms, removed_perms, matched_perms = l[0]
self.assertEqual("allow", rule.ruletype)
self.assertEqual("modified_rule_add_perms", rule.source)
self.assertEqual("modified_rule_add_perms", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertSetEqual(set(["hi_w"]), added_perms)
self.assertFalse(removed_perms)
self.assertSetEqual(set(["hi_r"]), matched_perms)
# add and remove permissions
rule, added_perms, removed_perms, matched_perms = l[1]
self.assertEqual("allow", rule.ruletype)
self.assertEqual("modified_rule_add_remove_perms", rule.source)
self.assertEqual("modified_rule_add_remove_perms", rule.target)
self.assertEqual("infoflow2", rule.tclass)
self.assertSetEqual(set(["super_r"]), added_perms)
self.assertSetEqual(set(["super_w"]), removed_perms)
self.assertSetEqual(set(["low_w"]), matched_perms)
# remove permissions
rule, added_perms, removed_perms, matched_perms = l[2]
self.assertEqual("allow", rule.ruletype)
self.assertEqual("modified_rule_remove_perms", rule.source)
self.assertEqual("modified_rule_remove_perms", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertFalse(added_perms)
self.assertSetEqual(set(["low_r"]), removed_perms)
self.assertSetEqual(set(["low_w"]), matched_perms)
#
# Auditallow rules
#
def test_added_auditallow_rules(self):
"""Diff: added auditallow rules."""
rules = sorted(self.diff.added_auditallows)
self.assertEqual(5, len(rules))
# added rule with existing types
self.validate_rule(rules[0], "auditallow", "aa_added_rule_source", "aa_added_rule_target",
"infoflow", set(["med_w"]))
# rule moved out of a conditional
self.validate_rule(rules[1], "auditallow", "aa_move_from_bool", "aa_move_from_bool",
"infoflow4", set(["hi_r"]))
# rule moved into a conditional
self.validate_rule(rules[2], "auditallow", "aa_move_to_bool", "aa_move_to_bool",
"infoflow4", set(["hi_w"]), cond="aa_move_to_bool_b", cond_block=True)
# added rule with new type
self.validate_rule(rules[3], "auditallow", "added_type", "added_type", "infoflow7",
set(["super_none"]))
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[4], "auditallow", "system", "aa_switch_block", "infoflow6",
set(["hi_r"]), cond="aa_switch_block_b", cond_block=False)
def test_removed_auditallow_rules(self):
"""Diff: removed auditallow rules."""
rules = sorted(self.diff.removed_auditallows)
self.assertEqual(5, len(rules))
# rule moved out of a conditional
self.validate_rule(rules[0], "auditallow", "aa_move_from_bool", "aa_move_from_bool",
"infoflow4", set(["hi_r"]), cond="aa_move_from_bool_b", cond_block=True)
# rule moved into a conditional
self.validate_rule(rules[1], "auditallow", "aa_move_to_bool", "aa_move_to_bool",
"infoflow4", set(["hi_w"]))
# removed rule with existing types
self.validate_rule(rules[2], "auditallow", "aa_removed_rule_source",
"aa_removed_rule_target", "infoflow", set(["hi_r"]))
# removed rule with new type
self.validate_rule(rules[3], "auditallow", "removed_type", "removed_type", "infoflow7",
set(["super_unmapped"]))
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[4], "auditallow", "system", "aa_switch_block", "infoflow6",
set(["hi_r"]), cond="aa_switch_block_b", cond_block=True)
def test_modified_auditallow_rules(self):
"""Diff: modified auditallow rules."""
l = sorted(self.diff.modified_auditallows)
self.assertEqual(3, len(l))
# add permissions
rule, added_perms, removed_perms, matched_perms = l[0]
self.assertEqual("auditallow", rule.ruletype)
self.assertEqual("aa_modified_rule_add_perms", rule.source)
self.assertEqual("aa_modified_rule_add_perms", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertSetEqual(set(["hi_w"]), added_perms)
self.assertFalse(removed_perms)
self.assertSetEqual(set(["hi_r"]), matched_perms)
# add and remove permissions
rule, added_perms, removed_perms, matched_perms = l[1]
self.assertEqual("auditallow", rule.ruletype)
self.assertEqual("aa_modified_rule_add_remove_perms", rule.source)
self.assertEqual("aa_modified_rule_add_remove_perms", rule.target)
self.assertEqual("infoflow2", rule.tclass)
self.assertSetEqual(set(["super_r"]), added_perms)
self.assertSetEqual(set(["super_w"]), removed_perms)
self.assertSetEqual(set(["low_w"]), matched_perms)
# remove permissions
rule, added_perms, removed_perms, matched_perms = l[2]
self.assertEqual("auditallow", rule.ruletype)
self.assertEqual("aa_modified_rule_remove_perms", rule.source)
self.assertEqual("aa_modified_rule_remove_perms", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertFalse(added_perms)
self.assertSetEqual(set(["low_r"]), removed_perms)
self.assertSetEqual(set(["low_w"]), matched_perms)
#
# Dontaudit rules
#
def test_added_dontaudit_rules(self):
"""Diff: added dontaudit rules."""
rules = sorted(self.diff.added_dontaudits)
self.assertEqual(5, len(rules))
# added rule with new type
self.validate_rule(rules[0], "dontaudit", "added_type", "added_type", "infoflow7",
set(["super_none"]))
# added rule with existing types
self.validate_rule(rules[1], "dontaudit", "da_added_rule_source", "da_added_rule_target",
"infoflow", set(["med_w"]))
# rule moved out of a conditional
self.validate_rule(rules[2], "dontaudit", "da_move_from_bool", "da_move_from_bool",
"infoflow4", set(["hi_r"]))
# rule moved into a conditional
self.validate_rule(rules[3], "dontaudit", "da_move_to_bool", "da_move_to_bool",
"infoflow4", set(["hi_w"]), cond="da_move_to_bool_b", cond_block=True)
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[4], "dontaudit", "system", "da_switch_block", "infoflow6",
set(["hi_r"]), cond="da_switch_block_b", cond_block=False)
def test_removed_dontaudit_rules(self):
"""Diff: removed dontaudit rules."""
rules = sorted(self.diff.removed_dontaudits)
self.assertEqual(5, len(rules))
# rule moved out of a conditional
self.validate_rule(rules[0], "dontaudit", "da_move_from_bool", "da_move_from_bool",
"infoflow4", set(["hi_r"]), cond="da_move_from_bool_b", cond_block=True)
# rule moved into a conditional
self.validate_rule(rules[1], "dontaudit", "da_move_to_bool", "da_move_to_bool",
"infoflow4", set(["hi_w"]))
# removed rule with existing types
self.validate_rule(rules[2], "dontaudit", "da_removed_rule_source",
"da_removed_rule_target", "infoflow", set(["hi_r"]))
# removed rule with new type
self.validate_rule(rules[3], "dontaudit", "removed_type", "removed_type", "infoflow7",
set(["super_both"]))
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[4], "dontaudit", "system", "da_switch_block", "infoflow6",
set(["hi_r"]), cond="da_switch_block_b", cond_block=True)
def test_modified_dontaudit_rules(self):
"""Diff: modified dontaudit rules."""
l = sorted(self.diff.modified_dontaudits)
self.assertEqual(3, len(l))
# add permissions
rule, added_perms, removed_perms, matched_perms = l[0]
self.assertEqual("dontaudit", rule.ruletype)
self.assertEqual("da_modified_rule_add_perms", rule.source)
self.assertEqual("da_modified_rule_add_perms", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertSetEqual(set(["hi_w"]), added_perms)
self.assertFalse(removed_perms)
self.assertSetEqual(set(["hi_r"]), matched_perms)
# add and remove permissions
rule, added_perms, removed_perms, matched_perms = l[1]
self.assertEqual("dontaudit", rule.ruletype)
self.assertEqual("da_modified_rule_add_remove_perms", rule.source)
self.assertEqual("da_modified_rule_add_remove_perms", rule.target)
self.assertEqual("infoflow2", rule.tclass)
self.assertSetEqual(set(["super_r"]), added_perms)
self.assertSetEqual(set(["super_w"]), removed_perms)
self.assertSetEqual(set(["low_w"]), matched_perms)
# remove permissions
rule, added_perms, removed_perms, matched_perms = l[2]
self.assertEqual("dontaudit", rule.ruletype)
self.assertEqual("da_modified_rule_remove_perms", rule.source)
self.assertEqual("da_modified_rule_remove_perms", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertFalse(added_perms)
self.assertSetEqual(set(["low_r"]), removed_perms)
self.assertSetEqual(set(["low_w"]), matched_perms)
#
# Neverallow rules
#
def test_added_neverallow_rules(self):
"""Diff: added neverallow rules."""
rules = sorted(self.diff.added_neverallows)
self.assertEqual(2, len(rules))
# added rule with new type
self.validate_rule(rules[0], "neverallow", "added_type", "added_type", "added_class",
set(["new_class_perm"]))
# added rule with existing types
self.validate_rule(rules[1], "neverallow", "na_added_rule_source", "na_added_rule_target",
"infoflow", set(["med_w"]))
def test_removed_neverallow_rules(self):
"""Diff: removed neverallow rules."""
rules = sorted(self.diff.removed_neverallows)
self.assertEqual(2, len(rules))
# removed rule with existing types
self.validate_rule(rules[0], "neverallow", "na_removed_rule_source",
"na_removed_rule_target", "infoflow", set(["hi_r"]))
# removed rule with new type
self.validate_rule(rules[1], "neverallow", "removed_type", "removed_type", "removed_class",
set(["null_perm"]))
def test_modified_neverallow_rules(self):
"""Diff: modified neverallow rules."""
l = sorted(self.diff.modified_neverallows)
self.assertEqual(3, len(l))
# add permissions
rule, added_perms, removed_perms, matched_perms = l[0]
self.assertEqual("neverallow", rule.ruletype)
self.assertEqual("na_modified_rule_add_perms", rule.source)
self.assertEqual("na_modified_rule_add_perms", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertSetEqual(set(["hi_w"]), added_perms)
self.assertFalse(removed_perms)
self.assertSetEqual(set(["hi_r"]), matched_perms)
# add and remove permissions
rule, added_perms, removed_perms, matched_perms = l[1]
self.assertEqual("neverallow", rule.ruletype)
self.assertEqual("na_modified_rule_add_remove_perms", rule.source)
self.assertEqual("na_modified_rule_add_remove_perms", rule.target)
self.assertEqual("infoflow2", rule.tclass)
self.assertSetEqual(set(["super_r"]), added_perms)
self.assertSetEqual(set(["super_w"]), removed_perms)
self.assertSetEqual(set(["low_w"]), matched_perms)
# remove permissions
rule, added_perms, removed_perms, matched_perms = l[2]
self.assertEqual("neverallow", rule.ruletype)
self.assertEqual("na_modified_rule_remove_perms", rule.source)
self.assertEqual("na_modified_rule_remove_perms", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertFalse(added_perms)
self.assertSetEqual(set(["low_r"]), removed_perms)
self.assertSetEqual(set(["low_w"]), matched_perms)
#
# Type_transition rules
#
def test_added_type_transition_rules(self):
"""Diff: added type_transition rules."""
rules = sorted(self.diff.added_type_transitions)
self.assertEqual(5, len(rules))
# added rule with new type
self.validate_rule(rules[0], "type_transition", "added_type", "system", "infoflow4",
"system")
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[1], "type_transition", "system", "tt_switch_block", "infoflow6",
"system", cond="tt_switch_block_b", cond_block=False)
# added rule with existing types
self.validate_rule(rules[2], "type_transition", "tt_added_rule_source",
"tt_added_rule_target", "infoflow", "system")
# rule moved out of a conditional
self.validate_rule(rules[3], "type_transition", "tt_move_from_bool", "system",
"infoflow4", "system")
# rule moved into a conditional
self.validate_rule(rules[4], "type_transition", "tt_move_to_bool", "system",
"infoflow3", "system", cond="tt_move_to_bool_b", cond_block=True)
def test_removed_type_transition_rules(self):
"""Diff: removed type_transition rules."""
rules = sorted(self.diff.removed_type_transitions)
self.assertEqual(5, len(rules))
# removed rule with new type
self.validate_rule(rules[0], "type_transition", "removed_type", "system", "infoflow4",
"system")
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[1], "type_transition", "system", "tt_switch_block", "infoflow6",
"system", cond="tt_switch_block_b", cond_block=True)
# rule moved out of a conditional
self.validate_rule(rules[2], "type_transition", "tt_move_from_bool", "system",
"infoflow4", "system", cond="tt_move_from_bool_b", cond_block=True)
# rule moved into a conditional
self.validate_rule(rules[3], "type_transition", "tt_move_to_bool", "system",
"infoflow3", "system")
# removed rule with existing types
self.validate_rule(rules[4], "type_transition", "tt_removed_rule_source",
"tt_removed_rule_target", "infoflow", "system")
def test_modified_type_transition_rules(self):
"""Diff: modified type_transition rules."""
l = sorted(self.diff.modified_type_transitions)
self.assertEqual(1, len(l))
rule, added_default, removed_default = l[0]
self.assertEqual("type_transition", rule.ruletype)
self.assertEqual("tt_matched_source", rule.source)
self.assertEqual("system", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertEqual("tt_new_type", added_default)
self.assertEqual("tt_old_type", removed_default)
#
# Type_change rules
#
def test_added_type_change_rules(self):
"""Diff: added type_change rules."""
rules = sorted(self.diff.added_type_changes)
self.assertEqual(5, len(rules))
# added rule with new type
self.validate_rule(rules[0], "type_change", "added_type", "system", "infoflow4",
"system")
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[1], "type_change", "system", "tc_switch_block", "infoflow6",
"system", cond="tc_switch_block_b", cond_block=False)
# added rule with existing types
self.validate_rule(rules[2], "type_change", "tc_added_rule_source",
"tc_added_rule_target", "infoflow", "system")
# rule moved out of a conditional
self.validate_rule(rules[3], "type_change", "tc_move_from_bool", "system",
"infoflow4", "system")
# rule moved into a conditional
self.validate_rule(rules[4], "type_change", "tc_move_to_bool", "system",
"infoflow3", "system", cond="tc_move_to_bool_b", cond_block=True)
def test_removed_type_change_rules(self):
"""Diff: removed type_change rules."""
rules = sorted(self.diff.removed_type_changes)
self.assertEqual(5, len(rules))
# removed rule with new type
self.validate_rule(rules[0], "type_change", "removed_type", "system", "infoflow4",
"system")
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[1], "type_change", "system", "tc_switch_block", "infoflow6",
"system", cond="tc_switch_block_b", cond_block=True)
# rule moved out of a conditional
self.validate_rule(rules[2], "type_change", "tc_move_from_bool", "system",
"infoflow4", "system", cond="tc_move_from_bool_b", cond_block=True)
# rule moved into a conditional
self.validate_rule(rules[3], "type_change", "tc_move_to_bool", "system",
"infoflow3", "system")
# removed rule with existing types
self.validate_rule(rules[4], "type_change", "tc_removed_rule_source",
"tc_removed_rule_target", "infoflow", "system")
def test_modified_type_change_rules(self):
"""Diff: modified type_change rules."""
l = sorted(self.diff.modified_type_changes)
self.assertEqual(1, len(l))
rule, added_default, removed_default = l[0]
self.assertEqual("type_change", rule.ruletype)
self.assertEqual("tc_matched_source", rule.source)
self.assertEqual("system", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertEqual("tc_new_type", added_default)
self.assertEqual("tc_old_type", removed_default)
#
# Type_member rules
#
def test_added_type_member_rules(self):
"""Diff: added type_member rules."""
rules = sorted(self.diff.added_type_members)
self.assertEqual(5, len(rules))
# added rule with new type
self.validate_rule(rules[0], "type_member", "added_type", "system", "infoflow4",
"system")
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[1], "type_member", "system", "tm_switch_block", "infoflow6",
"system", cond="tm_switch_block_b", cond_block=False)
# added rule with existing types
self.validate_rule(rules[2], "type_member", "tm_added_rule_source",
"tm_added_rule_target", "infoflow", "system")
# rule moved out of a conditional
self.validate_rule(rules[3], "type_member", "tm_move_from_bool", "system",
"infoflow4", "system")
# rule moved into a conditional
self.validate_rule(rules[4], "type_member", "tm_move_to_bool", "system",
"infoflow3", "system", cond="tm_move_to_bool_b", cond_block=True)
def test_removed_type_member_rules(self):
"""Diff: removed type_member rules."""
rules = sorted(self.diff.removed_type_members)
self.assertEqual(5, len(rules))
# removed rule with new type
self.validate_rule(rules[0], "type_member", "removed_type", "system", "infoflow4",
"system")
# rule moved from one conditional block to another (true to false)
self.validate_rule(rules[1], "type_member", "system", "tm_switch_block", "infoflow6",
"system", cond="tm_switch_block_b", cond_block=True)
# rule moved out of a conditional
self.validate_rule(rules[2], "type_member", "tm_move_from_bool", "system",
"infoflow4", "system", cond="tm_move_from_bool_b", cond_block=True)
# rule moved into a conditional
self.validate_rule(rules[3], "type_member", "tm_move_to_bool", "system",
"infoflow3", "system")
# removed rule with existing types
self.validate_rule(rules[4], "type_member", "tm_removed_rule_source",
"tm_removed_rule_target", "infoflow", "system")
def test_modified_type_member_rules(self):
"""Diff: modified type_member rules."""
l = sorted(self.diff.modified_type_members)
self.assertEqual(1, len(l))
rule, added_default, removed_default = l[0]
self.assertEqual("type_member", rule.ruletype)
self.assertEqual("tm_matched_source", rule.source)
self.assertEqual("system", rule.target)
self.assertEqual("infoflow", rule.tclass)
self.assertEqual("tm_new_type", added_default)
self.assertEqual("tm_old_type", removed_default)
class PolicyDifferenceTestNoDiff(unittest.TestCase): class PolicyDifferenceTestNoDiff(unittest.TestCase):
@ -264,3 +792,87 @@ class PolicyDifferenceTestNoDiff(unittest.TestCase):
def test_modified_classes(self): def test_modified_classes(self):
"""NoDiff: no modified classes.""" """NoDiff: no modified classes."""
self.assertFalse(self.diff.modified_classes) self.assertFalse(self.diff.modified_classes)
def test_added_allows(self):
"""NoDiff: no added allow rules."""
self.assertFalse(self.diff.added_allows)
def test_removed_allows(self):
"""NoDiff: no removed allow rules."""
self.assertFalse(self.diff.removed_allows)
def test_modified_allows(self):
"""NoDiff: no modified allow rules."""
self.assertFalse(self.diff.modified_allows)
def test_added_auditallows(self):
"""NoDiff: no added auditallow rules."""
self.assertFalse(self.diff.added_auditallows)
def test_removed_auditallows(self):
"""NoDiff: no removed auditallow rules."""
self.assertFalse(self.diff.removed_auditallows)
def test_modified_auditallows(self):
"""NoDiff: no modified auditallow rules."""
self.assertFalse(self.diff.modified_auditallows)
def test_added_neverallows(self):
"""NoDiff: no added neverallow rules."""
self.assertFalse(self.diff.added_neverallows)
def test_removed_neverallows(self):
"""NoDiff: no removed neverallow rules."""
self.assertFalse(self.diff.removed_neverallows)
def test_modified_neverallows(self):
"""NoDiff: no modified neverallow rules."""
self.assertFalse(self.diff.modified_neverallows)
def test_added_dontaudits(self):
"""NoDiff: no added dontaudit rules."""
self.assertFalse(self.diff.added_dontaudits)
def test_removed_dontaudits(self):
"""NoDiff: no removed dontaudit rules."""
self.assertFalse(self.diff.removed_dontaudits)
def test_modified_dontaudits(self):
"""NoDiff: no modified dontaudit rules."""
self.assertFalse(self.diff.modified_dontaudits)
def test_added_type_transitions(self):
"""NoDiff: no added type_transition rules."""
self.assertFalse(self.diff.added_type_transitions)
def test_removed_type_transitions(self):
"""NoDiff: no removed type_transition rules."""
self.assertFalse(self.diff.removed_type_transitions)
def test_modified_type_transitions(self):
"""NoDiff: no modified type_transition rules."""
self.assertFalse(self.diff.modified_type_transitions)
def test_added_type_changes(self):
"""NoDiff: no added type_change rules."""
self.assertFalse(self.diff.added_type_changes)
def test_removed_type_changes(self):
"""NoDiff: no removed type_change rules."""
self.assertFalse(self.diff.removed_type_changes)
def test_modified_type_changes(self):
"""NoDiff: no modified type_change rules."""
self.assertFalse(self.diff.modified_type_changes)
def test_added_type_members(self):
"""NoDiff: no added type_member rules."""
self.assertFalse(self.diff.added_type_members)
def test_removed_type_members(self):
"""NoDiff: no removed type_member rules."""
self.assertFalse(self.diff.removed_type_members)
def test_modified_type_members(self):
"""NoDiff: no modified type_member rules."""
self.assertFalse(self.diff.modified_type_members)

View File

@ -142,6 +142,350 @@ role modified_add_type;
role modified_remove_type; role modified_remove_type;
role modified_remove_type types { system }; role modified_remove_type types { system };
# 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;
################################################################################ ################################################################################
#users #users

View File

@ -142,6 +142,350 @@ role modified_add_type types { system };
role modified_remove_type; role modified_remove_type;
# 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;
type added_rule_source;
type added_rule_target;
allow added_rule_source added_rule_target:infoflow med_w;
type modified_rule_add_perms;
allow modified_rule_add_perms self:infoflow { hi_r hi_w };
type modified_rule_remove_perms;
allow modified_rule_remove_perms self:infoflow low_w;
type modified_rule_add_remove_perms;
allow modified_rule_add_remove_perms self:infoflow2 { low_w super_r };
allow added_type self:infoflow2 med_w;
type move_to_bool;
bool move_to_bool_b false;
if (move_to_bool_b) {
allow move_to_bool self:infoflow4 hi_w;
}
type move_from_bool;
bool move_from_bool_b false;
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;
} else {
allow system switch_block:infoflow6 hi_r;
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_A_t self:infoflow2 super_w;
allow match_rule_by_attr_B_t 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_A_t self:infoflow2 { super_w super_r };
allow unioned_perm_via_attr_B_t self:infoflow2 { super_w 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;
type aa_added_rule_source;
type aa_added_rule_target;
auditallow aa_added_rule_source aa_added_rule_target:infoflow med_w;
type aa_modified_rule_add_perms;
auditallow aa_modified_rule_add_perms self:infoflow { hi_r hi_w };
type aa_modified_rule_remove_perms;
auditallow aa_modified_rule_remove_perms self:infoflow low_w;
type aa_modified_rule_add_remove_perms;
auditallow aa_modified_rule_add_remove_perms self:infoflow2 { low_w super_r };
auditallow added_type self:infoflow7 super_none;
type aa_move_to_bool;
bool aa_move_to_bool_b false;
if (aa_move_to_bool_b) {
auditallow aa_move_to_bool self:infoflow4 hi_w;
}
type aa_move_from_bool;
bool aa_move_from_bool_b false;
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;
} else {
auditallow system aa_switch_block:infoflow6 hi_r;
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_A_t self:infoflow2 super_w;
auditallow aa_match_rule_by_attr_B_t 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_A_t self:infoflow2 { super_w super_r };
auditallow aa_unioned_perm_via_attr_B_t self:infoflow2 { super_w 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;
type da_added_rule_source;
type da_added_rule_target;
dontaudit da_added_rule_source da_added_rule_target:infoflow med_w;
type da_modified_rule_add_perms;
dontaudit da_modified_rule_add_perms self:infoflow { hi_r hi_w };
type da_modified_rule_remove_perms;
dontaudit da_modified_rule_remove_perms self:infoflow low_w;
type da_modified_rule_add_remove_perms;
dontaudit da_modified_rule_add_remove_perms self:infoflow2 { low_w super_r };
dontaudit added_type self:infoflow7 super_none;
type da_move_to_bool;
bool da_move_to_bool_b false;
if (da_move_to_bool_b) {
dontaudit da_move_to_bool self:infoflow4 hi_w;
}
type da_move_from_bool;
bool da_move_from_bool_b false;
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;
} else {
dontaudit system da_switch_block:infoflow6 hi_r;
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_A_t self:infoflow2 super_w;
dontaudit da_match_rule_by_attr_B_t 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_A_t self:infoflow2 { super_w super_r };
dontaudit da_unioned_perm_via_attr_B_t self:infoflow2 { super_w 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;
type na_added_rule_source;
type na_added_rule_target;
neverallow na_added_rule_source na_added_rule_target:infoflow med_w;
type na_modified_rule_add_perms;
neverallow na_modified_rule_add_perms self:infoflow { hi_r hi_w };
type na_modified_rule_remove_perms;
neverallow na_modified_rule_remove_perms self:infoflow low_w;
type na_modified_rule_add_remove_perms;
neverallow na_modified_rule_add_remove_perms self:infoflow2 { low_w super_r };
neverallow added_type self:added_class new_class_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_A_t self:infoflow2 super_w;
neverallow na_match_rule_by_attr_B_t 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_A_t self:infoflow2 { super_w super_r };
neverallow na_unioned_perm_via_attr_B_t self:infoflow2 { super_w 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 tt_added_rule_source;
type tt_added_rule_target;
type_transition tt_added_rule_source tt_added_rule_target:infoflow system;
type tt_old_type;
type tt_new_type;
type_transition tt_matched_source system:infoflow tt_new_type;
type_transition added_type system:infoflow4 system;
type tt_move_to_bool;
bool tt_move_to_bool_b false;
if (tt_move_to_bool_b) {
type_transition tt_move_to_bool system:infoflow3 system;
}
type tt_move_from_bool;
bool tt_move_from_bool_b false;
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;
} else {
type_transition system tt_switch_block:infoflow6 system;
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 tc_added_rule_source;
type tc_added_rule_target;
type_change tc_added_rule_source tc_added_rule_target:infoflow system;
type tc_old_type;
type tc_new_type;
type_change tc_matched_source system:infoflow tc_new_type;
type_change added_type system:infoflow4 system;
type tc_move_to_bool;
bool tc_move_to_bool_b false;
if (tc_move_to_bool_b) {
type_change tc_move_to_bool system:infoflow3 system;
}
type tc_move_from_bool;
bool tc_move_from_bool_b false;
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;
} else {
type_change system tc_switch_block:infoflow6 system;
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 tm_added_rule_source;
type tm_added_rule_target;
type_member tm_added_rule_source tm_added_rule_target:infoflow system;
type tm_old_type;
type tm_new_type;
type_member tm_matched_source system:infoflow tm_new_type;
type_member added_type system:infoflow4 system;
type tm_move_to_bool;
bool tm_move_to_bool_b false;
if (tm_move_to_bool_b) {
type_member tm_move_to_bool system:infoflow3 system;
}
type tm_move_from_bool;
bool tm_move_from_bool_b false;
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;
} else {
type_member system tm_switch_block:infoflow6 system;
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;
################################################################################ ################################################################################
#users #users

View File

@ -26,7 +26,8 @@ class ValidateRule(unittest.TestCase):
"""Mixin for validating policy rules.""" """Mixin for validating policy rules."""
def validate_rule(self, rule, ruletype, source, target, tclass, last_item, cond=None): def validate_rule(self, rule, ruletype, source, target, tclass, last_item, cond=None,
cond_block=None):
"""Validate a rule.""" """Validate a rule."""
self.assertEqual(ruletype, rule.ruletype) self.assertEqual(ruletype, rule.ruletype)
self.assertEqual(source, rule.source) self.assertEqual(source, rule.source)
@ -43,3 +44,6 @@ class ValidateRule(unittest.TestCase):
self.assertEqual(cond, rule.conditional) self.assertEqual(cond, rule.conditional)
else: else:
self.assertRaises(RuleNotConditional, getattr, rule, "conditional") self.assertRaises(RuleNotConditional, getattr, rule, "conditional")
if cond_block is not None:
self.assertEqual(cond_block, rule.conditional_block)