Blame view

kernel/audit.h 10.3 KB
1a59d1b8e   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-or-later */
fe7752bab   David Woodhouse   [PATCH] Fix audit...
2
3
4
5
6
  /* audit -- definition of audit_context structure and supporting types 
   *
   * Copyright 2003-2004 Red Hat, Inc.
   * Copyright 2005 Hewlett-Packard Development Company, L.P.
   * Copyright 2005 IBM Corporation
fe7752bab   David Woodhouse   [PATCH] Fix audit...
7
8
9
10
   */
  
  #include <linux/fs.h>
  #include <linux/audit.h>
9044e6bca   Al Viro   [PATCH] fix deadl...
11
  #include <linux/skbuff.h>
b24a30a73   Eric Paris   audit: fix event ...
12
  #include <uapi/linux/mqueue.h>
3f5be2da8   Richard Guy Briggs   audit: move audit...
13
  #include <linux/tty.h>
fe7752bab   David Woodhouse   [PATCH] Fix audit...
14

b24a30a73   Eric Paris   audit: fix event ...
15
16
17
18
  /* AUDIT_NAMES is the number of slots we reserve in the audit_context
   * for saving names from getname().  If we get more names we will allocate
   * a name dynamically and also add those to the list anchored by names_list. */
  #define AUDIT_NAMES	5
fe7752bab   David Woodhouse   [PATCH] Fix audit...
19
20
21
22
23
24
25
  /* At task start time, the audit_state is set in the audit_context using
     a per-task filter.  At syscall entry, the audit_state is augmented by
     the syscall filter. */
  enum audit_state {
  	AUDIT_DISABLED,		/* Do not create per-task audit_context.
  				 * No syscall-specific audit records can
  				 * be generated. */
fe7752bab   David Woodhouse   [PATCH] Fix audit...
26
  	AUDIT_BUILD_CONTEXT,	/* Create the per-task audit_context,
997f5b644   Eric Paris   audit: remove AUD...
27
  				 * and fill it in at syscall
fe7752bab   David Woodhouse   [PATCH] Fix audit...
28
29
30
31
32
33
34
35
36
37
38
  				 * entry time.  This makes a full
  				 * syscall record available if some
  				 * other part of the kernel decides it
  				 * should be recorded. */
  	AUDIT_RECORD_CONTEXT	/* Create the per-task audit_context,
  				 * always fill it in at syscall entry
  				 * time, and always write out the audit
  				 * record at syscall exit time.  */
  };
  
  /* Rule lists */
cfcad62c7   Eric Paris   audit: seperate a...
39
  struct audit_watch;
7f4929428   Richard Guy Briggs   audit: clean simp...
40
  struct audit_fsnotify_mark;
74c3cbe33   Al Viro   [PATCH] audit: wa...
41
42
  struct audit_tree;
  struct audit_chunk;
fe7752bab   David Woodhouse   [PATCH] Fix audit...
43
  struct audit_entry {
93315ed6d   Amy Griffis   [PATCH] audit str...
44
45
46
  	struct list_head	list;
  	struct rcu_head		rcu;
  	struct audit_krule	rule;
fe7752bab   David Woodhouse   [PATCH] Fix audit...
47
  };
b24a30a73   Eric Paris   audit: fix event ...
48
49
50
51
52
53
54
  struct audit_cap_data {
  	kernel_cap_t		permitted;
  	kernel_cap_t		inheritable;
  	union {
  		unsigned int	fE;		/* effective bit of file cap */
  		kernel_cap_t	effective;	/* effective set of process */
  	};
7786f6b6d   Richard Guy Briggs   audit: add ambien...
55
  	kernel_cap_t		ambient;
2fec30e24   Richard Guy Briggs   audit: add suppor...
56
  	kuid_t			rootid;
b24a30a73   Eric Paris   audit: fix event ...
57
  };
55422d0bd   Paul Moore   audit: replace ge...
58
59
  /* When fs/namei.c:getname() is called, we store the pointer in name and bump
   * the refcnt in the associated filename struct.
b24a30a73   Eric Paris   audit: fix event ...
60
61
62
63
64
65
66
67
   *
   * Further, in fs/namei.c:path_lookup() we store the inode and device.
   */
  struct audit_names {
  	struct list_head	list;		/* audit_context->names_list */
  
  	struct filename		*name;
  	int			name_len;	/* number of chars to log */
79f6530cb   Jeff Layton   audit: fix mq_ope...
68
  	bool			hidden;		/* don't log this record */
b24a30a73   Eric Paris   audit: fix event ...
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  
  	unsigned long		ino;
  	dev_t			dev;
  	umode_t			mode;
  	kuid_t			uid;
  	kgid_t			gid;
  	dev_t			rdev;
  	u32			osid;
  	struct audit_cap_data	fcap;
  	unsigned int		fcap_ver;
  	unsigned char		type;		/* record type */
  	/*
  	 * This was an allocated audit_names and not from the array of
  	 * names allocated in the task audit context.  Thus this name
  	 * should be freed on syscall exit.
  	 */
  	bool			should_free;
  };
3f1c82502   William Roberts   audit: Audit proc...
87
88
89
90
  struct audit_proctitle {
  	int	len;	/* length of the cmdline field. */
  	char	*value;	/* the cmdline field */
  };
b24a30a73   Eric Paris   audit: fix event ...
91
92
93
94
95
96
97
  /* The per-task audit context. */
  struct audit_context {
  	int		    dummy;	/* must be the first element */
  	int		    in_syscall;	/* 1 if task is in a syscall */
  	enum audit_state    state, current_state;
  	unsigned int	    serial;     /* serial number for record */
  	int		    major;      /* syscall number */
2115bb250   Deepa Dinamani   audit: Use timesp...
98
  	struct timespec64   ctime;      /* time of syscall entry */
b24a30a73   Eric Paris   audit: fix event ...
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  	unsigned long	    argv[4];    /* syscall arguments */
  	long		    return_code;/* syscall return code */
  	u64		    prio;
  	int		    return_valid; /* return code is valid */
  	/*
  	 * The names_list is the list of all audit_names collected during this
  	 * syscall.  The first AUDIT_NAMES entries in the names_list will
  	 * actually be from the preallocated_names array for performance
  	 * reasons.  Except during allocation they should never be referenced
  	 * through the preallocated_names array and should only be found/used
  	 * by running the names_list.
  	 */
  	struct audit_names  preallocated_names[AUDIT_NAMES];
  	int		    name_count; /* total records in names_list */
  	struct list_head    names_list;	/* struct audit_names->list anchor */
  	char		    *filterkey;	/* key for rule that triggered record */
  	struct path	    pwd;
  	struct audit_aux_data *aux;
  	struct audit_aux_data *aux_pids;
  	struct sockaddr_storage *sockaddr;
  	size_t sockaddr_len;
  				/* Save things to print about task_struct */
  	pid_t		    pid, ppid;
  	kuid_t		    uid, euid, suid, fsuid;
  	kgid_t		    gid, egid, sgid, fsgid;
  	unsigned long	    personality;
  	int		    arch;
  
  	pid_t		    target_pid;
  	kuid_t		    target_auid;
  	kuid_t		    target_uid;
  	unsigned int	    target_sessionid;
  	u32		    target_sid;
  	char		    target_comm[TASK_COMM_LEN];
  
  	struct audit_tree_refs *trees, *first_trees;
  	struct list_head killed_trees;
  	int tree_count;
  
  	int type;
  	union {
  		struct {
  			int nargs;
  			long args[6];
  		} socketcall;
  		struct {
  			kuid_t			uid;
  			kgid_t			gid;
  			umode_t			mode;
  			u32			osid;
  			int			has_perm;
  			uid_t			perm_uid;
  			gid_t			perm_gid;
  			umode_t			perm_mode;
  			unsigned long		qbytes;
  		} ipc;
  		struct {
  			mqd_t			mqdes;
  			struct mq_attr		mqstat;
  		} mq_getsetattr;
  		struct {
  			mqd_t			mqdes;
  			int			sigev_signo;
  		} mq_notify;
  		struct {
  			mqd_t			mqdes;
  			size_t			msg_len;
  			unsigned int		msg_prio;
b90477263   Deepa Dinamani   ipc: mqueue: Repl...
167
  			struct timespec64	abs_timeout;
b24a30a73   Eric Paris   audit: fix event ...
168
169
170
171
172
173
174
175
176
177
178
179
180
181
  		} mq_sendrecv;
  		struct {
  			int			oflag;
  			umode_t			mode;
  			struct mq_attr		attr;
  		} mq_open;
  		struct {
  			pid_t			pid;
  			struct audit_cap_data	cap;
  		} capset;
  		struct {
  			int			fd;
  			int			flags;
  		} mmap;
d9cfea91e   Richard Guy Briggs   audit: move audit...
182
183
  		struct {
  			int			argc;
d9cfea91e   Richard Guy Briggs   audit: move audit...
184
  		} execve;
ca86cad73   Richard Guy Briggs   audit: log module...
185
186
187
  		struct {
  			char			*name;
  		} module;
b24a30a73   Eric Paris   audit: fix event ...
188
189
  	};
  	int fds[2];
3f1c82502   William Roberts   audit: Audit proc...
190
  	struct audit_proctitle proctitle;
b24a30a73   Eric Paris   audit: fix event ...
191
  };
b3b4fdf6a   Paul Moore   audit: convert au...
192
  extern bool audit_ever_enabled;
c782f242f   Harvey Harrison   [PATCH 1/2] audit...
193

0fe3c7fce   Richard Guy Briggs   audit: localize a...
194
  extern void audit_log_session_info(struct audit_buffer *ab);
b6c7c115c   Paul Moore   audit: store the ...
195
  extern int auditd_test_task(struct task_struct *task);
fe7752bab   David Woodhouse   [PATCH] Fix audit...
196

f368c07d7   Amy Griffis   [PATCH] audit: pa...
197
198
199
200
201
202
203
  #define AUDIT_INODE_BUCKETS	32
  extern struct list_head audit_inode_hash[AUDIT_INODE_BUCKETS];
  
  static inline int audit_hash_ino(u32 ino)
  {
  	return (ino & (AUDIT_INODE_BUCKETS-1));
  }
e3d6b07b8   Jeff Layton   audit: optimize a...
204
205
  /* Indicates that audit should log the full pathname. */
  #define AUDIT_NAME_FULL -1
55669bfa1   Al Viro   [PATCH] audit: AU...
206
  extern int audit_match_class(int class, unsigned syscall);
f368c07d7   Amy Griffis   [PATCH] audit: pa...
207
  extern int audit_comparator(const u32 left, const u32 op, const u32 right);
ca57ec0f0   Eric W. Biederman   audit: Add typesp...
208
209
  extern int audit_uid_comparator(kuid_t left, u32 op, kuid_t right);
  extern int audit_gid_comparator(kgid_t left, u32 op, kgid_t right);
bfcec7087   Jeff Layton   audit: set the na...
210
  extern int parent_len(const char *path);
795d673af   Al Viro   audit_compare_dna...
211
  extern int audit_compare_dname_path(const struct qstr *dname, const char *path, int plen);
45a0642b4   Paul Moore   audit: kernel gen...
212
  extern struct sk_buff *audit_make_reply(int seq, int type, int done, int multi,
f9441639e   Richard Guy Briggs   audit: fix netlin...
213
  					const void *payload, int size);
fe7752bab   David Woodhouse   [PATCH] Fix audit...
214
  extern void		    audit_panic(const char *message);
3dc7e3153   Darrel Goeddel   [PATCH] support f...
215

9044e6bca   Al Viro   [PATCH] fix deadl...
216
  struct audit_netlink_list {
f9441639e   Richard Guy Briggs   audit: fix netlin...
217
  	__u32 portid;
638a0fd2a   Eric W. Biederman   audit: Use struct...
218
  	struct net *net;
9044e6bca   Al Viro   [PATCH] fix deadl...
219
220
  	struct sk_buff_head q;
  };
3054d0671   Paul Moore   audit: fix a net ...
221
  int audit_send_list_thread(void *_dest);
9044e6bca   Al Viro   [PATCH] fix deadl...
222

3dc7e3153   Darrel Goeddel   [PATCH] support f...
223
  extern int selinux_audit_rule_update(void);
e1396065e   Al Viro   [PATCH] collect s...
224

74c3cbe33   Al Viro   [PATCH] audit: wa...
225
  extern struct mutex audit_filter_mutex;
e4c1a0d15   Derek Robson   audit: style fix
226
227
  extern int audit_del_rule(struct audit_entry *entry);
  extern void audit_free_rule_rcu(struct rcu_head *head);
c782f242f   Harvey Harrison   [PATCH 1/2] audit...
228
  extern struct list_head audit_filter_list[];
74c3cbe33   Al Viro   [PATCH] audit: wa...
229

939a67fc4   Eric Paris   Audit: split audi...
230
  extern struct audit_entry *audit_dupe_rule(struct audit_krule *old);
4766b199e   Davidlohr Bueso   audit: consolidat...
231
232
  extern void audit_log_d_path_exe(struct audit_buffer *ab,
  				 struct mm_struct *mm);
2a1fe215e   Paul Moore   audit: use curren...
233
  extern struct tty_struct *audit_get_tty(void);
3f5be2da8   Richard Guy Briggs   audit: move audit...
234
  extern void audit_put_tty(struct tty_struct *tty);
05c7a9cb2   Richard Guy Briggs   audit: clean up A...
235
  /* audit watch/mark/tree functions */
c8fc5d49c   Richard Guy Briggs   audit: remove WAT...
236
  #ifdef CONFIG_AUDITSYSCALL
cd108b5c5   Richard Guy Briggs   audit: hide audit...
237
238
239
  extern unsigned int audit_serial(void);
  extern int auditsc_get_stamp(struct audit_context *ctx,
  			      struct timespec64 *t, unsigned int *serial);
cfcad62c7   Eric Paris   audit: seperate a...
240
241
  extern void audit_put_watch(struct audit_watch *watch);
  extern void audit_get_watch(struct audit_watch *watch);
05c7a9cb2   Richard Guy Briggs   audit: clean up A...
242
243
  extern int audit_to_watch(struct audit_krule *krule, char *path, int len,
  			  u32 op);
ae7b8f410   Eric Paris   Audit: clean up t...
244
  extern int audit_add_watch(struct audit_krule *krule, struct list_head **list);
a05fb6cc5   Eric Paris   audit: do not get...
245
  extern void audit_remove_watch_rule(struct audit_krule *krule);
cfcad62c7   Eric Paris   audit: seperate a...
246
  extern char *audit_watch_path(struct audit_watch *watch);
05c7a9cb2   Richard Guy Briggs   audit: clean up A...
247
248
  extern int audit_watch_compare(struct audit_watch *watch, unsigned long ino,
  			       dev_t dev);
7f4929428   Richard Guy Briggs   audit: clean simp...
249

05c7a9cb2   Richard Guy Briggs   audit: clean up A...
250
251
  extern struct audit_fsnotify_mark *audit_alloc_mark(struct audit_krule *krule,
  						    char *pathname, int len);
7f4929428   Richard Guy Briggs   audit: clean simp...
252
253
254
  extern char *audit_mark_path(struct audit_fsnotify_mark *mark);
  extern void audit_remove_mark(struct audit_fsnotify_mark *audit_mark);
  extern void audit_remove_mark_rule(struct audit_krule *krule);
05c7a9cb2   Richard Guy Briggs   audit: clean up A...
255
256
  extern int audit_mark_compare(struct audit_fsnotify_mark *mark,
  			      unsigned long ino, dev_t dev);
34d99af52   Richard Guy Briggs   audit: implement ...
257
  extern int audit_dupe_exe(struct audit_krule *new, struct audit_krule *old);
05c7a9cb2   Richard Guy Briggs   audit: clean up A...
258
259
  extern int audit_exe_compare(struct task_struct *tsk,
  			     struct audit_fsnotify_mark *mark);
7f4929428   Richard Guy Briggs   audit: clean simp...
260

05c7a9cb2   Richard Guy Briggs   audit: clean up A...
261
262
263
264
265
266
267
268
269
270
271
272
  extern struct audit_chunk *audit_tree_lookup(const struct inode *inode);
  extern void audit_put_chunk(struct audit_chunk *chunk);
  extern bool audit_tree_match(struct audit_chunk *chunk,
  			     struct audit_tree *tree);
  extern int audit_make_tree(struct audit_krule *rule, char *pathname, u32 op);
  extern int audit_add_tree_rule(struct audit_krule *rule);
  extern int audit_remove_tree_rule(struct audit_krule *rule);
  extern void audit_trim_trees(void);
  extern int audit_tag_tree(char *old, char *new);
  extern const char *audit_tree_path(struct audit_tree *tree);
  extern void audit_put_tree(struct audit_tree *tree);
  extern void audit_kill_trees(struct audit_context *context);
b48345aaf   Richard Guy Briggs   audit: deliver si...
273
  extern int audit_signal_info_syscall(struct task_struct *t);
05c7a9cb2   Richard Guy Briggs   audit: clean up A...
274
275
276
277
  extern void audit_filter_inodes(struct task_struct *tsk,
  				struct audit_context *ctx);
  extern struct list_head *audit_killed_trees(void);
  #else /* CONFIG_AUDITSYSCALL */
cd108b5c5   Richard Guy Briggs   audit: hide audit...
278
  #define auditsc_get_stamp(c, t, s) 0
939a67fc4   Eric Paris   Audit: split audi...
279
280
281
282
283
284
285
  #define audit_put_watch(w) {}
  #define audit_get_watch(w) {}
  #define audit_to_watch(k, p, l, o) (-EINVAL)
  #define audit_add_watch(k, l) (-EINVAL)
  #define audit_remove_watch_rule(k) BUG()
  #define audit_watch_path(w) ""
  #define audit_watch_compare(w, i, d) 0
7f4929428   Richard Guy Briggs   audit: clean simp...
286
287
288
289
290
  #define audit_alloc_mark(k, p, l) (ERR_PTR(-EINVAL))
  #define audit_mark_path(m) ""
  #define audit_remove_mark(m)
  #define audit_remove_mark_rule(k)
  #define audit_mark_compare(m, i, d) 0
34d99af52   Richard Guy Briggs   audit: implement ...
291
292
  #define audit_exe_compare(t, m) (-EINVAL)
  #define audit_dupe_exe(n, o) (-EINVAL)
cfcad62c7   Eric Paris   audit: seperate a...
293

74c3cbe33   Al Viro   [PATCH] audit: wa...
294
295
296
297
298
299
300
  #define audit_remove_tree_rule(rule) BUG()
  #define audit_add_tree_rule(rule) -EINVAL
  #define audit_make_tree(rule, str, op) -EINVAL
  #define audit_trim_trees() (void)0
  #define audit_put_tree(tree) (void)0
  #define audit_tag_tree(old, new) -EINVAL
  #define audit_tree_path(rule) ""	/* never called */
9e36a5d49   Richard Guy Briggs   audit: hand taken...
301
  #define audit_kill_trees(context) BUG()
05c7a9cb2   Richard Guy Briggs   audit: clean up A...
302

b48345aaf   Richard Guy Briggs   audit: deliver si...
303
304
305
306
  static inline int audit_signal_info_syscall(struct task_struct *t)
  {
  	return 0;
  }
05c7a9cb2   Richard Guy Briggs   audit: clean up A...
307
308
  #define audit_filter_inodes(t, c) AUDIT_DISABLED
  #endif /* CONFIG_AUDITSYSCALL */
74c3cbe33   Al Viro   [PATCH] audit: wa...
309

e4c1a0d15   Derek Robson   audit: style fix
310
  extern char *audit_unpack_string(void **bufp, size_t *remain, size_t len);
74c3cbe33   Al Viro   [PATCH] audit: wa...
311

86b2efbe3   Richard Guy Briggs   audit: add fields...
312
  extern int audit_filter(int msgtype, unsigned int listtype);
ce423631c   Paul Moore   audit: track the ...
313
314
  extern void audit_ctl_lock(void);
  extern void audit_ctl_unlock(void);