On Tuesday, November 22, 2016 9:55:11 AM EST Stephen Smalley wrote:
> On 11/22/2016 09:28 AM, Steve Grubb wrote:
>> On Tuesday, November 22, 2016 8:56:57 AM EST Stephen Smalley wrote:
>>> On 11/21/2016 04:50 PM, Paul Moore wrote:
>>>> On Mon, Nov 21, 2016 at 12:30 PM, Steve Grubb <sgrubb(a)redhat.com>
wrote:
>>>>> The AUDIT_MAC_POLICY_LOAD event has dangling text that means the
same
>>>>> thing as the event type and is missing the uid and results field.
The
>>>>> bigger issue is that in some failure cases no event is emitted. This
>>>>> patch fixes the noted problems.
>>>
>>> A potential problem with this patch is that it changes the semantic
>>> meaning of this audit record, from meaning "a policy was loaded into
the
>>> kernel" to "there was an attempt to load a policy, check the res=
field
>>> to determine whether it succeeded". So anything in userspace that used
>>> the presence of this audit record to determine whether or not policy was
>>> successfully loaded (e.g. audit2allow -l) will be confused.
>>
>> I really can't have implicit success. I need to have a field to point to
>> that says yes/no. It can be hard coded to res=1 (success), but it needs
>> to be there.
>
> Ok. Why is it you use res=1|0 in these records but success=yes|no in
> syscall records?
Success is only used in syscall records. It was created to disambiguate the
exit field which can look like a failure on some arches but is actually OK.
Originally the exit field was all that existed. We found that one or two arches
actually have 2 return codes. The whole rest of the audit system uses res= to
mean a crisp yes/no this did or didn't happen. This predates the creation of
the success field. It could be argued success should have been res, but
ausearch/report will use either to mean the same thing.
The new auparse field classifier work will also map both to mean the same thing.
That is how I found AUDIT_MAC_POLICY_LOAD missing any kind of success/fail
indication.
>>> While there were failure cases that would still generate the audit record
>>> previously, those were all selinuxfs node creation failures; the policy
>>> would nonetheless have been loaded into the kernel and would be active
>>> at that point, so saying res=0 is somewhat misleading.
>>
>> OK. We can move the point where res=1 is set. But I would think that its a
>> requirement to have an audit record that states that policy failed to
>> load.
>> FMT_MSA.3 Static Attribute Initialization. Auditable events: All
>> modifications of the initial value of security attributes. I would think
>> this means changes such as booleans, modifying labels, loading a new
>> policy, or failure to load a policy.
>
> Failure to load a policy is not a modification to the initial value of
> the security attribute, is it?
Sure. If the state is intended to enabled and enforcing and its not, that
would be a surprising result that there was no indication in the audit trail.
Also, if for some reason it booted fine and a new policy was loaded at some
point in the future and it failed, then we have a modification to initial
state.
>>> This overlapswith
>>>
https://github.com/SELinuxProject/selinux-kernel/issues/1, which
>>> highlights the fact that we can end up in an intermediate state where
>>> policy is loaded but selinuxfs (particularly booleans, class/*, and
>>> policy_capabilities/*) has not been regenerated.
>>
>> I see. That should be an audited event. If you have a datacenter with a
>> thousand machines, its best to get this in the audit trail so it can be
>> alerted on at a central collector.
>>
>> So, what should we do about the patch? I'm willing to modify it.
>
> At present, we only generate AUDIT_MAC_STATUS, AUDIT_MAC_LOAD, and
> AUDIT_MAC_CONFIG_CHANGE on success (or at least partial success). If
> you truly need to audit failures, then it seems like you either need to
> a) do it through syscall audit filters, which already provide a success=
> field
I can't imagine what to audit on. There is an open syscall that has a path.
But I suspect that does not fail because policy has not be written. There is a
write syscall but triggering on that is pretty generic. This is not ideal.
Can't you write an audit syscall filter or watch on
/sys/fs/selinux/load? Ditto for /sys/fs/selinux/enforce,
/sys/fs/selinux/commit_pending_bools, etc.
> or b) add new audit message types for this purpose (e.g.
> AUDIT_MAC_STATUS_FAIL, AUDIT_MAC_LOAD_FAIL, ...). To just add a res=
> field to the existing ones and change them to always be generated is a
> user-visible semantic change.
OK. This is do-able. I'll hard code the 'res' field for each of them.
-Steve