audit_private.h revision 243726
1251881Speter/*-
2251881Speter * Copyright (c) 1999-2009 Apple Inc.
3251881Speter * All rights reserved.
4251881Speter *
5251881Speter * Redistribution and use in source and binary forms, with or without
6251881Speter * modification, are permitted provided that the following conditions
7251881Speter * are met:
8251881Speter * 1.  Redistributions of source code must retain the above copyright
9251881Speter *     notice, this list of conditions and the following disclaimer.
10251881Speter * 2.  Redistributions in binary form must reproduce the above copyright
11251881Speter *     notice, this list of conditions and the following disclaimer in the
12251881Speter *     documentation and/or other materials provided with the distribution.
13251881Speter * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14251881Speter *     its contributors may be used to endorse or promote products derived
15251881Speter *     from this software without specific prior written permission.
16251881Speter *
17251881Speter * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
18251881Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19251881Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20251881Speter * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
21251881Speter * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22251881Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23251881Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24251881Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25251881Speter * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
26251881Speter * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27251881Speter * POSSIBILITY OF SUCH DAMAGE.
28251881Speter *
29251881Speter * $FreeBSD: head/sys/security/audit/audit_private.h 243726 2012-11-30 23:18:49Z pjd $
30251881Speter */
31251881Speter
32251881Speter/*
33251881Speter * This include file contains function prototypes and type definitions used
34251881Speter * within the audit implementation.
35251881Speter */
36251881Speter
37251881Speter#ifndef _SECURITY_AUDIT_PRIVATE_H_
38251881Speter#define	_SECURITY_AUDIT_PRIVATE_H_
39251881Speter
40251881Speter#ifndef _KERNEL
41251881Speter#error "no user-serviceable parts inside"
42251881Speter#endif
43251881Speter
44251881Speter#include <sys/ipc.h>
45251881Speter#include <sys/socket.h>
46251881Speter#include <sys/ucred.h>
47251881Speter
48251881Speter#ifdef MALLOC_DECLARE
49251881SpeterMALLOC_DECLARE(M_AUDITBSM);
50251881SpeterMALLOC_DECLARE(M_AUDITDATA);
51251881SpeterMALLOC_DECLARE(M_AUDITPATH);
52251881SpeterMALLOC_DECLARE(M_AUDITTEXT);
53251881SpeterMALLOC_DECLARE(M_AUDITGIDSET);
54251881Speter#endif
55251881Speter
56251881Speter/*
57251881Speter * Audit control variables that are usually set/read via system calls and
58251881Speter * used to control various aspects of auditing.
59251881Speter */
60251881Speterextern struct au_qctrl		audit_qctrl;
61251881Speterextern struct audit_fstat	audit_fstat;
62251881Speterextern struct au_mask		audit_nae_mask;
63251881Speterextern int			audit_panic_on_write_fail;
64251881Speterextern int			audit_fail_stop;
65251881Speterextern int			audit_argv;
66251881Speterextern int			audit_arge;
67251881Speter
68251881Speter/*
69251881Speter * Success/failure conditions for the conversion of a kernel audit record to
70251881Speter * BSM format.
71251881Speter */
72251881Speter#define	BSM_SUCCESS	0
73251881Speter#define	BSM_FAILURE	1
74251881Speter#define	BSM_NOAUDIT	2
75251881Speter
76251881Speter/*
77251881Speter * Defines for the kernel audit record k_ar_commit field.  Flags are set to
78251881Speter * indicate what sort of record it is, and which preselection mechanism
79251881Speter * selected it.
80251881Speter */
81251881Speter#define	AR_COMMIT_KERNEL	0x00000001U
82251881Speter#define	AR_COMMIT_USER		0x00000010U
83251881Speter
84251881Speter#define	AR_PRESELECT_TRAIL	0x00001000U
85251881Speter#define	AR_PRESELECT_PIPE	0x00002000U
86251881Speter
87251881Speter#define	AR_PRESELECT_USER_TRAIL	0x00004000U
88251881Speter#define	AR_PRESELECT_USER_PIPE	0x00008000U
89251881Speter
90251881Speter/*
91251881Speter * Audit data is generated as a stream of struct audit_record structures,
92251881Speter * linked by struct kaudit_record, and contain storage for possible audit so
93251881Speter * that it will not need to be allocated during the processing of a system
94251881Speter * call, both improving efficiency and avoiding sleeping at untimely moments.
95251881Speter * This structure is converted to BSM format before being written to disk.
96251881Speter */
97251881Speterstruct vnode_au_info {
98251881Speter	mode_t	vn_mode;
99251881Speter	uid_t	vn_uid;
100251881Speter	gid_t	vn_gid;
101251881Speter	dev_t	vn_dev;
102251881Speter	long	vn_fsid;
103251881Speter	long	vn_fileid;
104251881Speter	long	vn_gen;
105251881Speter};
106251881Speter
107251881Speterstruct groupset {
108251881Speter	gid_t	*gidset;
109251881Speter	u_int	 gidset_size;
110251881Speter};
111251881Speter
112251881Speterstruct socket_au_info {
113251881Speter	int		so_domain;
114251881Speter	int		so_type;
115251881Speter	int		so_protocol;
116251881Speter	in_addr_t	so_raddr;	/* Remote address if INET socket. */
117251881Speter	in_addr_t	so_laddr;	/* Local address if INET socket. */
118251881Speter	u_short		so_rport;	/* Remote port. */
119251881Speter	u_short		so_lport;	/* Local port. */
120251881Speter};
121251881Speter
122251881Speter/*
123251881Speter * The following is used for A_OLDSETQCTRL and AU_OLDGETQCTRL and a 64-bit
124251881Speter * userland.
125251881Speter */
126251881Speterstruct au_qctrl64 {
127251881Speter	u_int64_t	aq64_hiwater;
128251881Speter	u_int64_t	aq64_lowater;
129251881Speter	u_int64_t	aq64_bufsz;
130251881Speter	u_int64_t	aq64_delay;
131251881Speter	u_int64_t	aq64_minfree;
132251881Speter};
133251881Spetertypedef	struct au_qctrl64	au_qctrl64_t;
134251881Speter
135251881Speterunion auditon_udata {
136251881Speter	char			*au_path;
137251881Speter	int			au_cond;
138251881Speter	int			au_flags;
139251881Speter	int			au_policy;
140251881Speter	int			au_trigger;
141251881Speter	int64_t			au_cond64;
142251881Speter	int64_t			au_policy64;
143251881Speter	au_evclass_map_t	au_evclass;
144251881Speter	au_mask_t		au_mask;
145251881Speter	auditinfo_t		au_auinfo;
146251881Speter	auditpinfo_t		au_aupinfo;
147251881Speter	auditpinfo_addr_t	au_aupinfo_addr;
148251881Speter	au_qctrl_t		au_qctrl;
149251881Speter	au_qctrl64_t		au_qctrl64;
150251881Speter	au_stat_t		au_stat;
151251881Speter	au_fstat_t		au_fstat;
152251881Speter	auditinfo_addr_t	au_kau_info;
153251881Speter};
154251881Speter
155251881Speterstruct posix_ipc_perm {
156251881Speter	uid_t	pipc_uid;
157251881Speter	gid_t	pipc_gid;
158251881Speter	mode_t	pipc_mode;
159251881Speter};
160251881Speter
161251881Speterstruct audit_record {
162251881Speter	/* Audit record header. */
163251881Speter	u_int32_t		ar_magic;
164251881Speter	int			ar_event;
165251881Speter	int			ar_retval; /* value returned to the process */
166251881Speter	int			ar_errno;  /* return status of system call */
167251881Speter	struct timespec		ar_starttime;
168251881Speter	struct timespec		ar_endtime;
169251881Speter	u_int64_t		ar_valid_arg;  /* Bitmask of valid arguments */
170251881Speter
171251881Speter	/* Audit subject information. */
172251881Speter	struct xucred		ar_subj_cred;
173251881Speter	uid_t			ar_subj_ruid;
174251881Speter	gid_t			ar_subj_rgid;
175251881Speter	gid_t			ar_subj_egid;
176251881Speter	uid_t			ar_subj_auid; /* Audit user ID */
177251881Speter	pid_t			ar_subj_asid; /* Audit session ID */
178251881Speter	pid_t			ar_subj_pid;
179251881Speter	struct au_tid		ar_subj_term;
180251881Speter	struct au_tid_addr	ar_subj_term_addr;
181251881Speter	struct au_mask		ar_subj_amask;
182251881Speter
183251881Speter	/* Operation arguments. */
184251881Speter	uid_t			ar_arg_euid;
185251881Speter	uid_t			ar_arg_ruid;
186251881Speter	uid_t			ar_arg_suid;
187251881Speter	gid_t			ar_arg_egid;
188251881Speter	gid_t			ar_arg_rgid;
189251881Speter	gid_t			ar_arg_sgid;
190251881Speter	pid_t			ar_arg_pid;
191251881Speter	pid_t			ar_arg_asid;
192251881Speter	struct au_tid		ar_arg_termid;
193251881Speter	struct au_tid_addr	ar_arg_termid_addr;
194251881Speter	uid_t			ar_arg_uid;
195251881Speter	uid_t			ar_arg_auid;
196251881Speter	gid_t			ar_arg_gid;
197251881Speter	struct groupset		ar_arg_groups;
198251881Speter	int			ar_arg_fd;
199251881Speter	int			ar_arg_atfd1;
200251881Speter	int			ar_arg_atfd2;
201251881Speter	int			ar_arg_fflags;
202251881Speter	mode_t			ar_arg_mode;
203251881Speter	int			ar_arg_dev;
204251881Speter	long			ar_arg_value;
205251881Speter	void *			ar_arg_addr;
206251881Speter	int			ar_arg_len;
207251881Speter	int			ar_arg_mask;
208251881Speter	u_int			ar_arg_signum;
209251881Speter	char			ar_arg_login[MAXLOGNAME];
210251881Speter	int			ar_arg_ctlname[CTL_MAXNAME];
211251881Speter	struct socket_au_info	ar_arg_sockinfo;
212251881Speter	char			*ar_arg_upath1;
213251881Speter	char			*ar_arg_upath2;
214251881Speter	char			*ar_arg_text;
215251881Speter	struct au_mask		ar_arg_amask;
216251881Speter	struct vnode_au_info	ar_arg_vnode1;
217251881Speter	struct vnode_au_info	ar_arg_vnode2;
218251881Speter	int			ar_arg_cmd;
219251881Speter	int			ar_arg_svipc_cmd;
220251881Speter	struct ipc_perm		ar_arg_svipc_perm;
221251881Speter	int			ar_arg_svipc_id;
222251881Speter	void *			ar_arg_svipc_addr;
223251881Speter	struct posix_ipc_perm	ar_arg_pipc_perm;
224251881Speter	union auditon_udata	ar_arg_auditon;
225251881Speter	char			*ar_arg_argv;
226251881Speter	int			ar_arg_argc;
227251881Speter	char			*ar_arg_envv;
228251881Speter	int			ar_arg_envc;
229251881Speter	int			ar_arg_exitstatus;
230251881Speter	int			ar_arg_exitretval;
231251881Speter	struct sockaddr_storage ar_arg_sockaddr;
232251881Speter	cap_rights_t		ar_arg_rights;
233251881Speter};
234251881Speter
235251881Speter/*
236251881Speter * Arguments in the audit record are initially not defined; flags are set to
237251881Speter * indicate if they are present so they can be included in the audit log
238251881Speter * stream only if defined.
239251881Speter */
240251881Speter#define	ARG_EUID		0x0000000000000001ULL
241251881Speter#define	ARG_RUID		0x0000000000000002ULL
242251881Speter#define	ARG_SUID		0x0000000000000004ULL
243251881Speter#define	ARG_EGID		0x0000000000000008ULL
244251881Speter#define	ARG_RGID		0x0000000000000010ULL
245251881Speter#define	ARG_SGID		0x0000000000000020ULL
246251881Speter#define	ARG_PID			0x0000000000000040ULL
247251881Speter#define	ARG_UID			0x0000000000000080ULL
248251881Speter#define	ARG_AUID		0x0000000000000100ULL
249251881Speter#define	ARG_GID			0x0000000000000200ULL
250251881Speter#define	ARG_FD			0x0000000000000400ULL
251251881Speter#define	ARG_POSIX_IPC_PERM	0x0000000000000800ULL
252251881Speter#define	ARG_FFLAGS		0x0000000000001000ULL
253251881Speter#define	ARG_MODE		0x0000000000002000ULL
254251881Speter#define	ARG_DEV			0x0000000000004000ULL
255251881Speter#define	ARG_ADDR		0x0000000000008000ULL
256251881Speter#define	ARG_LEN			0x0000000000010000ULL
257251881Speter#define	ARG_MASK		0x0000000000020000ULL
258251881Speter#define	ARG_SIGNUM		0x0000000000040000ULL
259251881Speter#define	ARG_LOGIN		0x0000000000080000ULL
260251881Speter#define	ARG_SADDRINET		0x0000000000100000ULL
261251881Speter#define	ARG_SADDRINET6		0x0000000000200000ULL
262251881Speter#define	ARG_SADDRUNIX		0x0000000000400000ULL
263251881Speter#define	ARG_TERMID_ADDR		0x0000000000400000ULL
264251881Speter#define	ARG_UNUSED2		0x0000000001000000ULL
265251881Speter#define	ARG_UPATH1		0x0000000002000000ULL
266251881Speter#define	ARG_UPATH2		0x0000000004000000ULL
267251881Speter#define	ARG_TEXT		0x0000000008000000ULL
268251881Speter#define	ARG_VNODE1		0x0000000010000000ULL
269251881Speter#define	ARG_VNODE2		0x0000000020000000ULL
270251881Speter#define	ARG_SVIPC_CMD		0x0000000040000000ULL
271251881Speter#define	ARG_SVIPC_PERM		0x0000000080000000ULL
272251881Speter#define	ARG_SVIPC_ID		0x0000000100000000ULL
273251881Speter#define	ARG_SVIPC_ADDR		0x0000000200000000ULL
274251881Speter#define	ARG_GROUPSET		0x0000000400000000ULL
275251881Speter#define	ARG_CMD			0x0000000800000000ULL
276251881Speter#define	ARG_SOCKINFO		0x0000001000000000ULL
277251881Speter#define	ARG_ASID		0x0000002000000000ULL
278251881Speter#define	ARG_TERMID		0x0000004000000000ULL
279251881Speter#define	ARG_AUDITON		0x0000008000000000ULL
280251881Speter#define	ARG_VALUE		0x0000010000000000ULL
281251881Speter#define	ARG_AMASK		0x0000020000000000ULL
282251881Speter#define	ARG_CTLNAME		0x0000040000000000ULL
283251881Speter#define	ARG_PROCESS		0x0000080000000000ULL
284251881Speter#define	ARG_MACHPORT1		0x0000100000000000ULL
285251881Speter#define	ARG_MACHPORT2		0x0000200000000000ULL
286251881Speter#define	ARG_EXIT		0x0000400000000000ULL
287251881Speter#define	ARG_IOVECSTR		0x0000800000000000ULL
288251881Speter#define	ARG_ARGV		0x0001000000000000ULL
289251881Speter#define	ARG_ENVV		0x0002000000000000ULL
290251881Speter#define	ARG_ATFD1		0x0004000000000000ULL
291251881Speter#define	ARG_ATFD2		0x0008000000000000ULL
292251881Speter#define	ARG_RIGHTS		0x0010000000000000ULL
293262253Speter#define	ARG_NONE		0x0000000000000000ULL
294262253Speter#define	ARG_ALL			0xFFFFFFFFFFFFFFFFULL
295262253Speter
296262253Speter#define	ARG_IS_VALID(kar, arg)	((kar)->k_ar.ar_valid_arg & (arg))
297262253Speter#define	ARG_SET_VALID(kar, arg) do {					\
298262253Speter	(kar)->k_ar.ar_valid_arg |= (arg);				\
299251881Speter} while (0)
300251881Speter#define	ARG_CLEAR_VALID(kar, arg) do {					\
301251881Speter	(kar)->k_ar.ar_valid_arg &= ~(arg);				\
302262253Speter} while (0)
303262253Speter
304251881Speter/*
305262253Speter * In-kernel version of audit record; the basic record plus queue meta-data.
306262253Speter * This record can also have a pointer set to some opaque data that will be
307262253Speter * passed through to the audit writing mechanism.
308251881Speter */
309251881Speterstruct kaudit_record {
310251881Speter	struct audit_record		 k_ar;
311251881Speter	u_int32_t			 k_ar_commit;
312251881Speter	void				*k_udata;	/* User data. */
313251881Speter	u_int				 k_ulen;	/* User data length. */
314251881Speter	struct uthread			*k_uthread;	/* Audited thread. */
315251881Speter	TAILQ_ENTRY(kaudit_record)	 k_q;
316251881Speter};
317251881SpeterTAILQ_HEAD(kaudit_queue, kaudit_record);
318251881Speter
319251881Speter/*
320251881Speter * Functions to manage the allocation, release, and commit of kernel audit
321251881Speter * records.
322251881Speter */
323251881Spetervoid			 audit_abort(struct kaudit_record *ar);
324251881Spetervoid			 audit_commit(struct kaudit_record *ar, int error,
325251881Speter			    int retval);
326251881Speterstruct kaudit_record	*audit_new(int event, struct thread *td);
327251881Speter
328251881Speter/*
329251881Speter * Functions relating to the conversion of internal kernel audit records to
330251881Speter * the BSM file format.
331251881Speter */
332251881Speterstruct au_record;
333251881Speterint	 kaudit_to_bsm(struct kaudit_record *kar, struct au_record **pau);
334251881Speterint	 bsm_rec_verify(void *rec);
335251881Speter
336251881Speter/*
337251881Speter * Kernel versions of the libbsm audit record functions.
338251881Speter */
339251881Spetervoid	 kau_free(struct au_record *rec);
340251881Spetervoid	 kau_init(void);
341251881Speter
342251881Speter/*
343251881Speter * Return values for pre-selection and post-selection decisions.
344251881Speter */
345251881Speter#define	AU_PRS_SUCCESS	1
346251881Speter#define	AU_PRS_FAILURE	2
347251881Speter#define	AU_PRS_BOTH	(AU_PRS_SUCCESS|AU_PRS_FAILURE)
348251881Speter
349251881Speter/*
350251881Speter * Data structures relating to the kernel audit queue.  Ideally, these might
351251881Speter * be abstracted so that only accessor methods are exposed.
352251881Speter */
353251881Speterextern struct mtx		audit_mtx;
354251881Speterextern struct cv		audit_watermark_cv;
355251881Speterextern struct cv		audit_worker_cv;
356251881Speterextern struct kaudit_queue	audit_q;
357251881Speterextern int			audit_q_len;
358251881Speterextern int			audit_pre_q_len;
359251881Speterextern int			audit_in_failure;
360251881Speter
361251881Speter/*
362251881Speter * Flags to use on audit files when opening and closing.
363251881Speter */
364251881Speter#define	AUDIT_OPEN_FLAGS	(FWRITE | O_APPEND)
365251881Speter#define	AUDIT_CLOSE_FLAGS	(FWRITE | O_APPEND)
366251881Speter
367251881Speter#include <sys/fcntl.h>
368251881Speter#include <sys/kernel.h>
369251881Speter#include <sys/malloc.h>
370251881Speter
371251881Speter/*
372251881Speter * Some of the BSM tokenizer functions take different parameters in the
373251881Speter * kernel implementations in order to save the copying of large kernel data
374251881Speter * structures.  The prototypes of these functions are declared here.
375251881Speter */
376251881Spetertoken_t		*kau_to_socket(struct socket_au_info *soi);
377251881Speter
378251881Speter/*
379251881Speter * audit_klib prototypes
380251881Speter */
381251881Speterint		 au_preselect(au_event_t event, au_class_t class,
382251881Speter		    au_mask_t *mask_p, int sorf);
383251881Spetervoid		 au_evclassmap_init(void);
384251881Spetervoid		 au_evclassmap_insert(au_event_t event, au_class_t class);
385251881Speterau_class_t	 au_event_class(au_event_t event);
386251881Speterau_event_t	 audit_ctlname_to_sysctlevent(int name[], uint64_t valid_arg);
387251881Speterau_event_t	 audit_flags_and_error_to_openevent(int oflags, int error);
388251881Speterau_event_t	 audit_flags_and_error_to_openatevent(int oflags, int error);
389251881Speterau_event_t	 audit_msgctl_to_event(int cmd);
390251881Speterau_event_t	 audit_semctl_to_event(int cmr);
391251881Spetervoid		 audit_canon_path(struct thread *td, int dirfd, char *path,
392251881Speter		    char *cpath);
393251881Speterau_event_t	 auditon_command_event(int cmd);
394251881Speter
395251881Speter/*
396251881Speter * Audit trigger events notify user space of kernel audit conditions
397251881Speter * asynchronously.
398251881Speter */
399251881Spetervoid		 audit_trigger_init(void);
400251881Speterint		 audit_send_trigger(unsigned int trigger);
401251881Speter
402251881Speter/*
403251881Speter * Accessor functions to manage global audit state.
404251881Speter */
405251881Spetervoid	 audit_set_kinfo(struct auditinfo_addr *);
406251881Spetervoid	 audit_get_kinfo(struct auditinfo_addr *);
407251881Speter
408251881Speter/*
409251881Speter * General audit related functions.
410251881Speter */
411251881Speterstruct kaudit_record	*currecord(void);
412251881Spetervoid			 audit_free(struct kaudit_record *ar);
413251881Spetervoid			 audit_shutdown(void *arg, int howto);
414251881Spetervoid			 audit_rotate_vnode(struct ucred *cred,
415251881Speter			    struct vnode *vp);
416251881Spetervoid			 audit_worker_init(void);
417251881Speter
418251881Speter/*
419251881Speter * Audit pipe functions.
420251881Speter */
421251881Speterint	 audit_pipe_preselect(au_id_t auid, au_event_t event,
422251881Speter	    au_class_t class, int sorf, int trail_select);
423251881Spetervoid	 audit_pipe_submit(au_id_t auid, au_event_t event, au_class_t class,
424251881Speter	    int sorf, int trail_select, void *record, u_int record_len);
425251881Spetervoid	 audit_pipe_submit_user(void *record, u_int record_len);
426251881Speter
427251881Speter#endif /* ! _SECURITY_AUDIT_PRIVATE_H_ */
428251881Speter