audit.h 29.6 KB
Newer Older
1
/* audit.h -- Auditing support
L
Linus Torvalds 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 *
 * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina.
 * All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Written by Rickard E. (Rik) Faith <faith@redhat.com>
 *
 */

#ifndef _LINUX_AUDIT_H_
#define _LINUX_AUDIT_H_

27
#include <linux/types.h>
28
#include <linux/elf-em.h>
29
#include <linux/ptrace.h>
30

31 32 33 34 35 36
/* The netlink messages for the audit system is divided into blocks:
 * 1000 - 1099 are for commanding the audit system
 * 1100 - 1199 user space trusted application messages
 * 1200 - 1299 messages internal to the audit daemon
 * 1300 - 1399 audit event messages
 * 1400 - 1499 SE Linux use
37 38
 * 1500 - 1599 kernel LSPP events
 * 1600 - 1699 kernel crypto events
S
Steve Grubb 已提交
39
 * 1700 - 1799 kernel anomaly records
M
Mimi Zohar 已提交
40 41
 * 1800 - 1899 kernel integrity events
 * 1900 - 1999 future kernel use
42 43 44 45 46 47 48
 * 2000 is for otherwise unclassified kernel audit messages (legacy)
 * 2001 - 2099 unused (kernel)
 * 2100 - 2199 user space anomaly records
 * 2200 - 2299 user space actions taken in response to anomalies
 * 2300 - 2399 user space generated LSPP events
 * 2400 - 2499 user space crypto events
 * 2500 - 2999 future user space (maybe integrity labels and related events)
49
 *
50 51 52
 * Messages from 1000-1199 are bi-directional. 1200-1299 & 2100 - 2999 are
 * exclusively user space. 1300-2099 is kernel --> user space 
 * communication.
53
 */
54 55
#define AUDIT_GET		1000	/* Get status */
#define AUDIT_SET		1001	/* Set status (enable/disable/auditd) */
56 57 58
#define AUDIT_LIST		1002	/* List syscall rules -- deprecated */
#define AUDIT_ADD		1003	/* Add syscall rule -- deprecated */
#define AUDIT_DEL		1004	/* Delete syscall rule -- deprecated */
59
#define AUDIT_USER		1005	/* Message from userspace -- deprecated */
60
#define AUDIT_LOGIN		1006	/* Define the login id and information */
61 62 63 64
#define AUDIT_WATCH_INS		1007	/* Insert file/dir watch entry */
#define AUDIT_WATCH_REM		1008	/* Remove file/dir watch entry */
#define AUDIT_WATCH_LIST	1009	/* List all file/dir watches */
#define AUDIT_SIGNAL_INFO	1010	/* Get info about sender of signal to auditd */
65 66 67
#define AUDIT_ADD_RULE		1011	/* Add syscall filtering rule */
#define AUDIT_DEL_RULE		1012	/* Delete syscall filtering rule */
#define AUDIT_LIST_RULES	1013	/* List syscall filtering rules */
A
Al Viro 已提交
68 69
#define AUDIT_TRIM		1014	/* Trim junk from watched tree */
#define AUDIT_MAKE_EQUIV	1015	/* Append to watched tree */
M
Miloslav Trmac 已提交
70 71
#define AUDIT_TTY_GET		1016	/* Get TTY auditing status */
#define AUDIT_TTY_SET		1017	/* Set TTY auditing status */
72

73 74
#define AUDIT_FIRST_USER_MSG	1100	/* Userspace messages mostly uninteresting to kernel */
#define AUDIT_USER_AVC		1107	/* We filter this differently */
M
Miloslav Trmac 已提交
75
#define AUDIT_USER_TTY		1124	/* Non-ICANON TTY input meaning */
76
#define AUDIT_LAST_USER_MSG	1199
77 78
#define AUDIT_FIRST_USER_MSG2	2100	/* More user space messages */
#define AUDIT_LAST_USER_MSG2	2999
79 80 81 82 83 84 85
 
#define AUDIT_DAEMON_START      1200    /* Daemon startup record */
#define AUDIT_DAEMON_END        1201    /* Daemon normal stop record */
#define AUDIT_DAEMON_ABORT      1202    /* Daemon error stop record */
#define AUDIT_DAEMON_CONFIG     1203    /* Daemon config change */

#define AUDIT_SYSCALL		1300	/* Syscall event */
S
Steve Grubb 已提交
86
/* #define AUDIT_FS_WATCH	1301	 * Deprecated */
87
#define AUDIT_PATH		1302	/* Filename path information */
88
#define AUDIT_IPC		1303	/* IPC record */
89
#define AUDIT_SOCKETCALL	1304	/* sys_socketcall arguments */
90
#define AUDIT_CONFIG_CHANGE	1305	/* Audit system configuration change */
91
#define AUDIT_SOCKADDR		1306	/* sockaddr copied as syscall arg */
92
#define AUDIT_CWD		1307	/* Current working directory */
A
Al Viro 已提交
93
#define AUDIT_EXECVE		1309	/* execve arguments */
S
Steve Grubb 已提交
94
#define AUDIT_IPC_SET_PERM	1311	/* IPC new permissions record type */
95 96 97 98
#define AUDIT_MQ_OPEN		1312	/* POSIX MQ open record type */
#define AUDIT_MQ_SENDRECV	1313	/* POSIX MQ send/receive record type */
#define AUDIT_MQ_NOTIFY		1314	/* POSIX MQ notify record type */
#define AUDIT_MQ_GETSETATTR	1315	/* POSIX MQ get/set attribute record type */
S
Steve Grubb 已提交
99
#define AUDIT_KERNEL_OTHER	1316	/* For use by 3rd party modules */
A
Al Viro 已提交
100
#define AUDIT_FD_PAIR		1317    /* audit record for pipe/socketpair */
A
Al Viro 已提交
101
#define AUDIT_OBJ_PID		1318	/* ptrace target */
M
Miloslav Trmac 已提交
102
#define AUDIT_TTY		1319	/* Input on an administrative TTY */
E
Eric Paris 已提交
103
#define AUDIT_EOE		1320	/* End of multi-record event */
104
#define AUDIT_BPRM_FCAPS	1321	/* Information about fcaps increasing perms */
105
#define AUDIT_CAPSET		1322	/* Record showing argument to sys_capset */
A
Al Viro 已提交
106
#define AUDIT_MMAP		1323	/* Record showing descriptor and flags in mmap */
107
#define AUDIT_NETFILTER_PKT	1324	/* Packets traversing netfilter chains */
108
#define AUDIT_NETFILTER_CFG	1325	/* Netfilter chain modifications */
109 110 111

#define AUDIT_AVC		1400	/* SE Linux avc denial or grant */
#define AUDIT_SELINUX_ERR	1401	/* Internal SE Linux Errors */
112
#define AUDIT_AVC_PATH		1402	/* dentry, vfsmount pair from avc */
S
Steve Grubb 已提交
113 114 115
#define AUDIT_MAC_POLICY_LOAD	1403	/* Policy file load */
#define AUDIT_MAC_STATUS	1404	/* Changed enforcing,permissive,off */
#define AUDIT_MAC_CONFIG_CHANGE	1405	/* Changes to booleans */
116 117 118 119 120
#define AUDIT_MAC_UNLBL_ALLOW	1406	/* NetLabel: allow unlabeled traffic */
#define AUDIT_MAC_CIPSOV4_ADD	1407	/* NetLabel: add CIPSOv4 DOI entry */
#define AUDIT_MAC_CIPSOV4_DEL	1408	/* NetLabel: del CIPSOv4 DOI entry */
#define AUDIT_MAC_MAP_ADD	1409	/* NetLabel: add LSM domain mapping */
#define AUDIT_MAC_MAP_DEL	1410	/* NetLabel: del LSM domain mapping */
J
Joy Latten 已提交
121 122 123 124 125
#define AUDIT_MAC_IPSEC_ADDSA	1411	/* Not used */
#define AUDIT_MAC_IPSEC_DELSA	1412	/* Not used  */
#define AUDIT_MAC_IPSEC_ADDSPD	1413	/* Not used */
#define AUDIT_MAC_IPSEC_DELSPD	1414	/* Not used */
#define AUDIT_MAC_IPSEC_EVENT	1415	/* Audit an IPSec event */
126 127
#define AUDIT_MAC_UNLBL_STCADD	1416	/* NetLabel: add a static label */
#define AUDIT_MAC_UNLBL_STCDEL	1417	/* NetLabel: del a static label */
128

S
Steve Grubb 已提交
129 130 131
#define AUDIT_FIRST_KERN_ANOM_MSG   1700
#define AUDIT_LAST_KERN_ANOM_MSG    1799
#define AUDIT_ANOM_PROMISCUOUS      1700 /* Device changed promiscuous mode */
S
Steve Grubb 已提交
132
#define AUDIT_ANOM_ABEND            1701 /* Process ended abnormally */
133
#define AUDIT_ANOM_LINK		    1702 /* Suspicious use of file links */
134 135 136 137 138
#define AUDIT_INTEGRITY_DATA	    1800 /* Data integrity verification */
#define AUDIT_INTEGRITY_METADATA    1801 /* Metadata integrity verification */
#define AUDIT_INTEGRITY_STATUS	    1802 /* Integrity enable status */
#define AUDIT_INTEGRITY_HASH	    1803 /* Integrity HASH type */
#define AUDIT_INTEGRITY_PCR	    1804 /* PCR invalidation msgs */
M
Mimi Zohar 已提交
139
#define AUDIT_INTEGRITY_RULE	    1805 /* policy rule */
S
Steve Grubb 已提交
140

141
#define AUDIT_KERNEL		2000	/* Asynchronous audit record. NOT A REQUEST. */
L
Linus Torvalds 已提交
142 143

/* Rule flags */
144 145 146 147 148
#define AUDIT_FILTER_USER	0x00	/* Apply rule to user-generated messages */
#define AUDIT_FILTER_TASK	0x01	/* Apply rule at task creation (not syscall) */
#define AUDIT_FILTER_ENTRY	0x02	/* Apply rule at syscall entry */
#define AUDIT_FILTER_WATCH	0x03	/* Apply rule to file system watches */
#define AUDIT_FILTER_EXIT	0x04	/* Apply rule at syscall exit */
149
#define AUDIT_FILTER_TYPE	0x05	/* Apply rule at audit_log_start */
150

151
#define AUDIT_NR_FILTERS	6
152 153

#define AUDIT_FILTER_PREPEND	0x10	/* Prepend to front of list */
L
Linus Torvalds 已提交
154 155 156 157 158 159 160 161 162

/* Rule actions */
#define AUDIT_NEVER    0	/* Do not build context if rule matches */
#define AUDIT_POSSIBLE 1	/* Build context if rule matches  */
#define AUDIT_ALWAYS   2	/* Generate audit record if rule matches */

/* Rule structure sizes -- if these change, different AUDIT_ADD and
 * AUDIT_LIST commands must be implemented. */
#define AUDIT_MAX_FIELDS   64
163
#define AUDIT_MAX_KEY_LEN  256
L
Linus Torvalds 已提交
164 165 166 167
#define AUDIT_BITMASK_SIZE 64
#define AUDIT_WORD(nr) ((__u32)((nr)/32))
#define AUDIT_BIT(nr)  (1 << ((nr) - AUDIT_WORD(nr)*32))

A
Al Viro 已提交
168 169 170 171 172
#define AUDIT_SYSCALL_CLASSES 16
#define AUDIT_CLASS_DIR_WRITE 0
#define AUDIT_CLASS_DIR_WRITE_32 1
#define AUDIT_CLASS_CHATTR 2
#define AUDIT_CLASS_CHATTR_32 3
173 174 175 176
#define AUDIT_CLASS_READ 4
#define AUDIT_CLASS_READ_32 5
#define AUDIT_CLASS_WRITE 6
#define AUDIT_CLASS_WRITE_32 7
177 178
#define AUDIT_CLASS_SIGNAL 8
#define AUDIT_CLASS_SIGNAL_32 9
A
Al Viro 已提交
179

180 181 182 183
/* This bitmask is used to validate user input.  It represents all bits that
 * are currently used in an audit field constant understood by the kernel.
 * If you are adding a new #define AUDIT_<whatever>, please ensure that
 * AUDIT_UNUSED_BITS is updated if need be. */
184
#define AUDIT_UNUSED_BITS	0x07FFFC00
185

186 187
/* AUDIT_FIELD_COMPARE rule list */
#define AUDIT_COMPARE_UID_TO_OBJ_UID	1
188
#define AUDIT_COMPARE_GID_TO_OBJ_GID	2
189 190 191 192 193 194 195 196
#define AUDIT_COMPARE_EUID_TO_OBJ_UID	3
#define AUDIT_COMPARE_EGID_TO_OBJ_GID	4
#define AUDIT_COMPARE_AUID_TO_OBJ_UID	5
#define AUDIT_COMPARE_SUID_TO_OBJ_UID	6
#define AUDIT_COMPARE_SGID_TO_OBJ_GID	7
#define AUDIT_COMPARE_FSUID_TO_OBJ_UID	8
#define AUDIT_COMPARE_FSGID_TO_OBJ_GID	9

197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
#define AUDIT_COMPARE_UID_TO_AUID	10
#define AUDIT_COMPARE_UID_TO_EUID	11
#define AUDIT_COMPARE_UID_TO_FSUID	12
#define AUDIT_COMPARE_UID_TO_SUID	13

#define AUDIT_COMPARE_AUID_TO_FSUID	14
#define AUDIT_COMPARE_AUID_TO_SUID	15
#define AUDIT_COMPARE_AUID_TO_EUID	16

#define AUDIT_COMPARE_EUID_TO_SUID	17
#define AUDIT_COMPARE_EUID_TO_FSUID	18

#define AUDIT_COMPARE_SUID_TO_FSUID	19

#define AUDIT_COMPARE_GID_TO_EGID	20
#define AUDIT_COMPARE_GID_TO_FSGID	21
#define AUDIT_COMPARE_GID_TO_SGID	22

#define AUDIT_COMPARE_EGID_TO_FSGID	23
#define AUDIT_COMPARE_EGID_TO_SGID	24
#define AUDIT_COMPARE_SGID_TO_FSGID	25

#define AUDIT_MAX_FIELD_COMPARE		AUDIT_COMPARE_SGID_TO_FSGID
220

L
Linus Torvalds 已提交
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
/* Rule fields */
				/* These are useful when checking the
				 * task structure at task creation time
				 * (AUDIT_PER_TASK).  */
#define AUDIT_PID	0
#define AUDIT_UID	1
#define AUDIT_EUID	2
#define AUDIT_SUID	3
#define AUDIT_FSUID	4
#define AUDIT_GID	5
#define AUDIT_EGID	6
#define AUDIT_SGID	7
#define AUDIT_FSGID	8
#define AUDIT_LOGINUID	9
#define AUDIT_PERS	10
236
#define AUDIT_ARCH	11
237
#define AUDIT_MSGTYPE	12
238 239 240 241 242
#define AUDIT_SUBJ_USER	13	/* security label user */
#define AUDIT_SUBJ_ROLE	14	/* security label role */
#define AUDIT_SUBJ_TYPE	15	/* security label type */
#define AUDIT_SUBJ_SEN	16	/* security label sensitivity label */
#define AUDIT_SUBJ_CLR	17	/* security label clearance label */
A
Al Viro 已提交
243
#define AUDIT_PPID	18
244 245 246 247 248
#define AUDIT_OBJ_USER	19
#define AUDIT_OBJ_ROLE	20
#define AUDIT_OBJ_TYPE	21
#define AUDIT_OBJ_LEV_LOW	22
#define AUDIT_OBJ_LEV_HIGH	23
L
Linus Torvalds 已提交
249 250 251 252 253 254 255 256

				/* These are ONLY useful when checking
				 * at syscall exit time (AUDIT_AT_EXIT). */
#define AUDIT_DEVMAJOR	100
#define AUDIT_DEVMINOR	101
#define AUDIT_INODE	102
#define AUDIT_EXIT	103
#define AUDIT_SUCCESS   104	/* exit >= 0; value ignored */
A
Amy Griffis 已提交
257
#define AUDIT_WATCH	105
A
Al Viro 已提交
258
#define AUDIT_PERM	106
A
Al Viro 已提交
259
#define AUDIT_DIR	107
A
Al Viro 已提交
260
#define AUDIT_FILETYPE	108
E
Eric Paris 已提交
261
#define AUDIT_OBJ_UID	109
262
#define AUDIT_OBJ_GID	110
263
#define AUDIT_FIELD_COMPARE	111
L
Linus Torvalds 已提交
264 265 266 267 268 269

#define AUDIT_ARG0      200
#define AUDIT_ARG1      (AUDIT_ARG0+1)
#define AUDIT_ARG2      (AUDIT_ARG0+2)
#define AUDIT_ARG3      (AUDIT_ARG0+3)

A
Amy Griffis 已提交
270 271
#define AUDIT_FILTERKEY	210

272 273 274
#define AUDIT_NEGATE			0x80000000

/* These are the supported operators.
275 276 277 278 279 280 281 282 283 284 285 286 287
 *	4  2  1  8
 *	=  >  <  ?
 *	----------
 *	0  0  0	 0	00	nonsense
 *	0  0  0	 1	08	&  bit mask
 *	0  0  1	 0	10	<
 *	0  1  0	 0	20	>
 *	0  1  1	 0	30	!=
 *	1  0  0	 0	40	=
 *	1  0  0	 1	48	&=  bit test
 *	1  0  1	 0	50	<=
 *	1  1  0	 0	60	>=
 *	1  1  1	 1	78	all operators
288
 */
289
#define AUDIT_BIT_MASK			0x08000000
290 291 292 293
#define AUDIT_LESS_THAN			0x10000000
#define AUDIT_GREATER_THAN		0x20000000
#define AUDIT_NOT_EQUAL			0x30000000
#define AUDIT_EQUAL			0x40000000
294
#define AUDIT_BIT_TEST			(AUDIT_BIT_MASK|AUDIT_EQUAL)
295 296
#define AUDIT_LESS_THAN_OR_EQUAL	(AUDIT_LESS_THAN|AUDIT_EQUAL)
#define AUDIT_GREATER_THAN_OR_EQUAL	(AUDIT_GREATER_THAN|AUDIT_EQUAL)
297
#define AUDIT_OPERATORS			(AUDIT_EQUAL|AUDIT_NOT_EQUAL|AUDIT_BIT_MASK)
L
Linus Torvalds 已提交
298

299 300 301 302 303 304 305 306 307 308 309 310
enum {
	Audit_equal,
	Audit_not_equal,
	Audit_bitmask,
	Audit_bittest,
	Audit_lt,
	Audit_gt,
	Audit_le,
	Audit_ge,
	Audit_bad
};

L
Linus Torvalds 已提交
311 312 313 314 315 316 317 318 319 320 321 322
/* Status symbols */
				/* Mask values */
#define AUDIT_STATUS_ENABLED		0x0001
#define AUDIT_STATUS_FAILURE		0x0002
#define AUDIT_STATUS_PID		0x0004
#define AUDIT_STATUS_RATE_LIMIT		0x0008
#define AUDIT_STATUS_BACKLOG_LIMIT	0x0010
				/* Failure-to-log actions */
#define AUDIT_FAIL_SILENT	0
#define AUDIT_FAIL_PRINTK	1
#define AUDIT_FAIL_PANIC	2

323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
/* distinguish syscall tables */
#define __AUDIT_ARCH_64BIT 0x80000000
#define __AUDIT_ARCH_LE	   0x40000000
#define AUDIT_ARCH_ALPHA	(EM_ALPHA|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_ARM		(EM_ARM|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_ARMEB	(EM_ARM)
#define AUDIT_ARCH_CRIS		(EM_CRIS|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_FRV		(EM_FRV)
#define AUDIT_ARCH_H8300	(EM_H8_300)
#define AUDIT_ARCH_I386		(EM_386|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_IA64		(EM_IA_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_M32R		(EM_M32R)
#define AUDIT_ARCH_M68K		(EM_68K)
#define AUDIT_ARCH_MIPS		(EM_MIPS)
#define AUDIT_ARCH_MIPSEL	(EM_MIPS|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_MIPS64	(EM_MIPS|__AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_MIPSEL64	(EM_MIPS|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
K
Kees Cook 已提交
340
#define AUDIT_ARCH_OPENRISC	(EM_OPENRISC)
341 342 343 344 345 346 347 348 349 350 351
#define AUDIT_ARCH_PARISC	(EM_PARISC)
#define AUDIT_ARCH_PARISC64	(EM_PARISC|__AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_PPC		(EM_PPC)
#define AUDIT_ARCH_PPC64	(EM_PPC64|__AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_S390		(EM_S390)
#define AUDIT_ARCH_S390X	(EM_S390|__AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_SH		(EM_SH)
#define AUDIT_ARCH_SHEL		(EM_SH|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_SH64		(EM_SH|__AUDIT_ARCH_64BIT)
#define AUDIT_ARCH_SHEL64	(EM_SH|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)
#define AUDIT_ARCH_SPARC	(EM_SPARC)
352
#define AUDIT_ARCH_SPARC64	(EM_SPARCV9|__AUDIT_ARCH_64BIT)
353 354
#define AUDIT_ARCH_X86_64	(EM_X86_64|__AUDIT_ARCH_64BIT|__AUDIT_ARCH_LE)

A
Al Viro 已提交
355 356 357 358 359
#define AUDIT_PERM_EXEC		1
#define AUDIT_PERM_WRITE	2
#define AUDIT_PERM_READ		4
#define AUDIT_PERM_ATTR		8

L
Linus Torvalds 已提交
360 361
struct audit_status {
	__u32		mask;		/* Bit mask for valid entries */
S
Steve Grubb 已提交
362
	__u32		enabled;	/* 1 = enabled, 0 = disabled */
L
Linus Torvalds 已提交
363 364 365 366 367 368 369 370
	__u32		failure;	/* Failure-to-log action */
	__u32		pid;		/* pid of auditd process */
	__u32		rate_limit;	/* messages rate limit (per second) */
	__u32		backlog_limit;	/* waiting messages limit */
	__u32		lost;		/* messages lost */
	__u32		backlog;	/* messages waiting in queue */
};

M
Miloslav Trmac 已提交
371 372 373 374
struct audit_tty_status {
	__u32		enabled; /* 1 = enabled, 0 = disabled */
};

375 376 377 378 379 380 381 382
/* audit_rule_data supports filter rules with both integer and string
 * fields.  It corresponds with AUDIT_ADD_RULE, AUDIT_DEL_RULE and
 * AUDIT_LIST_RULES requests.
 */
struct audit_rule_data {
	__u32		flags;	/* AUDIT_PER_{TASK,CALL}, AUDIT_PREPEND */
	__u32		action;	/* AUDIT_NEVER, AUDIT_POSSIBLE, AUDIT_ALWAYS */
	__u32		field_count;
S
Steve Grubb 已提交
383
	__u32		mask[AUDIT_BITMASK_SIZE]; /* syscall(s) affected */
384 385 386 387 388 389 390 391 392 393 394
	__u32		fields[AUDIT_MAX_FIELDS];
	__u32		values[AUDIT_MAX_FIELDS];
	__u32		fieldflags[AUDIT_MAX_FIELDS];
	__u32		buflen;	/* total length of string fields */
	char		buf[0];	/* string fields buffer */
};

/* audit_rule is supported to maintain backward compatibility with
 * userspace.  It supports integer fields only and corresponds to
 * AUDIT_ADD, AUDIT_DEL and AUDIT_LIST requests.
 */
L
Linus Torvalds 已提交
395 396 397 398 399 400 401 402 403 404
struct audit_rule {		/* for AUDIT_LIST, AUDIT_ADD, and AUDIT_DEL */
	__u32		flags;	/* AUDIT_PER_{TASK,CALL}, AUDIT_PREPEND */
	__u32		action;	/* AUDIT_NEVER, AUDIT_POSSIBLE, AUDIT_ALWAYS */
	__u32		field_count;
	__u32		mask[AUDIT_BITMASK_SIZE];
	__u32		fields[AUDIT_MAX_FIELDS];
	__u32		values[AUDIT_MAX_FIELDS];
};

#ifdef __KERNEL__
405
#include <linux/sched.h>
L
Linus Torvalds 已提交
406

407 408 409
struct audit_sig_info {
	uid_t		uid;
	pid_t		pid;
410
	char		ctx[0];
411 412
};

L
Linus Torvalds 已提交
413 414 415
struct audit_buffer;
struct audit_context;
struct inode;
416
struct netlink_skb_parms;
A
Alexey Dobriyan 已提交
417
struct path;
A
Al Viro 已提交
418
struct linux_binprm;
419 420
struct mq_attr;
struct mqstat;
421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
struct audit_watch;
struct audit_tree;

struct audit_krule {
	int			vers_ops;
	u32			flags;
	u32			listnr;
	u32			action;
	u32			mask[AUDIT_BITMASK_SIZE];
	u32			buflen; /* for data alloc on list rules */
	u32			field_count;
	char			*filterkey; /* ties events to rules */
	struct audit_field	*fields;
	struct audit_field	*arch_f; /* quick access to arch field */
	struct audit_field	*inode_f; /* quick access to an inode field */
	struct audit_watch	*watch;	/* associated watch */
	struct audit_tree	*tree;	/* associated watched tree */
	struct list_head	rlist;	/* entry in audit_{watch,tree}.rules list */
A
Al Viro 已提交
439
	struct list_head	list;	/* for AUDIT_LIST* purposes only */
440
	u64			prio;
441 442 443 444 445
};

struct audit_field {
	u32				type;
	u32				val;
446 447
	kuid_t				uid;
	kgid_t				gid;
448
	u32				op;
449 450
	char				*lsm_str;
	void				*lsm_rule;
451
};
L
Linus Torvalds 已提交
452

A
Al Viro 已提交
453
extern int __init audit_register_class(int class, unsigned *list);
A
Al Viro 已提交
454
extern int audit_classify_syscall(int abi, unsigned syscall);
A
Amy Griffis 已提交
455
extern int audit_classify_arch(int arch);
456 457 458 459

/* audit_names->type values */
#define	AUDIT_TYPE_UNKNOWN	0	/* we don't know yet */
#define	AUDIT_TYPE_NORMAL	1	/* a "normal" audit record */
460
#define	AUDIT_TYPE_PARENT	2	/* a parent audit record */
461 462
#define	AUDIT_TYPE_CHILD_DELETE 3	/* a child being deleted */
#define	AUDIT_TYPE_CHILD_CREATE 4	/* a child being created */
463

464 465
struct filename;

L
Linus Torvalds 已提交
466 467 468 469
#ifdef CONFIG_AUDITSYSCALL
/* These are defined in auditsc.c */
				/* Public API */
extern int  audit_alloc(struct task_struct *task);
470
extern void __audit_free(struct task_struct *task);
471 472 473
extern void __audit_syscall_entry(int arch,
				  int major, unsigned long a0, unsigned long a1,
				  unsigned long a2, unsigned long a3);
474
extern void __audit_syscall_exit(int ret_success, long ret_value);
475
extern struct filename *__audit_reusename(const __user char *uptr);
476 477
extern void __audit_getname(struct filename *name);
extern void audit_putname(struct filename *name);
478
extern void __audit_inode(struct filename *name, const struct dentry *dentry,
479
				unsigned int parent);
480
extern void __audit_inode_child(const struct inode *parent,
481 482
				const struct dentry *dentry,
				const unsigned char type);
483
extern void __audit_seccomp(unsigned long syscall, long signr, int code);
A
Al Viro 已提交
484 485
extern void __audit_ptrace(struct task_struct *t);

486 487 488 489 490
static inline int audit_dummy_context(void)
{
	void *p = current->audit_context;
	return !p || *(int *)p;
}
491 492 493 494 495
static inline void audit_free(struct task_struct *task)
{
	if (unlikely(task->audit_context))
		__audit_free(task);
}
496 497 498 499 500 501 502
static inline void audit_syscall_entry(int arch, int major, unsigned long a0,
				       unsigned long a1, unsigned long a2,
				       unsigned long a3)
{
	if (unlikely(!audit_dummy_context()))
		__audit_syscall_entry(arch, major, a0, a1, a2, a3);
}
503 504 505 506 507 508 509 510 511
static inline void audit_syscall_exit(void *pt_regs)
{
	if (unlikely(current->audit_context)) {
		int success = is_syscall_success(pt_regs);
		int return_code = regs_return_value(pt_regs);

		__audit_syscall_exit(success, return_code);
	}
}
512 513 514 515 516 517
static inline struct filename *audit_reusename(const __user char *name)
{
	if (unlikely(!audit_dummy_context()))
		return __audit_reusename(name);
	return NULL;
}
518
static inline void audit_getname(struct filename *name)
A
Al Viro 已提交
519
{
520
	if (unlikely(!audit_dummy_context()))
A
Al Viro 已提交
521 522
		__audit_getname(name);
}
523
static inline void audit_inode(struct filename *name, const struct dentry *dentry,
524
				unsigned int parent) {
525
	if (unlikely(!audit_dummy_context()))
526
		__audit_inode(name, dentry, parent);
527
}
528
static inline void audit_inode_child(const struct inode *parent,
529 530
				     const struct dentry *dentry,
				     const unsigned char type) {
531
	if (unlikely(!audit_dummy_context()))
532
		__audit_inode_child(parent, dentry, type);
533
}
S
Steve Grubb 已提交
534
void audit_core_dumps(long signr);
L
Linus Torvalds 已提交
535

536
static inline void audit_seccomp(unsigned long syscall, long signr, int code)
537 538
{
	if (unlikely(!audit_dummy_context()))
539
		__audit_seccomp(syscall, signr, code);
540 541
}

A
Al Viro 已提交
542 543 544 545 546 547
static inline void audit_ptrace(struct task_struct *t)
{
	if (unlikely(!audit_dummy_context()))
		__audit_ptrace(t);
}

L
Linus Torvalds 已提交
548
				/* Private API (for audit.c only) */
549
extern unsigned int audit_serial(void);
550
extern int auditsc_get_stamp(struct audit_context *ctx,
551
			      struct timespec *t, unsigned int *serial);
K
Kees Cook 已提交
552 553 554 555 556 557 558 559 560 561 562 563
extern int audit_set_loginuid(kuid_t loginuid);

static inline kuid_t audit_get_loginuid(struct task_struct *tsk)
{
	return tsk->loginuid;
}

static inline int audit_get_sessionid(struct task_struct *tsk)
{
	return tsk->sessionid;
}

J
Joy Latten 已提交
564
extern void audit_log_task_context(struct audit_buffer *ab);
P
Peter Moody 已提交
565
extern void audit_log_task_info(struct audit_buffer *ab, struct task_struct *tsk);
A
Al Viro 已提交
566
extern void __audit_ipc_obj(struct kern_ipc_perm *ipcp);
A
Al Viro 已提交
567
extern void __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode);
568 569 570
extern int __audit_bprm(struct linux_binprm *bprm);
extern void __audit_socketcall(int nargs, unsigned long *args);
extern int __audit_sockaddr(int len, void *addr);
A
Al Viro 已提交
571
extern void __audit_fd_pair(int fd1, int fd2);
A
Al Viro 已提交
572
extern void __audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr);
A
Al Viro 已提交
573
extern void __audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout);
A
Al Viro 已提交
574
extern void __audit_mq_notify(mqd_t mqdes, const struct sigevent *notification);
A
Al Viro 已提交
575
extern void __audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat);
D
David Howells 已提交
576 577 578
extern int __audit_log_bprm_fcaps(struct linux_binprm *bprm,
				  const struct cred *new,
				  const struct cred *old);
A
Al Viro 已提交
579
extern void __audit_log_capset(pid_t pid, const struct cred *new, const struct cred *old);
A
Al Viro 已提交
580
extern void __audit_mmap_fd(int fd, int flags);
A
Al Viro 已提交
581

A
Al Viro 已提交
582
static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp)
A
Al Viro 已提交
583
{
584
	if (unlikely(!audit_dummy_context()))
A
Al Viro 已提交
585
		__audit_ipc_obj(ipcp);
A
Al Viro 已提交
586
}
A
Al Viro 已提交
587
static inline void audit_fd_pair(int fd1, int fd2)
A
Al Viro 已提交
588
{
589
	if (unlikely(!audit_dummy_context()))
A
Al Viro 已提交
590
		__audit_fd_pair(fd1, fd2);
A
Al Viro 已提交
591
}
A
Al Viro 已提交
592
static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, umode_t mode)
593
{
594
	if (unlikely(!audit_dummy_context()))
A
Al Viro 已提交
595
		__audit_ipc_set_perm(qbytes, uid, gid, mode);
596
}
597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613
static inline int audit_bprm(struct linux_binprm *bprm)
{
	if (unlikely(!audit_dummy_context()))
		return __audit_bprm(bprm);
	return 0;
}
static inline void audit_socketcall(int nargs, unsigned long *args)
{
	if (unlikely(!audit_dummy_context()))
		__audit_socketcall(nargs, args);
}
static inline int audit_sockaddr(int len, void *addr)
{
	if (unlikely(!audit_dummy_context()))
		return __audit_sockaddr(len, addr);
	return 0;
}
A
Al Viro 已提交
614
static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)
615
{
616
	if (unlikely(!audit_dummy_context()))
A
Al Viro 已提交
617
		__audit_mq_open(oflag, mode, attr);
618
}
A
Al Viro 已提交
619
static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len, unsigned int msg_prio, const struct timespec *abs_timeout)
620
{
621
	if (unlikely(!audit_dummy_context()))
A
Al Viro 已提交
622
		__audit_mq_sendrecv(mqdes, msg_len, msg_prio, abs_timeout);
623
}
A
Al Viro 已提交
624
static inline void audit_mq_notify(mqd_t mqdes, const struct sigevent *notification)
625
{
626
	if (unlikely(!audit_dummy_context()))
A
Al Viro 已提交
627
		__audit_mq_notify(mqdes, notification);
628
}
A
Al Viro 已提交
629
static inline void audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
630
{
631
	if (unlikely(!audit_dummy_context()))
A
Al Viro 已提交
632
		__audit_mq_getsetattr(mqdes, mqstat);
633
}
634

D
David Howells 已提交
635 636 637
static inline int audit_log_bprm_fcaps(struct linux_binprm *bprm,
				       const struct cred *new,
				       const struct cred *old)
638 639
{
	if (unlikely(!audit_dummy_context()))
D
David Howells 已提交
640 641
		return __audit_log_bprm_fcaps(bprm, new, old);
	return 0;
642 643
}

A
Al Viro 已提交
644
static inline void audit_log_capset(pid_t pid, const struct cred *new,
D
David Howells 已提交
645
				   const struct cred *old)
646 647
{
	if (unlikely(!audit_dummy_context()))
A
Al Viro 已提交
648
		__audit_log_capset(pid, new, old);
649 650
}

A
Al Viro 已提交
651 652 653 654 655 656
static inline void audit_mmap_fd(int fd, int flags)
{
	if (unlikely(!audit_dummy_context()))
		__audit_mmap_fd(fd, flags);
}

A
Al Viro 已提交
657
extern int audit_n_rules;
A
Amy Griffis 已提交
658
extern int audit_signals;
659
#else /* CONFIG_AUDITSYSCALL */
K
Kees Cook 已提交
660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675
static inline int audit_alloc(struct task_struct *task)
{
	return 0;
}
static inline void audit_free(struct task_struct *task)
{ }
static inline void audit_syscall_entry(int arch, int major, unsigned long a0,
				       unsigned long a1, unsigned long a2,
				       unsigned long a3)
{ }
static inline void audit_syscall_exit(void *pt_regs)
{ }
static inline int audit_dummy_context(void)
{
	return 1;
}
676 677 678 679
static inline struct filename *audit_reusename(const __user char *name)
{
	return NULL;
}
680
static inline void audit_getname(struct filename *name)
K
Kees Cook 已提交
681
{ }
682
static inline void audit_putname(struct filename *name)
K
Kees Cook 已提交
683
{ }
684 685
static inline void __audit_inode(struct filename *name,
					const struct dentry *dentry,
686
					unsigned int parent)
K
Kees Cook 已提交
687
{ }
688
static inline void __audit_inode_child(const struct inode *parent,
689 690
					const struct dentry *dentry,
					const unsigned char type)
K
Kees Cook 已提交
691
{ }
692 693
static inline void audit_inode(struct filename *name,
				const struct dentry *dentry,
694
				unsigned int parent)
K
Kees Cook 已提交
695
{ }
696
static inline void audit_inode_child(const struct inode *parent,
697 698
				     const struct dentry *dentry,
				     const unsigned char type)
K
Kees Cook 已提交
699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764
{ }
static inline void audit_core_dumps(long signr)
{ }
static inline void __audit_seccomp(unsigned long syscall, long signr, int code)
{ }
static inline void audit_seccomp(unsigned long syscall, long signr, int code)
{ }
static inline int auditsc_get_stamp(struct audit_context *ctx,
			      struct timespec *t, unsigned int *serial)
{
	return 0;
}
static inline kuid_t audit_get_loginuid(struct task_struct *tsk)
{
	return INVALID_UID;
}
static inline int audit_get_sessionid(struct task_struct *tsk)
{
	return -1;
}
static inline void audit_log_task_context(struct audit_buffer *ab)
{ }
static inline void audit_log_task_info(struct audit_buffer *ab,
				       struct task_struct *tsk)
{ }
static inline void audit_ipc_obj(struct kern_ipc_perm *ipcp)
{ }
static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid,
					gid_t gid, umode_t mode)
{ }
static inline int audit_bprm(struct linux_binprm *bprm)
{
	return 0;
}
static inline void audit_socketcall(int nargs, unsigned long *args)
{ }
static inline void audit_fd_pair(int fd1, int fd2)
{ }
static inline int audit_sockaddr(int len, void *addr)
{
	return 0;
}
static inline void audit_mq_open(int oflag, umode_t mode, struct mq_attr *attr)
{ }
static inline void audit_mq_sendrecv(mqd_t mqdes, size_t msg_len,
				     unsigned int msg_prio,
				     const struct timespec *abs_timeout)
{ }
static inline void audit_mq_notify(mqd_t mqdes,
				   const struct sigevent *notification)
{ }
static inline void audit_mq_getsetattr(mqd_t mqdes, struct mq_attr *mqstat)
{ }
static inline int audit_log_bprm_fcaps(struct linux_binprm *bprm,
				       const struct cred *new,
				       const struct cred *old)
{
	return 0;
}
static inline void audit_log_capset(pid_t pid, const struct cred *new,
				   const struct cred *old)
{ }
static inline void audit_mmap_fd(int fd, int flags)
{ }
static inline void audit_ptrace(struct task_struct *t)
{ }
A
Al Viro 已提交
765
#define audit_n_rules 0
A
Amy Griffis 已提交
766
#define audit_signals 0
767
#endif /* CONFIG_AUDITSYSCALL */
L
Linus Torvalds 已提交
768 769 770 771

#ifdef CONFIG_AUDIT
/* These are defined in audit.c */
				/* Public API */
772 773 774
extern __printf(4, 5)
void audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type,
	       const char *fmt, ...);
L
Linus Torvalds 已提交
775

A
Al Viro 已提交
776
extern struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type);
777 778
extern __printf(2, 3)
void audit_log_format(struct audit_buffer *ab, const char *fmt, ...);
L
Linus Torvalds 已提交
779
extern void		    audit_log_end(struct audit_buffer *ab);
780 781
extern int		    audit_string_contains_control(const char *string,
							  size_t len);
782 783 784 785 786 787 788 789 790
extern void		    audit_log_n_hex(struct audit_buffer *ab,
					  const unsigned char *buf,
					  size_t len);
extern void		    audit_log_n_string(struct audit_buffer *ab,
					       const char *buf,
					       size_t n);
extern void		    audit_log_n_untrustedstring(struct audit_buffer *ab,
							const char *string,
							size_t n);
791
extern void		    audit_log_untrustedstring(struct audit_buffer *ab,
792
						      const char *string);
L
Linus Torvalds 已提交
793 794
extern void		    audit_log_d_path(struct audit_buffer *ab,
					     const char *prefix,
795
					     const struct path *path);
796 797
extern void		    audit_log_key(struct audit_buffer *ab,
					  char *key);
798 799
extern void		    audit_log_link_denied(const char *operation,
						  struct path *link);
M
Miloslav Trmac 已提交
800
extern void		    audit_log_lost(const char *message);
801 802 803
#ifdef CONFIG_SECURITY
extern void 		    audit_log_secctx(struct audit_buffer *ab, u32 secid);
#else
K
Kees Cook 已提交
804 805
static inline void	    audit_log_secctx(struct audit_buffer *ab, u32 secid)
{ }
806 807
#endif

808 809
extern int		    audit_update_lsm_rules(void);

810
				/* Private API (for audit.c only) */
811
extern int audit_filter_user(void);
812
extern int audit_filter_type(int type);
813
extern int  audit_receive_filter(int type, int pid, int seq,
814
				void *data, size_t datasz, kuid_t loginuid,
815
				u32 sessionid, u32 sid);
M
Miloslav Trmac 已提交
816
extern int audit_enabled;
K
Kees Cook 已提交
817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854
#else /* CONFIG_AUDIT */
static inline __printf(4, 5)
void audit_log(struct audit_context *ctx, gfp_t gfp_mask, int type,
	       const char *fmt, ...)
{ }
static inline struct audit_buffer *audit_log_start(struct audit_context *ctx,
						   gfp_t gfp_mask, int type)
{
	return NULL;
}
static inline __printf(2, 3)
void audit_log_format(struct audit_buffer *ab, const char *fmt, ...)
{ }
static inline void audit_log_end(struct audit_buffer *ab)
{ }
static inline void audit_log_n_hex(struct audit_buffer *ab,
				   const unsigned char *buf, size_t len)
{ }
static inline void audit_log_n_string(struct audit_buffer *ab,
				      const char *buf, size_t n)
{ }
static inline void  audit_log_n_untrustedstring(struct audit_buffer *ab,
						const char *string, size_t n)
{ }
static inline void audit_log_untrustedstring(struct audit_buffer *ab,
					     const char *string)
{ }
static inline void audit_log_d_path(struct audit_buffer *ab,
				    const char *prefix,
				    const struct path *path)
{ }
static inline void audit_log_key(struct audit_buffer *ab, char *key)
{ }
static inline void audit_log_link_denied(const char *string,
					 const struct path *link)
{ }
static inline void audit_log_secctx(struct audit_buffer *ab, u32 secid)
{ }
M
Miloslav Trmac 已提交
855
#define audit_enabled 0
K
Kees Cook 已提交
856 857 858 859 860 861
#endif /* CONFIG_AUDIT */
static inline void audit_log_string(struct audit_buffer *ab, const char *buf)
{
	audit_log_n_string(ab, buf, strlen(buf));
}

L
Linus Torvalds 已提交
862 863
#endif
#endif