2 * Copyright (c) 1999-2016 Apple Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
31 * NOTICE: This file was modified by McAfee Research in 2004 to introduce
32 * support for mandatory and extensible security protections. This notice
33 * is included in support of clause 2.2 (b) of the Apple Public License,
37 #include <sys/param.h>
38 #include <sys/fcntl.h>
39 #include <sys/kernel.h>
41 #include <sys/namei.h>
42 #include <sys/proc_internal.h>
43 #include <sys/kauth.h>
44 #include <sys/queue.h>
45 #include <sys/systm.h>
47 #include <sys/ucred.h>
49 #include <sys/unistd.h>
50 #include <sys/file_internal.h>
51 #include <sys/vnode_internal.h>
53 #include <sys/syscall.h>
54 #include <sys/malloc.h>
56 #include <sys/sysent.h>
57 #include <sys/sysproto.h>
58 #include <sys/vfs_context.h>
59 #include <sys/domain.h>
60 #include <sys/protosw.h>
61 #include <sys/socketvar.h>
62 #include <sys/codesign.h>
65 #include <bsm/audit.h>
66 #include <bsm/audit_internal.h>
67 #include <bsm/audit_kevents.h>
69 #include <security/audit/audit.h>
70 #include <security/audit/audit_bsd.h>
71 #include <security/audit/audit_private.h>
73 #include <mach/host_priv.h>
74 #include <mach/host_special_ports.h>
75 #include <mach/audit_triggers_server.h>
77 #include <kern/host.h>
78 #include <kern/zalloc.h>
79 #include <kern/sched_prim.h>
82 #include <bsm/audit_record.h>
83 #include <security/mac.h>
84 #include <security/mac_framework.h>
85 #include <security/mac_policy.h>
86 extern zone_t audit_mac_label_zone
;
89 #include <net/route.h>
91 #include <netinet/in.h>
92 #include <netinet/in_pcb.h>
96 * Calls to manipulate elements of the audit record structure from system
97 * call code. Macro wrappers will prevent this functions from being entered
98 * if auditing is disabled, avoiding the function call cost. We check the
99 * thread audit record pointer anyway, as the audit condition could change,
100 * and pre-selection may not have allocated an audit record for this event.
102 * XXXAUDIT: Should we assert, in each case, that this field of the record
103 * hasn't already been filled in?
106 audit_arg_addr(struct kaudit_record
*ar
, user_addr_t addr
)
108 struct proc
*p
= current_proc();
110 ar
->k_ar
.ar_arg_addr
= addr
;
113 * If the process is 64-bit then flag the address as such.
115 if (proc_is64bit(p
)) {
116 ARG_SET_VALID(ar
, ARG_ADDR64
);
118 ARG_SET_VALID(ar
, ARG_ADDR32
);
123 audit_arg_exit(struct kaudit_record
*ar
, int status
, int retval
)
125 ar
->k_ar
.ar_arg_exitstatus
= status
;
126 ar
->k_ar
.ar_arg_exitretval
= retval
;
127 ARG_SET_VALID(ar
, ARG_EXIT
);
131 audit_arg_len(struct kaudit_record
*ar
, user_size_t len
)
133 ar
->k_ar
.ar_arg_len
= len
;
134 ARG_SET_VALID(ar
, ARG_LEN
);
138 audit_arg_fd2(struct kaudit_record
*ar
, int fd
)
140 ar
->k_ar
.ar_arg_fd2
= fd
;
141 ARG_SET_VALID(ar
, ARG_FD2
);
145 audit_arg_fd(struct kaudit_record
*ar
, int fd
)
147 ar
->k_ar
.ar_arg_fd
= fd
;
148 ARG_SET_VALID(ar
, ARG_FD
);
152 audit_arg_fflags(struct kaudit_record
*ar
, int fflags
)
154 ar
->k_ar
.ar_arg_fflags
= fflags
;
155 ARG_SET_VALID(ar
, ARG_FFLAGS
);
159 audit_arg_gid(struct kaudit_record
*ar
, gid_t gid
)
161 ar
->k_ar
.ar_arg_gid
= gid
;
162 ARG_SET_VALID(ar
, ARG_GID
);
166 audit_arg_uid(struct kaudit_record
*ar
, uid_t uid
)
168 ar
->k_ar
.ar_arg_uid
= uid
;
169 ARG_SET_VALID(ar
, ARG_UID
);
173 audit_arg_egid(struct kaudit_record
*ar
, gid_t egid
)
175 ar
->k_ar
.ar_arg_egid
= egid
;
176 ARG_SET_VALID(ar
, ARG_EGID
);
180 audit_arg_euid(struct kaudit_record
*ar
, uid_t euid
)
182 ar
->k_ar
.ar_arg_euid
= euid
;
183 ARG_SET_VALID(ar
, ARG_EUID
);
187 audit_arg_rgid(struct kaudit_record
*ar
, gid_t rgid
)
189 ar
->k_ar
.ar_arg_rgid
= rgid
;
190 ARG_SET_VALID(ar
, ARG_RGID
);
194 audit_arg_ruid(struct kaudit_record
*ar
, uid_t ruid
)
196 ar
->k_ar
.ar_arg_ruid
= ruid
;
197 ARG_SET_VALID(ar
, ARG_RUID
);
201 audit_arg_sgid(struct kaudit_record
*ar
, gid_t sgid
)
203 ar
->k_ar
.ar_arg_sgid
= sgid
;
204 ARG_SET_VALID(ar
, ARG_SGID
);
208 audit_arg_suid(struct kaudit_record
*ar
, uid_t suid
)
210 ar
->k_ar
.ar_arg_suid
= suid
;
211 ARG_SET_VALID(ar
, ARG_SUID
);
215 audit_arg_groupset(struct kaudit_record
*ar
, gid_t
*gidset
, u_int gidset_size
)
219 for (i
= 0; i
< gidset_size
; i
++) {
220 ar
->k_ar
.ar_arg_groups
.gidset
[i
] = gidset
[i
];
222 ar
->k_ar
.ar_arg_groups
.gidset_size
= gidset_size
;
223 ARG_SET_VALID(ar
, ARG_GROUPSET
);
227 audit_arg_login(struct kaudit_record
*ar
, char *login
)
229 strlcpy(ar
->k_ar
.ar_arg_login
, login
, MAXLOGNAME
);
230 ARG_SET_VALID(ar
, ARG_LOGIN
);
234 audit_arg_ctlname(struct kaudit_record
*ar
, int *name
, int namelen
)
236 bcopy(name
, &ar
->k_ar
.ar_arg_ctlname
, namelen
* sizeof(int));
237 ar
->k_ar
.ar_arg_len
= namelen
;
238 ARG_SET_VALID(ar
, ARG_CTLNAME
| ARG_LEN
);
242 audit_arg_mask(struct kaudit_record
*ar
, int mask
)
244 ar
->k_ar
.ar_arg_mask
= mask
;
245 ARG_SET_VALID(ar
, ARG_MASK
);
249 audit_arg_mode(struct kaudit_record
*ar
, mode_t mode
)
251 ar
->k_ar
.ar_arg_mode
= mode
;
252 ARG_SET_VALID(ar
, ARG_MODE
);
256 audit_arg_value32(struct kaudit_record
*ar
, uint32_t value32
)
258 ar
->k_ar
.ar_arg_value32
= value32
;
259 ARG_SET_VALID(ar
, ARG_VALUE32
);
263 audit_arg_value64(struct kaudit_record
*ar
, uint64_t value64
)
265 ar
->k_ar
.ar_arg_value64
= value64
;
266 ARG_SET_VALID(ar
, ARG_VALUE64
);
270 audit_arg_owner(struct kaudit_record
*ar
, uid_t uid
, gid_t gid
)
272 ar
->k_ar
.ar_arg_uid
= uid
;
273 ar
->k_ar
.ar_arg_gid
= gid
;
274 ARG_SET_VALID(ar
, ARG_UID
| ARG_GID
);
278 audit_arg_pid(struct kaudit_record
*ar
, pid_t pid
)
280 ar
->k_ar
.ar_arg_pid
= pid
;
281 ARG_SET_VALID(ar
, ARG_PID
);
285 audit_arg_process(struct kaudit_record
*ar
, proc_t p
)
287 kauth_cred_t my_cred
;
289 KASSERT(p
!= NULL
, ("audit_arg_process: p == NULL"));
295 my_cred
= kauth_cred_proc_ref(p
);
296 ar
->k_ar
.ar_arg_auid
= my_cred
->cr_audit
.as_aia_p
->ai_auid
;
297 ar
->k_ar
.ar_arg_asid
= my_cred
->cr_audit
.as_aia_p
->ai_asid
;
298 bcopy(&my_cred
->cr_audit
.as_aia_p
->ai_termid
,
299 &ar
->k_ar
.ar_arg_termid_addr
, sizeof(au_tid_addr_t
));
300 ar
->k_ar
.ar_arg_euid
= kauth_cred_getuid(my_cred
);
301 ar
->k_ar
.ar_arg_egid
= kauth_cred_getgid(my_cred
);
302 ar
->k_ar
.ar_arg_ruid
= kauth_cred_getruid(my_cred
);
303 ar
->k_ar
.ar_arg_rgid
= kauth_cred_getrgid(my_cred
);
304 kauth_cred_unref(&my_cred
);
305 ar
->k_ar
.ar_arg_pid
= p
->p_pid
;
306 ARG_SET_VALID(ar
, ARG_AUID
| ARG_EUID
| ARG_EGID
| ARG_RUID
|
307 ARG_RGID
| ARG_ASID
| ARG_TERMID_ADDR
| ARG_PID
| ARG_PROCESS
);
311 audit_arg_signum(struct kaudit_record
*ar
, u_int signum
)
313 ar
->k_ar
.ar_arg_signum
= signum
;
314 ARG_SET_VALID(ar
, ARG_SIGNUM
);
318 audit_arg_socket(struct kaudit_record
*ar
, int sodomain
, int sotype
,
321 ar
->k_ar
.ar_arg_sockinfo
.sai_domain
= sodomain
;
322 ar
->k_ar
.ar_arg_sockinfo
.sai_type
= sotype
;
323 ar
->k_ar
.ar_arg_sockinfo
.sai_protocol
= soprotocol
;
324 ARG_SET_VALID(ar
, ARG_SOCKINFO
);
328 * Note that the current working directory vp must be supplied at the audit
329 * call site to permit per thread current working directories, and that it
330 * must take a upath starting with '/' into account for chroot if the path
331 * is absolute. This results in the real (non-chroot) path being recorded
332 * in the audit record.
335 audit_arg_sockaddr(struct kaudit_record
*ar
, struct vnode
*cwd_vp
,
338 char path
[SOCK_MAXADDRLEN
- offsetof(struct sockaddr_un
, sun_path
) + 1] = "";
339 struct sockaddr_un
*sun
;
342 KASSERT(sa
!= NULL
, ("audit_arg_sockaddr: sa == NULL"));
344 if (cwd_vp
== NULL
|| sa
== NULL
) {
348 if (sa
->sa_len
> sizeof(ar
->k_ar
.ar_arg_sockaddr
)) {
349 bcopy(sa
, &ar
->k_ar
.ar_arg_sockaddr
, sizeof(ar
->k_ar
.ar_arg_sockaddr
));
351 bcopy(sa
, &ar
->k_ar
.ar_arg_sockaddr
, sa
->sa_len
);
354 switch (sa
->sa_family
) {
356 ARG_SET_VALID(ar
, ARG_SADDRINET
);
360 ARG_SET_VALID(ar
, ARG_SADDRINET6
);
364 sun
= (struct sockaddr_un
*)sa
;
365 namelen
= sun
->sun_len
- offsetof(struct sockaddr_un
, sun_path
);
366 if (namelen
> 0 && (size_t)namelen
< sizeof(path
)) {
368 * Make sure the path is NUL-terminated
370 bcopy(sun
->sun_path
, path
, namelen
);
372 audit_arg_upath(ar
, cwd_vp
, path
, ARG_UPATH1
);
374 ARG_SET_VALID(ar
, ARG_SADDRUNIX
);
376 /* XXXAUDIT: default:? */
381 audit_arg_auid(struct kaudit_record
*ar
, uid_t auid
)
383 ar
->k_ar
.ar_arg_auid
= auid
;
384 ARG_SET_VALID(ar
, ARG_AUID
);
388 audit_arg_auditinfo(struct kaudit_record
*ar
, struct auditinfo
*au_info
)
390 ar
->k_ar
.ar_arg_auid
= au_info
->ai_auid
;
391 ar
->k_ar
.ar_arg_asid
= au_info
->ai_asid
;
392 ar
->k_ar
.ar_arg_amask
.am_success
= au_info
->ai_mask
.am_success
;
393 ar
->k_ar
.ar_arg_amask
.am_failure
= au_info
->ai_mask
.am_failure
;
394 ar
->k_ar
.ar_arg_termid
.port
= au_info
->ai_termid
.port
;
395 ar
->k_ar
.ar_arg_termid
.machine
= au_info
->ai_termid
.machine
;
396 ARG_SET_VALID(ar
, ARG_AUID
| ARG_ASID
| ARG_AMASK
| ARG_TERMID
);
400 audit_arg_auditinfo_addr(struct kaudit_record
*ar
,
401 struct auditinfo_addr
*au_info
)
403 ar
->k_ar
.ar_arg_auid
= au_info
->ai_auid
;
404 ar
->k_ar
.ar_arg_asid
= au_info
->ai_asid
;
405 ar
->k_ar
.ar_arg_amask
.am_success
= au_info
->ai_mask
.am_success
;
406 ar
->k_ar
.ar_arg_amask
.am_failure
= au_info
->ai_mask
.am_failure
;
407 ar
->k_ar
.ar_arg_termid_addr
.at_type
= au_info
->ai_termid
.at_type
;
408 ar
->k_ar
.ar_arg_termid_addr
.at_port
= au_info
->ai_termid
.at_port
;
409 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[0] = au_info
->ai_termid
.at_addr
[0];
410 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[1] = au_info
->ai_termid
.at_addr
[1];
411 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[2] = au_info
->ai_termid
.at_addr
[2];
412 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[3] = au_info
->ai_termid
.at_addr
[3];
413 ARG_SET_VALID(ar
, ARG_AUID
| ARG_ASID
| ARG_AMASK
| ARG_TERMID_ADDR
);
417 audit_arg_text(struct kaudit_record
*ar
, char *text
)
419 KASSERT(text
!= NULL
, ("audit_arg_text: text == NULL"));
421 /* Invalidate the text string */
422 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_TEXT
);
427 if (ar
->k_ar
.ar_arg_text
== NULL
) {
428 ar
->k_ar
.ar_arg_text
= malloc(MAXPATHLEN
, M_AUDITTEXT
,
432 strlcpy(ar
->k_ar
.ar_arg_text
, text
, MAXPATHLEN
);
433 ARG_SET_VALID(ar
, ARG_TEXT
);
437 audit_arg_opaque(struct kaudit_record
*ar
, void *data
, size_t size
)
439 KASSERT(data
!= NULL
, ("audit_arg_opaque: data == NULL"));
440 KASSERT(size
<= UINT16_MAX
, ("audit_arg_opaque: size > UINT16_MAX"));
442 if (data
== NULL
|| size
> UINT16_MAX
) {
446 if (ar
->k_ar
.ar_arg_opaque
== NULL
) {
447 ar
->k_ar
.ar_arg_opaque
= malloc(size
, M_AUDITDATA
, M_WAITOK
);
452 memcpy(ar
->k_ar
.ar_arg_opaque
, data
, size
);
453 ar
->k_ar
.ar_arg_opq_size
= (u_int16_t
) size
;
454 ARG_SET_VALID(ar
, ARG_OPAQUE
);
458 audit_arg_data(struct kaudit_record
*ar
, void *data
, size_t size
, size_t number
)
462 KASSERT(data
!= NULL
, ("audit_arg_data: data == NULL"));
463 KASSERT(size
>= AUR_BYTE_SIZE
&& size
<= AUR_INT64_SIZE
,
464 ("audit_arg_data: size < AUR_BYTE_SIZE or size > AUR_INT64_SIZE"));
465 KASSERT(number
<= UINT8_MAX
,
466 ("audit_arg_data: number > UINT8_MAX"));
468 if (data
== NULL
|| size
< AUR_BYTE_SIZE
|| size
> AUR_INT64_SIZE
||
469 number
> UINT8_MAX
) {
475 if (ar
->k_ar
.ar_arg_data
== NULL
) {
476 ar
->k_ar
.ar_arg_data
= malloc(sz
, M_AUDITDATA
, M_WAITOK
);
481 memcpy(ar
->k_ar
.ar_arg_data
, data
, sz
);
485 ar
->k_ar
.ar_arg_data_type
= AUR_BYTE
;
489 ar
->k_ar
.ar_arg_data_type
= AUR_SHORT
;
493 ar
->k_ar
.ar_arg_data_type
= AUR_INT32
;
497 ar
->k_ar
.ar_arg_data_type
= AUR_INT64
;
501 free(ar
->k_ar
.ar_arg_data
, M_AUDITDATA
);
502 ar
->k_ar
.ar_arg_data
= NULL
;
506 ar
->k_ar
.ar_arg_data_count
= (u_char
)number
;
508 ARG_SET_VALID(ar
, ARG_DATA
);
512 audit_arg_cmd(struct kaudit_record
*ar
, int cmd
)
514 ar
->k_ar
.ar_arg_cmd
= cmd
;
515 ARG_SET_VALID(ar
, ARG_CMD
);
519 audit_arg_svipc_cmd(struct kaudit_record
*ar
, int cmd
)
521 ar
->k_ar
.ar_arg_svipc_cmd
= cmd
;
522 ARG_SET_VALID(ar
, ARG_SVIPC_CMD
);
526 audit_arg_svipc_perm(struct kaudit_record
*ar
, struct ipc_perm
*perm
)
528 bcopy(perm
, &ar
->k_ar
.ar_arg_svipc_perm
,
529 sizeof(ar
->k_ar
.ar_arg_svipc_perm
));
530 ARG_SET_VALID(ar
, ARG_SVIPC_PERM
);
534 audit_arg_svipc_id(struct kaudit_record
*ar
, int id
)
536 ar
->k_ar
.ar_arg_svipc_id
= id
;
537 ARG_SET_VALID(ar
, ARG_SVIPC_ID
);
541 audit_arg_svipc_addr(struct kaudit_record
*ar
, user_addr_t addr
)
543 ar
->k_ar
.ar_arg_svipc_addr
= addr
;
544 ARG_SET_VALID(ar
, ARG_SVIPC_ADDR
);
548 audit_arg_posix_ipc_perm(struct kaudit_record
*ar
, uid_t uid
, gid_t gid
,
551 ar
->k_ar
.ar_arg_pipc_perm
.pipc_uid
= uid
;
552 ar
->k_ar
.ar_arg_pipc_perm
.pipc_gid
= gid
;
553 ar
->k_ar
.ar_arg_pipc_perm
.pipc_mode
= mode
;
554 ARG_SET_VALID(ar
, ARG_POSIX_IPC_PERM
);
558 audit_arg_auditon(struct kaudit_record
*ar
, union auditon_udata
*udata
)
560 bcopy((void *)udata
, &ar
->k_ar
.ar_arg_auditon
,
561 sizeof(ar
->k_ar
.ar_arg_auditon
));
562 ARG_SET_VALID(ar
, ARG_AUDITON
);
566 * Audit information about a file, either the file's vnode info, or its
567 * socket address info.
570 audit_arg_file(struct kaudit_record
*ar
, __unused proc_t p
,
575 struct sockaddr_in
*sin
;
576 struct sockaddr_in6
*sin6
;
578 switch (FILEGLOB_DTYPE(fp
->fp_glob
)) {
580 /* case DTYPE_FIFO: */
581 audit_arg_vnpath_withref(ar
,
582 (struct vnode
*)fp
->fp_glob
->fg_data
, ARG_VNODE1
);
586 so
= (struct socket
*)fp
->fp_glob
->fg_data
;
587 if (SOCK_CHECK_DOM(so
, PF_INET
)) {
588 if (so
->so_pcb
== NULL
) {
591 ar
->k_ar
.ar_arg_sockinfo
.sai_type
=
593 ar
->k_ar
.ar_arg_sockinfo
.sai_domain
= SOCK_DOM(so
);
594 ar
->k_ar
.ar_arg_sockinfo
.sai_protocol
= SOCK_PROTO(so
);
595 pcb
= (struct inpcb
*)so
->so_pcb
;
596 sin
= (struct sockaddr_in
*)
597 &ar
->k_ar
.ar_arg_sockinfo
.sai_faddr
;
598 sin
->sin_addr
.s_addr
= pcb
->inp_faddr
.s_addr
;
599 sin
->sin_port
= pcb
->inp_fport
;
600 sin
= (struct sockaddr_in
*)
601 &ar
->k_ar
.ar_arg_sockinfo
.sai_laddr
;
602 sin
->sin_addr
.s_addr
= pcb
->inp_laddr
.s_addr
;
603 sin
->sin_port
= pcb
->inp_lport
;
604 ARG_SET_VALID(ar
, ARG_SOCKINFO
);
606 if (SOCK_CHECK_DOM(so
, PF_INET6
)) {
607 if (so
->so_pcb
== NULL
) {
610 ar
->k_ar
.ar_arg_sockinfo
.sai_type
=
612 ar
->k_ar
.ar_arg_sockinfo
.sai_domain
= SOCK_DOM(so
);
613 ar
->k_ar
.ar_arg_sockinfo
.sai_protocol
= SOCK_PROTO(so
);
614 pcb
= (struct inpcb
*)so
->so_pcb
;
615 sin6
= (struct sockaddr_in6
*)
616 &ar
->k_ar
.ar_arg_sockinfo
.sai_faddr
;
617 sin6
->sin6_addr
= pcb
->in6p_faddr
;
618 sin6
->sin6_port
= pcb
->in6p_fport
;
619 sin6
= (struct sockaddr_in6
*)
620 &ar
->k_ar
.ar_arg_sockinfo
.sai_laddr
;
621 sin6
->sin6_addr
= pcb
->in6p_laddr
;
622 sin6
->sin6_port
= pcb
->in6p_lport
;
623 ARG_SET_VALID(ar
, ARG_SOCKINFO
);
628 /* XXXAUDIT: else? */
634 * Store a path as given by the user process for auditing into the audit
635 * record stored on the user thread. This function will allocate the memory
636 * to store the path info if not already available. This memory will be
637 * freed when the audit record is freed.
639 * Note that the current working directory vp must be supplied at the audit call
640 * site to permit per thread current working directories, and that it must take
641 * a upath starting with '/' into account for chroot if the path is absolute.
642 * This results in the real (non-chroot) path being recorded in the audit
645 * XXXAUDIT: Possibly assert that the memory isn't already allocated?
648 audit_arg_upath(struct kaudit_record
*ar
, struct vnode
*cwd_vp
, char *upath
, u_int64_t flag
)
652 KASSERT(upath
!= NULL
, ("audit_arg_upath: upath == NULL"));
653 KASSERT((flag
== ARG_UPATH1
) || (flag
== ARG_UPATH2
),
654 ("audit_arg_upath: flag %llu", (unsigned long long)flag
));
655 KASSERT((flag
!= ARG_UPATH1
) || (flag
!= ARG_UPATH2
),
656 ("audit_arg_upath: flag %llu", (unsigned long long)flag
));
658 if (flag
== ARG_UPATH1
) {
659 pathp
= &ar
->k_ar
.ar_arg_upath1
;
661 pathp
= &ar
->k_ar
.ar_arg_upath2
;
664 if (*pathp
== NULL
) {
665 *pathp
= malloc(MAXPATHLEN
, M_AUDITPATH
, M_WAITOK
);
670 if (audit_canon_path(cwd_vp
, upath
, *pathp
) == 0) {
671 ARG_SET_VALID(ar
, flag
);
673 free(*pathp
, M_AUDITPATH
);
679 audit_arg_kpath(struct kaudit_record
*ar
, char *kpath
, u_int64_t flag
)
683 KASSERT(kpath
!= NULL
, ("audit_arg_kpath: kpath == NULL"));
684 KASSERT((flag
== ARG_KPATH1
) || (flag
== ARG_KPATH2
),
685 ("audit_arg_kpath: flag %llu", (unsigned long long)flag
));
686 KASSERT((flag
!= ARG_KPATH1
) || (flag
!= ARG_KPATH2
),
687 ("audit_arg_kpath: flag %llu", (unsigned long long)flag
));
689 if (flag
== ARG_KPATH1
) {
690 pathp
= &ar
->k_ar
.ar_arg_kpath1
;
692 pathp
= &ar
->k_ar
.ar_arg_kpath2
;
695 if (*pathp
== NULL
) {
696 *pathp
= malloc(MAXPATHLEN
, M_AUDITPATH
, M_WAITOK
);
701 strlcpy(*pathp
, kpath
, MAXPATHLEN
);
702 ARG_SET_VALID(ar
, flag
);
706 * Function to save the path and vnode attr information into the audit
709 * It is assumed that the caller will hold any vnode locks necessary to
710 * perform a VNOP_GETATTR() on the passed vnode.
712 * XXX: The attr code is very similar to vfs_vnops.c:vn_stat(), but always
713 * provides access to the generation number as we need that to construct the
716 * XXX: We should accept the process argument from the caller, since it's
717 * very likely they already have a reference.
719 * XXX: Error handling in this function is poor.
721 * XXXAUDIT: Possibly KASSERT the path pointer is NULL?
724 audit_arg_vnpath(struct kaudit_record
*ar
, struct vnode
*vp
, u_int64_t flags
)
726 struct vnode_attr va
;
730 struct vnode_au_info
*vnp
;
733 char **vnode_mac_labelp
;
737 KASSERT(vp
!= NULL
, ("audit_arg_vnpath: vp == NULL"));
738 KASSERT((flags
== ARG_VNODE1
) || (flags
== ARG_VNODE2
),
739 ("audit_arg_vnpath: flags != ARG_VNODE[1,2]"));
744 * XXXAUDIT: The below clears, and then resets the flags for valid
745 * arguments. Ideally, either the new vnode is used, or the old one
748 if (flags
& ARG_VNODE1
) {
749 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_KPATH1
);
750 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_VNODE1
);
751 pathp
= &ar
->k_ar
.ar_arg_kpath1
;
752 vnp
= &ar
->k_ar
.ar_arg_vnode1
;
754 vnode_mac_labelp
= &ar
->k_ar
.ar_vnode1_mac_labels
;
757 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_KPATH2
);
758 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_VNODE2
);
759 pathp
= &ar
->k_ar
.ar_arg_kpath2
;
760 vnp
= &ar
->k_ar
.ar_arg_vnode2
;
762 vnode_mac_labelp
= &ar
->k_ar
.ar_vnode2_mac_labels
;
766 if (*pathp
== NULL
) {
767 *pathp
= malloc(MAXPATHLEN
, M_AUDITPATH
, M_WAITOK
);
773 * If vn_getpath() succeeds, place it in a string buffer
774 * attached to the audit record, and set a flag indicating
778 if (vn_getpath(vp
, *pathp
, &len
) == 0) {
779 if (flags
& ARG_VNODE1
) {
780 ARG_SET_VALID(ar
, ARG_KPATH1
);
782 ARG_SET_VALID(ar
, ARG_KPATH2
);
785 free(*pathp
, M_AUDITPATH
);
790 VATTR_WANTED(&va
, va_mode
);
791 VATTR_WANTED(&va
, va_uid
);
792 VATTR_WANTED(&va
, va_gid
);
793 VATTR_WANTED(&va
, va_rdev
);
794 VATTR_WANTED(&va
, va_fsid
);
795 VATTR_WANTED(&va
, va_fileid
);
796 VATTR_WANTED(&va
, va_gen
);
797 error
= vnode_getattr(vp
, &va
, vfs_context_current());
799 /* XXX: How to handle this case? */
804 if (*vnode_mac_labelp
== NULL
&& (vp
->v_lflag
& VL_LABELED
) == VL_LABELED
) {
805 *vnode_mac_labelp
= (char *)zalloc(audit_mac_label_zone
);
806 if (*vnode_mac_labelp
!= NULL
) {
807 mac
.m_buflen
= MAC_AUDIT_LABEL_LEN
;
808 mac
.m_string
= *vnode_mac_labelp
;
809 if (mac_vnode_label_externalize_audit(vp
, &mac
)) {
817 * XXX do we want to fall back here when these aren't supported?
819 vnp
->vn_mode
= va
.va_mode
;
820 vnp
->vn_uid
= va
.va_uid
;
821 vnp
->vn_gid
= va
.va_gid
;
822 vnp
->vn_dev
= va
.va_rdev
;
823 vnp
->vn_fsid
= va
.va_fsid
;
824 vnp
->vn_fileid
= (u_int32_t
)va
.va_fileid
;
825 vnp
->vn_gen
= va
.va_gen
;
826 if (flags
& ARG_VNODE1
) {
827 ARG_SET_VALID(ar
, ARG_VNODE1
);
829 ARG_SET_VALID(ar
, ARG_VNODE2
);
834 audit_arg_vnpath_withref(struct kaudit_record
*ar
, struct vnode
*vp
, u_int64_t flags
)
836 if (vp
== NULL
|| vnode_getwithref(vp
)) {
839 audit_arg_vnpath(ar
, vp
, flags
);
844 audit_arg_mach_port1(struct kaudit_record
*ar
, mach_port_name_t port
)
846 ar
->k_ar
.ar_arg_mach_port1
= port
;
847 ARG_SET_VALID(ar
, ARG_MACHPORT1
);
851 audit_arg_mach_port2(struct kaudit_record
*ar
, mach_port_name_t port
)
853 ar
->k_ar
.ar_arg_mach_port2
= port
;
854 ARG_SET_VALID(ar
, ARG_MACHPORT2
);
859 * Audit the argument strings passed to exec.
862 audit_arg_argv(struct kaudit_record
*ar
, char *argv
, int argc
, size_t length
)
864 if (audit_argv
== 0 || argc
== 0) {
868 if (ar
->k_ar
.ar_arg_argv
== NULL
) {
869 ar
->k_ar
.ar_arg_argv
= malloc(length
, M_AUDITTEXT
, M_WAITOK
);
871 bcopy(argv
, ar
->k_ar
.ar_arg_argv
, length
);
872 ar
->k_ar
.ar_arg_argc
= argc
;
873 ARG_SET_VALID(ar
, ARG_ARGV
);
877 * Audit the environment strings passed to exec.
880 audit_arg_envv(struct kaudit_record
*ar
, char *envv
, int envc
, size_t length
)
882 if (audit_arge
== 0 || envc
== 0) {
886 if (ar
->k_ar
.ar_arg_envv
== NULL
) {
887 ar
->k_ar
.ar_arg_envv
= malloc(length
, M_AUDITTEXT
, M_WAITOK
);
889 bcopy(envv
, ar
->k_ar
.ar_arg_envv
, length
);
890 ar
->k_ar
.ar_arg_envc
= envc
;
891 ARG_SET_VALID(ar
, ARG_ENVV
);
895 * The close() system call uses it's own audit call to capture the path/vnode
896 * information because those pieces are not easily obtained within the system
900 audit_sysclose(struct kaudit_record
*ar
, proc_t p
, int fd
)
905 KASSERT(p
!= NULL
, ("audit_sysclose: p == NULL"));
907 audit_arg_fd(ar
, fd
);
909 if (fp_getfvp(p
, fd
, &fp
, &vp
) != 0) {
913 audit_arg_vnpath_withref(ar
, (struct vnode
*)fp
->fp_glob
->fg_data
,
915 fp_drop(p
, fd
, fp
, 0);
919 audit_identity_info_destruct(struct au_identity_info
*id_info
)
925 if (id_info
->signing_id
!= NULL
) {
926 free(id_info
->signing_id
, M_AUDITTEXT
);
927 id_info
->signing_id
= NULL
;
930 if (id_info
->team_id
!= NULL
) {
931 free(id_info
->team_id
, M_AUDITTEXT
);
932 id_info
->team_id
= NULL
;
935 if (id_info
->cdhash
!= NULL
) {
936 free(id_info
->cdhash
, M_AUDITDATA
);
937 id_info
->cdhash
= NULL
;
942 audit_identity_info_construct(struct au_identity_info
*id_info
)
945 struct cs_blob
*blob
;
946 unsigned int signer_type
= 0;
947 const char *signing_id
= NULL
;
948 const char* team_id
= NULL
;
949 const uint8_t *cdhash
= NULL
;
953 blob
= csproc_get_blob(p
);
955 signing_id
= csblob_get_identity(blob
);
956 cdhash
= csblob_get_cdhash(blob
);
957 team_id
= csblob_get_teamid(blob
);
958 signer_type
= csblob_get_platform_binary(blob
) ? 1 : 0;
961 id_info
->signer_type
= signer_type
;
963 if (id_info
->signing_id
== NULL
&& signing_id
!= NULL
) {
964 id_info
->signing_id
= malloc( MAX_AU_IDENTITY_SIGNING_ID_LENGTH
,
965 M_AUDITTEXT
, M_WAITOK
);
966 if (id_info
->signing_id
!= NULL
) {
967 src_len
= strlcpy(id_info
->signing_id
,
968 signing_id
, MAX_AU_IDENTITY_SIGNING_ID_LENGTH
);
970 if (src_len
>= MAX_AU_IDENTITY_SIGNING_ID_LENGTH
) {
971 id_info
->signing_id_trunc
= 1;
976 if (id_info
->team_id
== NULL
&& team_id
!= NULL
) {
977 id_info
->team_id
= malloc(MAX_AU_IDENTITY_TEAM_ID_LENGTH
,
978 M_AUDITTEXT
, M_WAITOK
);
979 if (id_info
->team_id
!= NULL
) {
980 src_len
= strlcpy(id_info
->team_id
, team_id
,
981 MAX_AU_IDENTITY_TEAM_ID_LENGTH
);
983 if (src_len
>= MAX_AU_IDENTITY_TEAM_ID_LENGTH
) {
984 id_info
->team_id_trunc
= 1;
989 if (id_info
->cdhash
== NULL
&& cdhash
!= NULL
) {
990 id_info
->cdhash
= malloc(CS_CDHASH_LEN
, M_AUDITDATA
, M_WAITOK
);
991 if (id_info
->cdhash
!= NULL
) {
992 memcpy(id_info
->cdhash
, cdhash
, CS_CDHASH_LEN
);
993 id_info
->cdhash_len
= CS_CDHASH_LEN
;
999 audit_arg_identity(struct kaudit_record
*ar
)
1001 audit_identity_info_construct(&ar
->k_ar
.ar_arg_identity
);
1002 ARG_SET_VALID(ar
, ARG_IDENTITY
);
1005 #endif /* CONFIG_AUDIT */