xref: /xnu-8020.140.41/bsd/security/audit/audit_private.h (revision 27b03b360a988dfd3dfdf34262bb0042026747cc)
1 /*-
2  * Copyright (c) 1999-2020 Apple Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR
21  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
26  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
29 /*
30  * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce
31  * support for mandatory and extensible security protections.  This notice
32  * is included in support of clause 2.2 (b) of the Apple Public License,
33  * Version 2.0.
34  */
35 
36 /*
37  * This include file contains function prototypes and type definitions used
38  * within the audit implementation.
39  */
40 
41 #ifndef _SECURITY_AUDIT_PRIVATE_H_
42 #define _SECURITY_AUDIT_PRIVATE_H_
43 
44 #if defined(_KERNEL) || defined(KERNEL)
45 
46 #if CONFIG_MACF
47 #include <sys/queue.h>
48 #include <security/mac_framework.h>
49 #endif
50 
51 #include <sys/ipc.h>
52 #include <sys/proc_internal.h>  /* for PID_MAX */
53 #include <sys/socket.h>
54 #include <sys/ucred.h>
55 
56 #ifdef MALLOC_DECLARE
57 MALLOC_DECLARE(M_AUDITBSM);
58 MALLOC_DECLARE(M_AUDITDATA);
59 MALLOC_DECLARE(M_AUDITPATH);
60 MALLOC_DECLARE(M_AUDITTEXT);
61 #endif
62 #if CONFIG_AUDIT
63 /*
64  * mac_audit_data_zone is the zone used for data pushed into the audit
65  * record by policies. Using a zone simplifies memory management of this
66  * data, and allows tracking of the amount of data in flight.
67  */
68 extern zone_t mac_audit_data_zone;
69 #endif
70 
71 /*
72  * Audit control variables that are usually set/read via system calls and
73  * used to control various aspects of auditing.
74  */
75 extern struct au_qctrl          audit_qctrl;
76 extern struct audit_fstat       audit_fstat;
77 extern struct au_mask           audit_nae_mask;
78 extern int                      audit_panic_on_write_fail;
79 extern int                      audit_fail_stop;
80 extern int                      audit_argv;
81 extern int                      audit_arge;
82 extern au_ctlmode_t     audit_ctl_mode;
83 extern au_expire_after_t        audit_expire_after;
84 
85 /*
86  * Kernel mask that is used to check to see if system calls need to be audited.
87  */
88 extern au_class_t               audit_kevent_mask;
89 
90 /*
91  * The macro used to check to see if the system calls need to be auditing.
92  * This will pessimisticly set the audit syscalls flag if the audit kevent
93  * mask has not been created yet.  User code should build the event/class
94  * mapping table before setting preselection masks to avoid this.
95  */
96 #define AUDIT_CHECK_IF_KEVENTS_MASK(m) do {                             \
97 	if ((m).am_success || (m).am_failure)                           \
98 	        if (!audit_kevent_mask ||                               \
99 	            (audit_kevent_mask & (m).am_success) ||             \
100 	            (audit_kevent_mask & (m).am_failure))               \
101 	                audit_syscalls = 1;                             \
102 } while (0)
103 
104 /*
105  * Success/failure conditions for the conversion of a kernel audit record to
106  * BSM format.
107  */
108 #define BSM_SUCCESS     0
109 #define BSM_FAILURE     1
110 #define BSM_NOAUDIT     2
111 
112 /*
113  * Defines for the kernel audit record k_ar_commit field.  Flags are set to
114  * indicate what sort of record it is, and which preselection mechanism
115  * selected it.
116  */
117 #define AR_COMMIT_KERNEL        0x00000001U
118 #define AR_COMMIT_USER          0x00000010U
119 
120 #define AR_PRESELECT_TRAIL      0x00001000U
121 #define AR_PRESELECT_PIPE       0x00002000U
122 
123 #define AR_PRESELECT_USER_TRAIL 0x00004000U
124 #define AR_PRESELECT_USER_PIPE  0x00008000U
125 
126 #define AR_PRESELECT_FILTER     0x00010000U
127 
128 #define AR_DRAIN_QUEUE          0x80000000U
129 
130 /*
131  * Audit data is generated as a stream of struct audit_record structures,
132  * linked by struct kaudit_record, and contain storage for possible audit so
133  * that it will not need to be allocated during the processing of a system
134  * call, both improving efficiency and avoiding sleeping at untimely moments.
135  * This structure is converted to BSM format before being written to disk.
136  */
137 struct vnode_au_info {
138 	mode_t  vn_mode;
139 	uid_t   vn_uid;
140 	gid_t   vn_gid;
141 	dev_t   vn_dev;
142 	long    vn_fsid;
143 	long    vn_fileid;
144 	long    vn_gen;
145 };
146 
147 struct groupset {
148 	gid_t   gidset[NGROUPS];
149 	u_int   gidset_size;
150 };
151 
152 struct socket_au_info {
153 	int                     sai_domain;
154 	int                     sai_type;
155 	int                     sai_protocol;
156 
157 	/* Foreign (remote) address/port. */
158 	struct sockaddr_storage sai_faddr;
159 
160 	/* Local address/port. */
161 	struct sockaddr_storage sai_laddr;
162 };
163 
164 /*
165  *  The following is used for A_OLDSETQCTRL and A_OLDGETQCTRL and a 64-bit
166  *  userland.
167  */
168 struct  au_qctrl64 {
169 	u_int64_t               aq64_hiwater;
170 	u_int64_t               aq64_lowater;
171 	u_int64_t               aq64_bufsz;
172 	u_int64_t               aq64_delay;
173 	int64_t                 aq64_minfree;
174 };
175 typedef struct au_qctrl64 au_qctrl64_t;
176 
177 union auditon_udata {
178 	char                    *au_path;
179 	int                     au_cond;
180 	int                     au_policy;
181 	int64_t                 au_cond64;
182 	int64_t                 au_policy64;
183 	int                     au_trigger;
184 	au_evclass_map_t        au_evclass;
185 	au_mask_t               au_mask;
186 	au_asflgs_t             au_flags;
187 	auditinfo_t             au_auinfo;
188 	auditpinfo_t            au_aupinfo;
189 	auditpinfo_addr_t       au_aupinfo_addr;
190 	au_qctrl_t              au_qctrl;
191 	au_qctrl64_t            au_qctrl64;
192 	au_stat_t               au_stat;
193 	au_fstat_t              au_fstat;
194 	auditinfo_addr_t        au_kau_info;
195 	au_ctlmode_t    au_ctl_mode;
196 	au_expire_after_t       au_expire_after;
197 };
198 
199 struct posix_ipc_perm {
200 	uid_t   pipc_uid;
201 	gid_t   pipc_gid;
202 	mode_t  pipc_mode;
203 };
204 
205 struct au_identity_info {
206 	u_int32_t       signer_type;
207 	char            *signing_id;
208 	u_char          signing_id_trunc;
209 	char            *team_id;
210 	u_char          team_id_trunc;
211 	u_int8_t        *cdhash;
212 	u_int16_t       cdhash_len;
213 };
214 
215 struct audit_record {
216 	/* Audit record header. */
217 	u_int32_t               ar_magic;
218 	int                     ar_event;
219 	int                     ar_retval; /* value returned to the process */
220 	int                     ar_errno;  /* return status of system call */
221 	struct timespec         ar_starttime;
222 	struct timespec         ar_endtime;
223 	u_int64_t               ar_valid_arg;  /* Bitmask of valid arguments */
224 
225 	/* Audit subject information. */
226 	struct xucred           ar_subj_cred;
227 	uid_t                   ar_subj_ruid;
228 	gid_t                   ar_subj_rgid;
229 	gid_t                   ar_subj_egid;
230 	uid_t                   ar_subj_auid; /* Audit user ID */
231 	pid_t                   ar_subj_asid; /* Audit session ID */
232 	pid_t                   ar_subj_pid;
233 	struct au_tid           ar_subj_term;
234 	struct au_tid_addr      ar_subj_term_addr;
235 	struct au_mask          ar_subj_amask;
236 
237 	/* Operation arguments. */
238 	uid_t                   ar_arg_euid;
239 	uid_t                   ar_arg_ruid;
240 	uid_t                   ar_arg_suid;
241 	gid_t                   ar_arg_egid;
242 	gid_t                   ar_arg_rgid;
243 	gid_t                   ar_arg_sgid;
244 	pid_t                   ar_arg_pid;
245 	pid_t                   ar_arg_asid;
246 	struct au_tid           ar_arg_termid;
247 	struct au_tid_addr      ar_arg_termid_addr;
248 	uid_t                   ar_arg_uid;
249 	uid_t                   ar_arg_auid;
250 	gid_t                   ar_arg_gid;
251 	struct groupset         ar_arg_groups;
252 	int                     ar_arg_fd;
253 	int                     ar_arg_fflags;
254 	mode_t                  ar_arg_mode;
255 	uint32_t                ar_arg_value32;
256 	uint64_t                ar_arg_value64;
257 	user_addr_t             ar_arg_addr;
258 	user_size_t             ar_arg_len;
259 	int                     ar_arg_mask;
260 	u_int                   ar_arg_signum;
261 	char                    ar_arg_login[MAXLOGNAME];
262 	int                     ar_arg_ctlname[CTL_MAXNAME];
263 	struct socket_au_info   ar_arg_sockinfo;
264 	char                    *ar_arg_upath1;
265 	char                    *ar_arg_upath2;
266 	char                    *ar_arg_kpath1;         /* darwin-only */
267 	char                    *ar_arg_kpath2;         /* darwin-only */
268 #if CONFIG_MACF
269 	char                    *ar_vnode1_mac_labels;
270 	char                    *ar_vnode2_mac_labels;
271 	char                    *ar_cred_mac_labels;
272 	char                    *ar_arg_mac_string;
273 #endif
274 	char                    *ar_arg_text;
275 	void                    *ar_arg_opaque;         /* darwin-only */
276 	void                    *ar_arg_data;           /* darwin-only */
277 	u_int16_t               ar_arg_opq_size;        /* darwin-only */
278 	u_char                  ar_arg_data_type;       /* darwin-only */
279 	u_char                  ar_arg_data_count;      /* darwin-only */
280 	struct au_mask          ar_arg_amask;
281 	struct vnode_au_info    ar_arg_vnode1;
282 	struct vnode_au_info    ar_arg_vnode2;
283 	int                     ar_arg_cmd;
284 	int                     ar_arg_svipc_cmd;
285 	struct ipc_perm         ar_arg_svipc_perm;
286 	int                     ar_arg_svipc_id;
287 	user_addr_t             ar_arg_svipc_addr;
288 	struct posix_ipc_perm   ar_arg_pipc_perm;
289 	mach_port_name_t        ar_arg_mach_port1;      /* darwin-only */
290 	mach_port_name_t        ar_arg_mach_port2;      /* darwin-only */
291 	union auditon_udata     ar_arg_auditon;
292 	char                    *ar_arg_argv;
293 	int                     ar_arg_argc;
294 	char                    *ar_arg_envv;
295 	int                     ar_arg_envc;
296 	int                     ar_arg_exitstatus;
297 	int                     ar_arg_exitretval;
298 	struct sockaddr_storage ar_arg_sockaddr;
299 	int                     ar_arg_fd2;
300 
301 #if CONFIG_MACF
302 	/*
303 	 * MAC security related fields added by MAC policies ar_forced_by_mac
304 	 * is 1 if mac_audit_check_preselect() forced this call to be audited,
305 	 * 0 otherwise.
306 	 */
307 	LIST_HEAD(mac_audit_record_list_t, mac_audit_record)    * ar_mac_records;
308 	int                     ar_forced_by_mac;
309 #endif
310 	struct au_identity_info ar_arg_identity;
311 };
312 
313 /*
314  * Arguments in the audit record are initially not defined; flags are set to
315  * indicate if they are present so they can be included in the audit log
316  * stream only if defined.
317  */
318 #define ARG_IS_VALID(kar, arg)  ((kar)->k_ar.ar_valid_arg & (arg))
319 #define ARG_SET_VALID(kar, arg) do {                                    \
320 	(kar)->k_ar.ar_valid_arg |= (arg);                              \
321 } while (0)
322 
323 /*
324  * Current thread macro.  get_bsdthread_info() returns a void ptr for some
325  * reason.
326  */
327 #define curthread()     current_uthread()
328 
329 /*
330  * In-kernel version of audit record; the basic record plus queue meta-data.
331  * This record can also have a pointer set to some opaque data that will be
332  * passed through to the audit writing mechanism.
333  */
334 struct kaudit_record {
335 	struct audit_record              k_ar;
336 	u_int32_t                        k_ar_commit;
337 	void                            *k_udata;       /* User data. */
338 	u_int                            k_ulen;        /* User data length. */
339 	struct uthread                  *k_uthread;     /* Audited thread. */
340 	TAILQ_ENTRY(kaudit_record)       k_q;
341 };
342 TAILQ_HEAD(kaudit_queue, kaudit_record);
343 
344 /*
345  * Functions to manage the allocation, release, and commit of kernel audit
346  * records.
347  */
348 void                     audit_abort(struct kaudit_record *ar);
349 void                     audit_commit(struct kaudit_record *ar, int error,
350     int retval);
351 struct kaudit_record    *audit_new(int event, proc_t p, struct uthread *td);
352 
353 /*
354  * Functions relating to the conversion of internal kernel audit records to
355  * the BSM file format.
356  */
357 struct au_record;
358 int      kaudit_to_bsm(struct kaudit_record *kar, struct au_record **pau);
359 int      bsm_rec_verify(void *rec, int length, boolean_t kern_events_allowed);
360 
361 /*
362  * Kernel versions of the libbsm audit record functions.
363  */
364 void     kau_free(struct au_record *rec);
365 void     kau_init(void);
366 
367 /*
368  * Return values for pre-selection and post-selection decisions.
369  */
370 #define AU_PRS_SUCCESS  1
371 #define AU_PRS_FAILURE  2
372 #define AU_PRS_BOTH     (AU_PRS_SUCCESS|AU_PRS_FAILURE)
373 
374 /*
375  * Data structures relating to the kernel audit queue.  Ideally, these might
376  * be abstracted so that only accessor methods are exposed.
377  */
378 extern struct mtx               audit_mtx;
379 extern struct cv                audit_watermark_cv;
380 extern struct cv                audit_worker_cv;
381 extern struct cv                audit_drain_cv;
382 extern struct kaudit_queue      audit_q;
383 extern int                      audit_q_len;
384 extern int                      audit_pre_q_len;
385 extern int                      audit_in_failure;
386 
387 /*
388  * Flags to use on audit files when opening and closing.
389  */
390 #define AUDIT_OPEN_FLAGS        (FWRITE | O_APPEND)
391 #define AUDIT_CLOSE_FLAGS       (FWRITE | O_APPEND)
392 
393 #include <sys/fcntl.h>
394 #include <sys/kernel.h>
395 #include <sys/malloc.h>
396 
397 /*
398  * Some of the BSM tokenizer functions take different parameters in the
399  * kernel implementations in order to save the copying of large kernel data
400  * structures.  The prototypes of these functions are declared here.
401  */
402 token_t         *kau_to_socket(struct socket_au_info *soi);
403 
404 /*
405  * audit_klib prototypes
406  */
407 int              au_preselect(au_event_t event, au_class_t class,
408     au_mask_t *mask_p, int sorf);
409 void             au_evclassmap_init(void);
410 void             au_evclassmap_insert(au_event_t event, au_class_t class);
411 au_class_t       au_event_class(au_event_t event);
412 au_event_t       audit_ctlname_to_sysctlevent(int name[], uint64_t valid_arg);
413 au_event_t       audit_flags_and_error_to_openevent(int oflags, int error);
414 au_event_t       audit_flags_and_error_to_openextendedevent(int oflags,
415     int error);
416 au_event_t       audit_flags_and_error_to_openatevent(int oflags,
417     int error);
418 au_event_t       audit_flags_and_error_to_openbyidevent(int oflags,
419     int error);
420 au_event_t       audit_msgctl_to_event(int cmd);
421 au_event_t       audit_semctl_to_event(int cmr);
422 int              audit_canon_path(struct vnode *cwd_vp, const char *path,
423     char *cpath);
424 au_event_t       auditon_command_event(int cmd);
425 au_event_t       audit_fcntl_command_event(int cmd, int oflags, int error);
426 
427 /*
428  * Audit trigger events notify user space of kernel audit conditions
429  * asynchronously.
430  */
431 int              audit_send_trigger(unsigned int trigger);
432 int              audit_send_analytics(char* id, char* name);
433 
434 /*
435  * Accessor functions to manage global audit state.
436  */
437 void            audit_set_kinfo(struct auditinfo_addr *);
438 void            audit_get_kinfo(struct auditinfo_addr *);
439 
440 /*
441  * General audit related functions.
442  */
443 struct kaudit_record    *currecord(void);
444 void                     audit_free(struct kaudit_record *ar);
445 void                     audit_rotate_vnode(struct ucred *cred,
446     struct vnode *vp);
447 void                     audit_worker_init(void);
448 void                     audit_identity_info_construct(
449 	struct au_identity_info *id_info);
450 void                     audit_identity_info_destruct(
451 	struct au_identity_info *id_info);
452 
453 /*
454  * Audit pipe functions.
455  */
456 int      audit_pipe_init(void);
457 int      audit_pipe_shutdown(void);
458 int      audit_pipe_preselect(au_id_t auid, au_event_t event,
459     au_class_t class, int sorf, int trail_select);
460 void     audit_pipe_submit(au_id_t auid, au_event_t event, au_class_t class,
461     int sorf, int trail_select, void *record, u_int record_len);
462 void     audit_pipe_submit_user(void *record, u_int record_len);
463 
464 /*
465  * Audit MAC prototypes.
466  */
467 int     audit_mac_new(proc_t p, struct kaudit_record *ar);
468 void    audit_mac_free(struct kaudit_record *ar);
469 int     audit_mac_syscall_enter(unsigned short code, proc_t p,
470     struct uthread *uthread, kauth_cred_t my_cred, au_event_t event);
471 int     audit_mac_syscall_exit(unsigned short code, struct uthread *uthread,
472     int error, int retval);
473 
474 /*
475  * Audit Session.
476  */
477 void    audit_session_init(void);
478 int     audit_session_setaia(proc_t p, auditinfo_addr_t *aia_p);
479 auditinfo_addr_t *audit_session_update(auditinfo_addr_t *new_aia);
480 int     audit_session_lookup(au_asid_t asid, auditinfo_addr_t *ret_aia);
481 
482 /*
483  * Kernel assigned audit session IDs start at PID_MAX + 1 and ends at
484  * ASSIGNED_ASID_MAX.
485  */
486 #define ASSIGNED_ASID_MIN       (PID_MAX + 1)
487 #define ASSIGNED_ASID_MAX       (0xFFFFFFFF - 1)
488 
489 /*
490  * Entitlement required to control various audit subsystem settings
491  */
492 #define AU_CLASS_RESERVED_ENTITLEMENT "com.apple.private.dz.audit"
493 
494 /*
495  * Entitlement required to control auditctl sys call
496  */
497 #define AU_AUDITCTL_RESERVED_ENTITLEMENT "com.apple.private.protected-audit-control"
498 
499 /*
500  * Entitlement required to control auditctl sys call
501  */
502 #define AU_AUDIT_USER_ENTITLEMENT "com.apple.private.audit.user"
503 
504 /*
505  * Max sizes used by the kernel for signing id and team id values of the
506  * identity tokens. These lengths include space for the null terminator.
507  */
508 #define MAX_AU_IDENTITY_SIGNING_ID_LENGTH 129
509 #define MAX_AU_IDENTITY_TEAM_ID_LENGTH 17
510 
511 struct __attribute__((__packed__)) hdr_tok_partial {
512 	u_char type;
513 	uint32_t len;
514 	u_char ver;
515 	uint16_t e_type;
516 };
517 static_assert(sizeof(struct hdr_tok_partial) == 8);
518 
519 struct __attribute__((__packed__)) trl_tok_partial {
520 	u_char type;
521 	uint16_t magic;
522 	uint32_t len;
523 };
524 static_assert(sizeof(struct trl_tok_partial) == 7);
525 
526 #endif /* defined(KERNEL) || defined(_KERNEL) */
527 
528 #endif /* ! _SECURITY_AUDIT_PRIVATE_H_ */
529