audit_private.h revision 195177
1169691Skan/*-
2169691Skan * Copyright (c) 1999-2009 Apple Inc.
3169691Skan * All rights reserved.
4169691Skan *
5169691Skan * Redistribution and use in source and binary forms, with or without
6169691Skan * modification, are permitted provided that the following conditions
7169691Skan * are met:
8169691Skan * 1.  Redistributions of source code must retain the above copyright
9169691Skan *     notice, this list of conditions and the following disclaimer.
10169691Skan * 2.  Redistributions in binary form must reproduce the above copyright
11169691Skan *     notice, this list of conditions and the following disclaimer in the
12169691Skan *     documentation and/or other materials provided with the distribution.
13169691Skan * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14169691Skan *     its contributors may be used to endorse or promote products derived
15169691Skan *     from this software without specific prior written permission.
16169691Skan *
17169691Skan * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
18169691Skan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19169691Skan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20169691Skan * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
21169691Skan * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22169691Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23169691Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24169691Skan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25169691Skan * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
26169691Skan * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27169691Skan * POSSIBILITY OF SUCH DAMAGE.
28169691Skan *
29169691Skan * $FreeBSD: head/sys/security/audit/audit_private.h 195177 2009-06-29 20:19:19Z sson $
30169691Skan */
31169691Skan
32169691Skan/*
33169691Skan * This include file contains function prototypes and type definitions used
34169691Skan * within the audit implementation.
35169691Skan */
36169691Skan
37169691Skan#ifndef _SECURITY_AUDIT_PRIVATE_H_
38169691Skan#define	_SECURITY_AUDIT_PRIVATE_H_
39169691Skan
40169691Skan#ifndef _KERNEL
41169691Skan#error "no user-serviceable parts inside"
42169691Skan#endif
43169691Skan
44169691Skan#include <sys/ipc.h>
45169691Skan#include <sys/socket.h>
46169691Skan#include <sys/ucred.h>
47169691Skan
48169691Skan#ifdef MALLOC_DECLARE
49169691SkanMALLOC_DECLARE(M_AUDITBSM);
50169691SkanMALLOC_DECLARE(M_AUDITDATA);
51169691SkanMALLOC_DECLARE(M_AUDITPATH);
52169691SkanMALLOC_DECLARE(M_AUDITTEXT);
53169691SkanMALLOC_DECLARE(M_AUDITGIDSET);
54169691Skan#endif
55169691Skan
56169691Skan/*
57169691Skan * Audit control variables that are usually set/read via system calls and
58169691Skan * used to control various aspects of auditing.
59169691Skan */
60169691Skanextern struct au_qctrl		audit_qctrl;
61169691Skanextern struct audit_fstat	audit_fstat;
62169691Skanextern struct au_mask		audit_nae_mask;
63169691Skanextern int			audit_panic_on_write_fail;
64169691Skanextern int			audit_fail_stop;
65169691Skanextern int			audit_argv;
66169691Skanextern int			audit_arge;
67169691Skan
68169691Skan/*
69169691Skan * Success/failure conditions for the conversion of a kernel audit record to
70169691Skan * BSM format.
71169691Skan */
72169691Skan#define	BSM_SUCCESS	0
73169691Skan#define	BSM_FAILURE	1
74169691Skan#define	BSM_NOAUDIT	2
75169691Skan
76169691Skan/*
77169691Skan * Defines for the kernel audit record k_ar_commit field.  Flags are set to
78169691Skan * indicate what sort of record it is, and which preselection mechanism
79169691Skan * selected it.
80169691Skan */
81169691Skan#define	AR_COMMIT_KERNEL	0x00000001U
82169691Skan#define	AR_COMMIT_USER		0x00000010U
83169691Skan
84169691Skan#define	AR_PRESELECT_TRAIL	0x00001000U
85169691Skan#define	AR_PRESELECT_PIPE	0x00002000U
86169691Skan
87169691Skan#define	AR_PRESELECT_USER_TRAIL	0x00004000U
88169691Skan#define	AR_PRESELECT_USER_PIPE	0x00008000U
89169691Skan
90169691Skan/*
91169691Skan * Audit data is generated as a stream of struct audit_record structures,
92169691Skan * linked by struct kaudit_record, and contain storage for possible audit so
93169691Skan * that it will not need to be allocated during the processing of a system
94169691Skan * call, both improving efficiency and avoiding sleeping at untimely moments.
95169691Skan * This structure is converted to BSM format before being written to disk.
96169691Skan */
97169691Skanstruct vnode_au_info {
98169691Skan	mode_t	vn_mode;
99169691Skan	uid_t	vn_uid;
100169691Skan	gid_t	vn_gid;
101169691Skan	dev_t	vn_dev;
102169691Skan	long	vn_fsid;
103169691Skan	long	vn_fileid;
104169691Skan	long	vn_gen;
105169691Skan};
106169691Skan
107169691Skanstruct groupset {
108169691Skan	gid_t	*gidset;
109169691Skan	u_int	 gidset_size;
110169691Skan};
111169691Skan
112169691Skanstruct socket_au_info {
113169691Skan	int		so_domain;
114169691Skan	int		so_type;
115169691Skan	int		so_protocol;
116169691Skan	in_addr_t	so_raddr;	/* Remote address if INET socket. */
117169691Skan	in_addr_t	so_laddr;	/* Local address if INET socket. */
118169691Skan	u_short		so_rport;	/* Remote port. */
119169691Skan	u_short		so_lport;	/* Local port. */
120169691Skan};
121169691Skan
122169691Skan/*
123169691Skan * The following is used for A_OLDSETQCTRL and AU_OLDGETQCTRL and a 64-bit
124169691Skan * userland.
125169691Skan */
126169691Skanstruct au_qctrl64 {
127169691Skan	u_int64_t	aq64_hiwater;
128169691Skan	u_int64_t	aq64_lowater;
129169691Skan	u_int64_t	aq64_bufsz;
130169691Skan	u_int64_t	aq64_delay;
131169691Skan	u_int64_t	aq64_minfree;
132169691Skan};
133169691Skantypedef	struct au_qctrl64	au_qctrl64_t;
134169691Skan
135169691Skanunion auditon_udata {
136169691Skan	char			*au_path;
137169691Skan	int			au_cond;
138169691Skan	int			au_flags;
139169691Skan	int			au_policy;
140169691Skan	int			au_trigger;
141169691Skan	int64_t			au_cond64;
142169691Skan	int64_t			au_policy64;
143169691Skan	au_evclass_map_t	au_evclass;
144169691Skan	au_mask_t		au_mask;
145169691Skan	auditinfo_t		au_auinfo;
146169691Skan	auditpinfo_t		au_aupinfo;
147169691Skan	auditpinfo_addr_t	au_aupinfo_addr;
148169691Skan	au_qctrl_t		au_qctrl;
149169691Skan	au_qctrl64_t		au_qctrl64;
150169691Skan	au_stat_t		au_stat;
151169691Skan	au_fstat_t		au_fstat;
152169691Skan	auditinfo_addr_t	au_kau_info;
153169691Skan};
154169691Skan
155169691Skanstruct posix_ipc_perm {
156169691Skan	uid_t	pipc_uid;
157169691Skan	gid_t	pipc_gid;
158169691Skan	mode_t	pipc_mode;
159169691Skan};
160169691Skan
161169691Skanstruct audit_record {
162169691Skan	/* Audit record header. */
163169691Skan	u_int32_t		ar_magic;
164169691Skan	int			ar_event;
165169691Skan	int			ar_retval; /* value returned to the process */
166169691Skan	int			ar_errno;  /* return status of system call */
167169691Skan	struct timespec		ar_starttime;
168169691Skan	struct timespec		ar_endtime;
169169691Skan	u_int64_t		ar_valid_arg;  /* Bitmask of valid arguments */
170169691Skan
171169691Skan	/* Audit subject information. */
172169691Skan	struct xucred		ar_subj_cred;
173169691Skan	uid_t			ar_subj_ruid;
174169691Skan	gid_t			ar_subj_rgid;
175169691Skan	gid_t			ar_subj_egid;
176169691Skan	uid_t			ar_subj_auid; /* Audit user ID */
177169691Skan	pid_t			ar_subj_asid; /* Audit session ID */
178169691Skan	pid_t			ar_subj_pid;
179169691Skan	struct au_tid		ar_subj_term;
180169691Skan	struct au_tid_addr	ar_subj_term_addr;
181169691Skan	struct au_mask		ar_subj_amask;
182169691Skan
183169691Skan	/* Operation arguments. */
184169691Skan	uid_t			ar_arg_euid;
185169691Skan	uid_t			ar_arg_ruid;
186169691Skan	uid_t			ar_arg_suid;
187169691Skan	gid_t			ar_arg_egid;
188169691Skan	gid_t			ar_arg_rgid;
189169691Skan	gid_t			ar_arg_sgid;
190169691Skan	pid_t			ar_arg_pid;
191169691Skan	pid_t			ar_arg_asid;
192169691Skan	struct au_tid		ar_arg_termid;
193169691Skan	struct au_tid_addr	ar_arg_termid_addr;
194169691Skan	uid_t			ar_arg_uid;
195169691Skan	uid_t			ar_arg_auid;
196169691Skan	gid_t			ar_arg_gid;
197169691Skan	struct groupset		ar_arg_groups;
198169691Skan	int			ar_arg_fd;
199169691Skan	int			ar_arg_fflags;
200169691Skan	mode_t			ar_arg_mode;
201169691Skan	int			ar_arg_dev;
202169691Skan	long			ar_arg_value;
203169691Skan	void *			ar_arg_addr;
204169691Skan	int			ar_arg_len;
205169691Skan	int			ar_arg_mask;
206169691Skan	u_int			ar_arg_signum;
207169691Skan	char			ar_arg_login[MAXLOGNAME];
208169691Skan	int			ar_arg_ctlname[CTL_MAXNAME];
209169691Skan	struct socket_au_info	ar_arg_sockinfo;
210169691Skan	char			*ar_arg_upath1;
211169691Skan	char			*ar_arg_upath2;
212169691Skan	char			*ar_arg_text;
213169691Skan	struct au_mask		ar_arg_amask;
214169691Skan	struct vnode_au_info	ar_arg_vnode1;
215169691Skan	struct vnode_au_info	ar_arg_vnode2;
216169691Skan	int			ar_arg_cmd;
217169691Skan	int			ar_arg_svipc_cmd;
218169691Skan	struct ipc_perm		ar_arg_svipc_perm;
219169691Skan	int			ar_arg_svipc_id;
220169691Skan	void *			ar_arg_svipc_addr;
221169691Skan	struct posix_ipc_perm	ar_arg_pipc_perm;
222169691Skan	union auditon_udata	ar_arg_auditon;
223169691Skan	char			*ar_arg_argv;
224169691Skan	int			ar_arg_argc;
225169691Skan	char			*ar_arg_envv;
226169691Skan	int			ar_arg_envc;
227169691Skan	int			ar_arg_exitstatus;
228169691Skan	int			ar_arg_exitretval;
229169691Skan	struct sockaddr_storage ar_arg_sockaddr;
230169691Skan};
231169691Skan
232169691Skan/*
233169691Skan * Arguments in the audit record are initially not defined; flags are set to
234169691Skan * indicate if they are present so they can be included in the audit log
235169691Skan * stream only if defined.
236169691Skan */
237169691Skan#define	ARG_IS_VALID(kar, arg)	((kar)->k_ar.ar_valid_arg & (arg))
238169691Skan#define	ARG_SET_VALID(kar, arg) do {					\
239169691Skan	(kar)->k_ar.ar_valid_arg |= (arg);				\
240169691Skan} while (0)
241169691Skan
242169691Skan/*
243169691Skan * In-kernel version of audit record; the basic record plus queue meta-data.
244169691Skan * This record can also have a pointer set to some opaque data that will be
245169691Skan * passed through to the audit writing mechanism.
246169691Skan */
247169691Skanstruct kaudit_record {
248169691Skan	struct audit_record		 k_ar;
249169691Skan	u_int32_t			 k_ar_commit;
250169691Skan	void				*k_udata;	/* User data. */
251169691Skan	u_int				 k_ulen;	/* User data length. */
252169691Skan	struct uthread			*k_uthread;	/* Audited thread. */
253169691Skan	TAILQ_ENTRY(kaudit_record)	 k_q;
254169691Skan};
255169691SkanTAILQ_HEAD(kaudit_queue, kaudit_record);
256169691Skan
257169691Skan/*
258169691Skan * Functions to manage the allocation, release, and commit of kernel audit
259169691Skan * records.
260169691Skan */
261169691Skanvoid			 audit_abort(struct kaudit_record *ar);
262169691Skanvoid			 audit_commit(struct kaudit_record *ar, int error,
263169691Skan			    int retval);
264169691Skanstruct kaudit_record	*audit_new(int event, struct thread *td);
265169691Skan
266169691Skan/*
267169691Skan * Functions relating to the conversion of internal kernel audit records to
268169691Skan * the BSM file format.
269169691Skan */
270169691Skanstruct au_record;
271169691Skanint	 kaudit_to_bsm(struct kaudit_record *kar, struct au_record **pau);
272169691Skanint	 bsm_rec_verify(void *rec);
273169691Skan
274169691Skan/*
275169691Skan * Kernel versions of the libbsm audit record functions.
276169691Skan */
277169691Skanvoid	 kau_free(struct au_record *rec);
278169691Skanvoid	 kau_init(void);
279169691Skan
280169691Skan/*
281169691Skan * Return values for pre-selection and post-selection decisions.
282169691Skan */
283169691Skan#define	AU_PRS_SUCCESS	1
284169691Skan#define	AU_PRS_FAILURE	2
285169691Skan#define	AU_PRS_BOTH	(AU_PRS_SUCCESS|AU_PRS_FAILURE)
286169691Skan
287169691Skan/*
288169691Skan * Data structures relating to the kernel audit queue.  Ideally, these might
289169691Skan * be abstracted so that only accessor methods are exposed.
290169691Skan */
291169691Skanextern struct mtx		audit_mtx;
292169691Skanextern struct cv		audit_watermark_cv;
293169691Skanextern struct cv		audit_worker_cv;
294169691Skanextern struct kaudit_queue	audit_q;
295169691Skanextern int			audit_q_len;
296169691Skanextern int			audit_pre_q_len;
297169691Skanextern int			audit_in_failure;
298169691Skan
299169691Skan/*
300169691Skan * Flags to use on audit files when opening and closing.
301169691Skan */
302169691Skan#define	AUDIT_OPEN_FLAGS	(FWRITE | O_APPEND)
303169691Skan#define	AUDIT_CLOSE_FLAGS	(FWRITE | O_APPEND)
304169691Skan
305169691Skan#include <sys/fcntl.h>
306169691Skan#include <sys/kernel.h>
307169691Skan#include <sys/malloc.h>
308169691Skan
309169691Skan/*
310169691Skan * Some of the BSM tokenizer functions take different parameters in the
311169691Skan * kernel implementations in order to save the copying of large kernel data
312169691Skan * structures.  The prototypes of these functions are declared here.
313169691Skan */
314169691Skantoken_t		*kau_to_socket(struct socket_au_info *soi);
315169691Skan
316169691Skan/*
317169691Skan * audit_klib prototypes
318169691Skan */
319169691Skanint		 au_preselect(au_event_t event, au_class_t class,
320169691Skan		    au_mask_t *mask_p, int sorf);
321169691Skanvoid		 au_evclassmap_init(void);
322169691Skanvoid		 au_evclassmap_insert(au_event_t event, au_class_t class);
323169691Skanau_class_t	 au_event_class(au_event_t event);
324169691Skanau_event_t	 audit_ctlname_to_sysctlevent(int name[], uint64_t valid_arg);
325169691Skanau_event_t	 audit_flags_and_error_to_openevent(int oflags, int error);
326169691Skanau_event_t	 audit_msgctl_to_event(int cmd);
327169691Skanau_event_t	 audit_semctl_to_event(int cmr);
328169691Skanvoid		 audit_canon_path(struct thread *td, char *path, char *cpath);
329169691Skanau_event_t	 auditon_command_event(int cmd);
330169691Skan
331169691Skan/*
332169691Skan * Audit trigger events notify user space of kernel audit conditions
333169691Skan * asynchronously.
334169691Skan */
335169691Skanvoid		 audit_trigger_init(void);
336169691Skanint		 audit_send_trigger(unsigned int trigger);
337169691Skan
338169691Skan/*
339169691Skan * Accessor functions to manage global audit state.
340169691Skan */
341169691Skanvoid	 audit_set_kinfo(struct auditinfo_addr *);
342169691Skanvoid	 audit_get_kinfo(struct auditinfo_addr *);
343169691Skan
344169691Skan/*
345169691Skan * General audit related functions.
346169691Skan */
347169691Skanstruct kaudit_record	*currecord(void);
348169691Skanvoid			 audit_free(struct kaudit_record *ar);
349169691Skanvoid			 audit_shutdown(void *arg, int howto);
350169691Skanvoid			 audit_rotate_vnode(struct ucred *cred,
351169691Skan			    struct vnode *vp);
352169691Skanvoid			 audit_worker_init(void);
353169691Skan
354169691Skan/*
355169691Skan * Audit pipe functions.
356169691Skan */
357169691Skanint	 audit_pipe_preselect(au_id_t auid, au_event_t event,
358169691Skan	    au_class_t class, int sorf, int trail_select);
359169691Skanvoid	 audit_pipe_submit(au_id_t auid, au_event_t event, au_class_t class,
360169691Skan	    int sorf, int trail_select, void *record, u_int record_len);
361169691Skanvoid	 audit_pipe_submit_user(void *record, u_int record_len);
362169691Skan
363169691Skan#endif /* ! _SECURITY_AUDIT_PRIVATE_H_ */
364169691Skan