Skip to content

Commit dd81662

Browse files
tweksteenpcmoore
authored andcommitted
selinux: add tracepoint on audited events
The audit data currently captures which process and which target is responsible for a denial. There is no data on where exactly in the process that call occurred. Debugging can be made easier by being able to reconstruct the unified kernel and userland stack traces [1]. Add a tracepoint on the SELinux denials which can then be used by userland (i.e. perf). Although this patch could manually be added by each OS developer to trouble shoot a denial, adding it to the kernel streamlines the developers workflow. It is possible to use perf for monitoring the event: # perf record -e avc:selinux_audited -g -a ^C # perf report -g [...] 6.40% 6.40% audited=800000 tclass=4 | __libc_start_main | |--4.60%--__GI___ioctl | entry_SYSCALL_64 | do_syscall_64 | __x64_sys_ioctl | ksys_ioctl | binder_ioctl | binder_set_nice | can_nice | capable | security_capable | cred_has_capability.isra.0 | slow_avc_audit | common_lsm_audit | avc_audit_post_callback | avc_audit_post_callback | It is also possible to use the ftrace interface: # echo 1 > /sys/kernel/debug/tracing/events/avc/selinux_audited/enable # cat /sys/kernel/debug/tracing/trace tracer: nop entries-in-buffer/entries-written: 1/1 #P:8 [...] dmesg-3624 [001] 13072.325358: selinux_denied: audited=800000 tclass=4 The tclass value can be mapped to a class by searching security/selinux/flask.h. The audited value is a bit field of the permissions described in security/selinux/av_permissions.h for the corresponding class. [1] https://source.android.com/devices/tech/debug/native_stack_dump Signed-off-by: Thiébaud Weksteen <tweek@google.com> Suggested-by: Joel Fernandes <joelaf@google.com> Reviewed-by: Peter Enderborg <peter.enderborg@sony.com> Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com> Signed-off-by: Paul Moore <paul@paul-moore.com>
1 parent 0eea609 commit dd81662

3 files changed

Lines changed: 43 additions & 0 deletions

File tree

MAINTAINERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15569,6 +15569,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux.git
1556915569
F: Documentation/ABI/obsolete/sysfs-selinux-checkreqprot
1557015570
F: Documentation/ABI/obsolete/sysfs-selinux-disable
1557115571
F: Documentation/admin-guide/LSM/SELinux.rst
15572+
F: include/trace/events/avc.h
1557215573
F: include/uapi/linux/selinux_netlink.h
1557315574
F: scripts/selinux/
1557415575
F: security/selinux/

include/trace/events/avc.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
/*
3+
* Author: Thiébaud Weksteen <tweek@google.com>
4+
*/
5+
#undef TRACE_SYSTEM
6+
#define TRACE_SYSTEM avc
7+
8+
#if !defined(_TRACE_SELINUX_H) || defined(TRACE_HEADER_MULTI_READ)
9+
#define _TRACE_SELINUX_H
10+
11+
#include <linux/tracepoint.h>
12+
13+
TRACE_EVENT(selinux_audited,
14+
15+
TP_PROTO(struct selinux_audit_data *sad),
16+
17+
TP_ARGS(sad),
18+
19+
TP_STRUCT__entry(
20+
__field(unsigned int, tclass)
21+
__field(unsigned int, audited)
22+
),
23+
24+
TP_fast_assign(
25+
__entry->tclass = sad->tclass;
26+
__entry->audited = sad->audited;
27+
),
28+
29+
TP_printk("tclass=%u audited=%x",
30+
__entry->tclass,
31+
__entry->audited)
32+
);
33+
34+
#endif
35+
36+
/* This part must be outside protection */
37+
#include <trace/define_trace.h>

security/selinux/avc.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
#include "avc_ss.h"
3232
#include "classmap.h"
3333

34+
#define CREATE_TRACE_POINTS
35+
#include <trace/events/avc.h>
36+
3437
#define AVC_CACHE_SLOTS 512
3538
#define AVC_DEF_CACHE_THRESHOLD 512
3639
#define AVC_CACHE_RECLAIM 16
@@ -706,6 +709,8 @@ static void avc_audit_post_callback(struct audit_buffer *ab, void *a)
706709
u32 scontext_len;
707710
int rc;
708711

712+
trace_selinux_audited(sad);
713+
709714
rc = security_sid_to_context(sad->state, sad->ssid, &scontext,
710715
&scontext_len);
711716
if (rc)

0 commit comments

Comments
 (0)