Commit 032bffd4 authored by Richard Guy Briggs's avatar Richard Guy Briggs Committed by Jan Kara
Browse files

fanotify,audit: Allow audit to use the full permission event response



This patch passes the full response so that the audit function can use all
of it. The audit function was updated to log the additional information in
the AUDIT_FANOTIFY record.

Currently the only type of fanotify info that is defined is an audit
rule number, but convert it to hex encoding to future-proof the field.
Hex encoding suggested by Paul Moore <paul@paul-moore.com>.

The {subj,obj}_trust values are {0,1,2}, corresponding to no, yes, unknown.

Sample records:
  type=FANOTIFY msg=audit(1600385147.372:590): resp=2 fan_type=1 fan_info=3137 subj_trust=3 obj_trust=5
  type=FANOTIFY msg=audit(1659730979.839:284): resp=1 fan_type=0 fan_info=0 subj_trust=2 obj_trust=2

Suggested-by: default avatarSteve Grubb <sgrubb@redhat.com>
Link: https://lore.kernel.org/r/3075502.aeNJFYEL58@x2


Tested-by: default avatarSteve Grubb <sgrubb@redhat.com>
Acked-by: default avatarSteve Grubb <sgrubb@redhat.com>
Signed-off-by: default avatarRichard Guy Briggs <rgb@redhat.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Message-Id: <bcb6d552e517b8751ece153e516d8b073459069c.1675373475.git.rgb@redhat.com>
parent 70529a19
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -273,7 +273,8 @@ static int fanotify_get_response(struct fsnotify_group *group,

	/* Check if the response should be audited */
	if (event->response & FAN_AUDIT)
		audit_fanotify(event->response & ~FAN_AUDIT);
		audit_fanotify(event->response & ~FAN_AUDIT,
			       &event->audit_rule);

	pr_debug("%s: group=%p event=%p about to return ret=%d\n", __func__,
		 group, event, ret);
+5 −4
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <linux/audit_arch.h>
#include <uapi/linux/audit.h>
#include <uapi/linux/netfilter/nf_tables.h>
#include <uapi/linux/fanotify.h>

#define AUDIT_INO_UNSET ((unsigned long)-1)
#define AUDIT_DEV_UNSET ((dev_t)-1)
@@ -416,7 +417,7 @@ extern void __audit_log_capset(const struct cred *new, const struct cred *old);
extern void __audit_mmap_fd(int fd, int flags);
extern void __audit_openat2_how(struct open_how *how);
extern void __audit_log_kern_module(char *name);
extern void __audit_fanotify(u32 response);
extern void __audit_fanotify(u32 response, struct fanotify_response_info_audit_rule *friar);
extern void __audit_tk_injoffset(struct timespec64 offset);
extern void __audit_ntp_log(const struct audit_ntp_data *ad);
extern void __audit_log_nfcfg(const char *name, u8 af, unsigned int nentries,
@@ -523,10 +524,10 @@ static inline void audit_log_kern_module(char *name)
		__audit_log_kern_module(name);
}

static inline void audit_fanotify(u32 response)
static inline void audit_fanotify(u32 response, struct fanotify_response_info_audit_rule *friar)
{
	if (!audit_dummy_context())
		__audit_fanotify(response);
		__audit_fanotify(response, friar);
}

static inline void audit_tk_injoffset(struct timespec64 offset)
@@ -679,7 +680,7 @@ static inline void audit_log_kern_module(char *name)
{
}

static inline void audit_fanotify(u32 response)
static inline void audit_fanotify(u32 response, struct fanotify_response_info_audit_rule *friar)
{ }

static inline void audit_tk_injoffset(struct timespec64 offset)
+15 −3
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@
#include <uapi/linux/limits.h>
#include <uapi/linux/netfilter/nf_tables.h>
#include <uapi/linux/openat2.h> // struct open_how
#include <uapi/linux/fanotify.h>

#include "audit.h"

@@ -2877,10 +2878,21 @@ void __audit_log_kern_module(char *name)
	context->type = AUDIT_KERN_MODULE;
}

void __audit_fanotify(u32 response)
void __audit_fanotify(u32 response, struct fanotify_response_info_audit_rule *friar)
{
	audit_log(audit_context(), GFP_KERNEL,
		AUDIT_FANOTIFY,	"resp=%u", response);
	/* {subj,obj}_trust values are {0,1,2}: no,yes,unknown */
	switch (friar->hdr.type) {
	case FAN_RESPONSE_INFO_NONE:
		audit_log(audit_context(), GFP_KERNEL, AUDIT_FANOTIFY,
			  "resp=%u fan_type=%u fan_info=0 subj_trust=2 obj_trust=2",
			  response, FAN_RESPONSE_INFO_NONE);
		break;
	case FAN_RESPONSE_INFO_AUDIT_RULE:
		audit_log(audit_context(), GFP_KERNEL, AUDIT_FANOTIFY,
			  "resp=%u fan_type=%u fan_info=%X subj_trust=%u obj_trust=%u",
			  response, friar->hdr.type, friar->rule_number,
			  friar->subj_trust, friar->obj_trust);
	}
}

void __audit_tk_injoffset(struct timespec64 offset)