On Tue, 2020-12-29 at 10:46 -0800, Casey Schaufler wrote: > >>>>>> -int security_audit_rule_match(u32 secid, u32 field, u32 op, void *lsmrule) > >>>>>> +int security_audit_rule_match(u32 secid, u32 field, u32 op, void **lsmrule) > >>>>>> { > >>>>>> - return call_int_hook(audit_rule_match, 0, secid, field, op, lsmrule); > >>>>>> + struct security_hook_list *hp; > >>>>>> + int rc; > >>>>>> + > >>>>>> + hlist_for_each_entry(hp, &security_hook_heads.audit_rule_match, list) { > >>>>>> + if (WARN_ON(hp->lsmid->slot < 0 || hp->lsmid->slot >= lsm_slot)) > >>>>>> + continue; > >>>>>> + rc = hp->hook.audit_rule_match(secid, field, op, > >>>>>> + &lsmrule[hp->lsmid->slot]); > >>>>>> + if (rc) > >>>>>> + return rc; > >>>>> Suppose that there is an IMA dont_measure or dont_appraise rule, if one > >>>>> LSM matches, then this returns true, causing any measurement or > >>>>> integrity verification to be skipped. > >>>> Yes, that is correct. Like the audit system, you're doing a string based > >>>> lookup, which pretty well has to work this way. I have proposed compound > >>>> label specifications in the past, but even if we accepted something like > >>>> "apparmor=dates,selinux=figs" we'd still have to be compatible with the > >>>> old style inputs. > >>>> > >>>>> Sample policy rules: > >>>>> dont_measure obj_type=foo_log > >>>>> dont_appraise obj_type=foo_log > >>> IMA could extend the existing policy rules like "lsm=[selinux] | > >>> [smack] | [apparmor]", but that assumes that the underlying > >>> infrastructure supports it. > >> Yes, but you would still need rational behavior in the > >> case where someone has old IMA policy rules. > > From an IMA perspective, allowing multiple LSMs to define the same > > policy label is worse than requiring the label be constrained to a > > particular LSM. > > Just to be sure we're talking about the same thing, > the case I'm referring to is something like a file with > two extended attributes: > > security.apparmor MacAndCheese > security.SMACK64 MacAndCheese > > and an IMA rule that says > > dont_measure obj_type=MacAndCheese > > In this case the dont_measure will be applied to both. > On the other hand, > > security.apparmor MacAndCheese > security.SMACK64 FranksAndBeans > > would also apply the rule to both, which is not > what you want. Unfortunately, there is no way to > differentiate which LSM hit the rule. > > So now I'm a little confused. The case where both LSMs > use the same label looks like it works right, where the > case where they're different doesn't. I'm more concerned about multiple LSMs using the same label. The label's meaning is LSM specific. > > I'm beginning to think that identifying which LSMs matched > a rule (it may be none, either or both) is the right solution. > I don't think that audit is as sensitive to this. If the label's meaning is LSM specific, then the rule needs to be LSM specific.