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>
63 #include <bsm/audit.h>
64 #include <bsm/audit_internal.h>
65 #include <bsm/audit_kevents.h>
67 #include <security/audit/audit.h>
68 #include <security/audit/audit_bsd.h>
69 #include <security/audit/audit_private.h>
71 #include <mach/host_priv.h>
72 #include <mach/host_special_ports.h>
73 #include <mach/audit_triggers_server.h>
75 #include <kern/host.h>
76 #include <kern/kalloc.h>
77 #include <kern/zalloc.h>
78 #include <kern/sched_prim.h>
81 #include <bsm/audit_record.h>
82 #include <security/mac.h>
83 #include <security/mac_framework.h>
84 #include <security/mac_policy.h>
85 extern zone_t audit_mac_label_zone
;
88 #include <net/route.h>
90 #include <netinet/in.h>
91 #include <netinet/in_pcb.h>
95 * Calls to manipulate elements of the audit record structure from system
96 * call code. Macro wrappers will prevent this functions from being entered
97 * if auditing is disabled, avoiding the function call cost. We check the
98 * thread audit record pointer anyway, as the audit condition could change,
99 * and pre-selection may not have allocated an audit record for this event.
101 * XXXAUDIT: Should we assert, in each case, that this field of the record
102 * hasn't already been filled in?
105 audit_arg_addr(struct kaudit_record
*ar
, user_addr_t addr
)
107 struct proc
*p
= current_proc();
109 ar
->k_ar
.ar_arg_addr
= addr
;
112 * If the process is 64-bit then flag the address as such.
115 ARG_SET_VALID(ar
, ARG_ADDR64
);
117 ARG_SET_VALID(ar
, ARG_ADDR32
);
121 audit_arg_exit(struct kaudit_record
*ar
, int status
, int retval
)
124 ar
->k_ar
.ar_arg_exitstatus
= status
;
125 ar
->k_ar
.ar_arg_exitretval
= retval
;
126 ARG_SET_VALID(ar
, ARG_EXIT
);
130 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
)
141 ar
->k_ar
.ar_arg_fd2
= fd
;
142 ARG_SET_VALID(ar
, ARG_FD2
);
146 audit_arg_fd(struct kaudit_record
*ar
, int fd
)
149 ar
->k_ar
.ar_arg_fd
= fd
;
150 ARG_SET_VALID(ar
, ARG_FD
);
154 audit_arg_fflags(struct kaudit_record
*ar
, int fflags
)
157 ar
->k_ar
.ar_arg_fflags
= fflags
;
158 ARG_SET_VALID(ar
, ARG_FFLAGS
);
162 audit_arg_gid(struct kaudit_record
*ar
, gid_t gid
)
165 ar
->k_ar
.ar_arg_gid
= gid
;
166 ARG_SET_VALID(ar
, ARG_GID
);
170 audit_arg_uid(struct kaudit_record
*ar
, uid_t uid
)
173 ar
->k_ar
.ar_arg_uid
= uid
;
174 ARG_SET_VALID(ar
, ARG_UID
);
178 audit_arg_egid(struct kaudit_record
*ar
, gid_t egid
)
181 ar
->k_ar
.ar_arg_egid
= egid
;
182 ARG_SET_VALID(ar
, ARG_EGID
);
186 audit_arg_euid(struct kaudit_record
*ar
, uid_t euid
)
189 ar
->k_ar
.ar_arg_euid
= euid
;
190 ARG_SET_VALID(ar
, ARG_EUID
);
194 audit_arg_rgid(struct kaudit_record
*ar
, gid_t rgid
)
197 ar
->k_ar
.ar_arg_rgid
= rgid
;
198 ARG_SET_VALID(ar
, ARG_RGID
);
202 audit_arg_ruid(struct kaudit_record
*ar
, uid_t ruid
)
205 ar
->k_ar
.ar_arg_ruid
= ruid
;
206 ARG_SET_VALID(ar
, ARG_RUID
);
210 audit_arg_sgid(struct kaudit_record
*ar
, gid_t sgid
)
213 ar
->k_ar
.ar_arg_sgid
= sgid
;
214 ARG_SET_VALID(ar
, ARG_SGID
);
218 audit_arg_suid(struct kaudit_record
*ar
, uid_t suid
)
221 ar
->k_ar
.ar_arg_suid
= suid
;
222 ARG_SET_VALID(ar
, ARG_SUID
);
226 audit_arg_groupset(struct kaudit_record
*ar
, gid_t
*gidset
, u_int gidset_size
)
230 for (i
= 0; i
< gidset_size
; i
++)
231 ar
->k_ar
.ar_arg_groups
.gidset
[i
] = gidset
[i
];
232 ar
->k_ar
.ar_arg_groups
.gidset_size
= gidset_size
;
233 ARG_SET_VALID(ar
, ARG_GROUPSET
);
237 audit_arg_login(struct kaudit_record
*ar
, char *login
)
240 strlcpy(ar
->k_ar
.ar_arg_login
, login
, MAXLOGNAME
);
241 ARG_SET_VALID(ar
, ARG_LOGIN
);
245 audit_arg_ctlname(struct kaudit_record
*ar
, int *name
, int namelen
)
248 bcopy(name
, &ar
->k_ar
.ar_arg_ctlname
, namelen
* sizeof(int));
249 ar
->k_ar
.ar_arg_len
= namelen
;
250 ARG_SET_VALID(ar
, ARG_CTLNAME
| ARG_LEN
);
254 audit_arg_mask(struct kaudit_record
*ar
, int mask
)
257 ar
->k_ar
.ar_arg_mask
= mask
;
258 ARG_SET_VALID(ar
, ARG_MASK
);
262 audit_arg_mode(struct kaudit_record
*ar
, mode_t mode
)
265 ar
->k_ar
.ar_arg_mode
= mode
;
266 ARG_SET_VALID(ar
, ARG_MODE
);
270 audit_arg_value32(struct kaudit_record
*ar
, uint32_t value32
)
273 ar
->k_ar
.ar_arg_value32
= value32
;
274 ARG_SET_VALID(ar
, ARG_VALUE32
);
278 audit_arg_value64(struct kaudit_record
*ar
, uint64_t value64
)
281 ar
->k_ar
.ar_arg_value64
= value64
;
282 ARG_SET_VALID(ar
, ARG_VALUE64
);
286 audit_arg_owner(struct kaudit_record
*ar
, uid_t uid
, gid_t gid
)
289 ar
->k_ar
.ar_arg_uid
= uid
;
290 ar
->k_ar
.ar_arg_gid
= gid
;
291 ARG_SET_VALID(ar
, ARG_UID
| ARG_GID
);
295 audit_arg_pid(struct kaudit_record
*ar
, pid_t pid
)
298 ar
->k_ar
.ar_arg_pid
= pid
;
299 ARG_SET_VALID(ar
, ARG_PID
);
303 audit_arg_process(struct kaudit_record
*ar
, proc_t p
)
305 kauth_cred_t my_cred
;
307 KASSERT(p
!= NULL
, ("audit_arg_process: p == NULL"));
312 my_cred
= kauth_cred_proc_ref(p
);
313 ar
->k_ar
.ar_arg_auid
= my_cred
->cr_audit
.as_aia_p
->ai_auid
;
314 ar
->k_ar
.ar_arg_asid
= my_cred
->cr_audit
.as_aia_p
->ai_asid
;
315 bcopy(&my_cred
->cr_audit
.as_aia_p
->ai_termid
,
316 &ar
->k_ar
.ar_arg_termid_addr
, sizeof(au_tid_addr_t
));
317 ar
->k_ar
.ar_arg_euid
= kauth_cred_getuid(my_cred
);
318 ar
->k_ar
.ar_arg_egid
= kauth_cred_getgid(my_cred
);
319 ar
->k_ar
.ar_arg_ruid
= kauth_cred_getruid(my_cred
);
320 ar
->k_ar
.ar_arg_rgid
= kauth_cred_getrgid(my_cred
);
321 kauth_cred_unref(&my_cred
);
322 ar
->k_ar
.ar_arg_pid
= p
->p_pid
;
323 ARG_SET_VALID(ar
, ARG_AUID
| ARG_EUID
| ARG_EGID
| ARG_RUID
|
324 ARG_RGID
| ARG_ASID
| ARG_TERMID_ADDR
| ARG_PID
| ARG_PROCESS
);
328 audit_arg_signum(struct kaudit_record
*ar
, u_int signum
)
331 ar
->k_ar
.ar_arg_signum
= signum
;
332 ARG_SET_VALID(ar
, ARG_SIGNUM
);
336 audit_arg_socket(struct kaudit_record
*ar
, int sodomain
, int sotype
,
340 ar
->k_ar
.ar_arg_sockinfo
.sai_domain
= sodomain
;
341 ar
->k_ar
.ar_arg_sockinfo
.sai_type
= sotype
;
342 ar
->k_ar
.ar_arg_sockinfo
.sai_protocol
= soprotocol
;
343 ARG_SET_VALID(ar
, ARG_SOCKINFO
);
347 * Note that the current working directory vp must be supplied at the audit
348 * call site to permit per thread current working directories, and that it
349 * must take a upath starting with '/' into account for chroot if the path
350 * is absolute. This results in the real (non-chroot) path being recorded
351 * in the audit record.
354 audit_arg_sockaddr(struct kaudit_record
*ar
, struct vnode
*cwd_vp
,
358 struct sockaddr_un
*sun
;
359 char path
[SOCK_MAXADDRLEN
- offsetof(struct sockaddr_un
, sun_path
) + 1];
361 KASSERT(sa
!= NULL
, ("audit_arg_sockaddr: sa == NULL"));
363 if (cwd_vp
== NULL
|| sa
== NULL
)
366 bcopy(sa
, &ar
->k_ar
.ar_arg_sockaddr
, sa
->sa_len
);
367 switch (sa
->sa_family
) {
369 ARG_SET_VALID(ar
, ARG_SADDRINET
);
373 ARG_SET_VALID(ar
, ARG_SADDRINET6
);
377 sun
= (struct sockaddr_un
*)sa
;
378 slen
= sun
->sun_len
- offsetof(struct sockaddr_un
, sun_path
);
382 * Make sure the path is NULL-terminated
384 if (sun
->sun_path
[slen
] != 0) {
385 bcopy(sun
->sun_path
, path
, slen
);
387 audit_arg_upath(ar
, cwd_vp
, path
, ARG_UPATH1
);
389 audit_arg_upath(ar
, cwd_vp
, sun
->sun_path
,
393 ARG_SET_VALID(ar
, ARG_SADDRUNIX
);
395 /* XXXAUDIT: default:? */
400 audit_arg_auid(struct kaudit_record
*ar
, uid_t auid
)
403 ar
->k_ar
.ar_arg_auid
= auid
;
404 ARG_SET_VALID(ar
, ARG_AUID
);
408 audit_arg_auditinfo(struct kaudit_record
*ar
, struct auditinfo
*au_info
)
411 ar
->k_ar
.ar_arg_auid
= au_info
->ai_auid
;
412 ar
->k_ar
.ar_arg_asid
= au_info
->ai_asid
;
413 ar
->k_ar
.ar_arg_amask
.am_success
= au_info
->ai_mask
.am_success
;
414 ar
->k_ar
.ar_arg_amask
.am_failure
= au_info
->ai_mask
.am_failure
;
415 ar
->k_ar
.ar_arg_termid
.port
= au_info
->ai_termid
.port
;
416 ar
->k_ar
.ar_arg_termid
.machine
= au_info
->ai_termid
.machine
;
417 ARG_SET_VALID(ar
, ARG_AUID
| ARG_ASID
| ARG_AMASK
| ARG_TERMID
);
421 audit_arg_auditinfo_addr(struct kaudit_record
*ar
,
422 struct auditinfo_addr
*au_info
)
425 ar
->k_ar
.ar_arg_auid
= au_info
->ai_auid
;
426 ar
->k_ar
.ar_arg_asid
= au_info
->ai_asid
;
427 ar
->k_ar
.ar_arg_amask
.am_success
= au_info
->ai_mask
.am_success
;
428 ar
->k_ar
.ar_arg_amask
.am_failure
= au_info
->ai_mask
.am_failure
;
429 ar
->k_ar
.ar_arg_termid_addr
.at_type
= au_info
->ai_termid
.at_type
;
430 ar
->k_ar
.ar_arg_termid_addr
.at_port
= au_info
->ai_termid
.at_port
;
431 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[0] = au_info
->ai_termid
.at_addr
[0];
432 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[1] = au_info
->ai_termid
.at_addr
[1];
433 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[2] = au_info
->ai_termid
.at_addr
[2];
434 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[3] = au_info
->ai_termid
.at_addr
[3];
435 ARG_SET_VALID(ar
, ARG_AUID
| ARG_ASID
| ARG_AMASK
| ARG_TERMID_ADDR
);
439 audit_arg_text(struct kaudit_record
*ar
, char *text
)
442 KASSERT(text
!= NULL
, ("audit_arg_text: text == NULL"));
444 /* Invalidate the text string */
445 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_TEXT
);
449 if (ar
->k_ar
.ar_arg_text
== NULL
)
450 ar
->k_ar
.ar_arg_text
= malloc(MAXPATHLEN
, M_AUDITTEXT
,
453 strncpy(ar
->k_ar
.ar_arg_text
, text
, MAXPATHLEN
);
454 ARG_SET_VALID(ar
, ARG_TEXT
);
458 audit_arg_opaque(struct kaudit_record
*ar
, void *data
, size_t size
)
461 KASSERT(data
!= NULL
, ("audit_arg_opaque: data == NULL"));
462 KASSERT(size
<= UINT16_MAX
, ("audit_arg_opaque: size > UINT16_MAX"));
464 if (data
== NULL
|| size
> UINT16_MAX
)
467 if (ar
->k_ar
.ar_arg_opaque
== NULL
)
468 ar
->k_ar
.ar_arg_opaque
= malloc(size
, M_AUDITDATA
, M_WAITOK
);
472 memcpy(ar
->k_ar
.ar_arg_opaque
, data
, size
);
473 ar
->k_ar
.ar_arg_opq_size
= (u_int16_t
) size
;
474 ARG_SET_VALID(ar
, ARG_OPAQUE
);
478 audit_arg_data(struct kaudit_record
*ar
, void *data
, size_t size
, size_t number
)
482 KASSERT(data
!= NULL
, ("audit_arg_data: data == NULL"));
483 KASSERT(size
>= AUR_BYTE_SIZE
&& size
<= AUR_INT64_SIZE
,
484 ("audit_arg_data: size < AUR_BYTE_SIZE or size > AUR_INT64_SIZE"));
485 KASSERT(number
<= UINT8_MAX
,
486 ("audit_arg_data: number > UINT8_MAX"));
488 if (data
== NULL
|| size
< AUR_BYTE_SIZE
|| size
> AUR_INT64_SIZE
||
494 if (ar
->k_ar
.ar_arg_data
== NULL
)
495 ar
->k_ar
.ar_arg_data
= malloc(sz
, M_AUDITDATA
, M_WAITOK
);
499 memcpy(ar
->k_ar
.ar_arg_data
, data
, sz
);
503 ar
->k_ar
.ar_arg_data_type
= AUR_BYTE
;
507 ar
->k_ar
.ar_arg_data_type
= AUR_SHORT
;
511 ar
->k_ar
.ar_arg_data_type
= AUR_INT32
;
515 ar
->k_ar
.ar_arg_data_type
= AUR_INT64
;
519 free(ar
->k_ar
.ar_arg_data
, M_AUDITDATA
);
520 ar
->k_ar
.ar_arg_data
= NULL
;
524 ar
->k_ar
.ar_arg_data_count
= (u_char
)number
;
526 ARG_SET_VALID(ar
, ARG_DATA
);
530 audit_arg_cmd(struct kaudit_record
*ar
, int cmd
)
533 ar
->k_ar
.ar_arg_cmd
= cmd
;
534 ARG_SET_VALID(ar
, ARG_CMD
);
538 audit_arg_svipc_cmd(struct kaudit_record
*ar
, int cmd
)
541 ar
->k_ar
.ar_arg_svipc_cmd
= cmd
;
542 ARG_SET_VALID(ar
, ARG_SVIPC_CMD
);
546 audit_arg_svipc_perm(struct kaudit_record
*ar
, struct ipc_perm
*perm
)
549 bcopy(perm
, &ar
->k_ar
.ar_arg_svipc_perm
,
550 sizeof(ar
->k_ar
.ar_arg_svipc_perm
));
551 ARG_SET_VALID(ar
, ARG_SVIPC_PERM
);
555 audit_arg_svipc_id(struct kaudit_record
*ar
, int id
)
558 ar
->k_ar
.ar_arg_svipc_id
= id
;
559 ARG_SET_VALID(ar
, ARG_SVIPC_ID
);
563 audit_arg_svipc_addr(struct kaudit_record
*ar
, user_addr_t addr
)
566 ar
->k_ar
.ar_arg_svipc_addr
= addr
;
567 ARG_SET_VALID(ar
, ARG_SVIPC_ADDR
);
571 audit_arg_posix_ipc_perm(struct kaudit_record
*ar
, uid_t uid
, gid_t gid
,
575 ar
->k_ar
.ar_arg_pipc_perm
.pipc_uid
= uid
;
576 ar
->k_ar
.ar_arg_pipc_perm
.pipc_gid
= gid
;
577 ar
->k_ar
.ar_arg_pipc_perm
.pipc_mode
= mode
;
578 ARG_SET_VALID(ar
, ARG_POSIX_IPC_PERM
);
582 audit_arg_auditon(struct kaudit_record
*ar
, union auditon_udata
*udata
)
585 bcopy((void *)udata
, &ar
->k_ar
.ar_arg_auditon
,
586 sizeof(ar
->k_ar
.ar_arg_auditon
));
587 ARG_SET_VALID(ar
, ARG_AUDITON
);
591 * Audit information about a file, either the file's vnode info, or its
592 * socket address info.
595 audit_arg_file(struct kaudit_record
*ar
, __unused proc_t p
,
600 struct sockaddr_in
*sin
;
601 struct sockaddr_in6
*sin6
;
603 switch (FILEGLOB_DTYPE(fp
->f_fglob
)) {
605 /* case DTYPE_FIFO: */
606 audit_arg_vnpath_withref(ar
,
607 (struct vnode
*)fp
->f_fglob
->fg_data
, ARG_VNODE1
);
611 so
= (struct socket
*)fp
->f_fglob
->fg_data
;
612 if (SOCK_CHECK_DOM(so
, PF_INET
)) {
613 if (so
->so_pcb
== NULL
)
615 ar
->k_ar
.ar_arg_sockinfo
.sai_type
=
617 ar
->k_ar
.ar_arg_sockinfo
.sai_domain
= SOCK_DOM(so
);
618 ar
->k_ar
.ar_arg_sockinfo
.sai_protocol
= SOCK_PROTO(so
);
619 pcb
= (struct inpcb
*)so
->so_pcb
;
620 sin
= (struct sockaddr_in
*)
621 &ar
->k_ar
.ar_arg_sockinfo
.sai_faddr
;
622 sin
->sin_addr
.s_addr
= pcb
->inp_faddr
.s_addr
;
623 sin
->sin_port
= pcb
->inp_fport
;
624 sin
= (struct sockaddr_in
*)
625 &ar
->k_ar
.ar_arg_sockinfo
.sai_laddr
;
626 sin
->sin_addr
.s_addr
= pcb
->inp_laddr
.s_addr
;
627 sin
->sin_port
= pcb
->inp_lport
;
628 ARG_SET_VALID(ar
, ARG_SOCKINFO
);
630 if (SOCK_CHECK_DOM(so
, PF_INET6
)) {
631 if (so
->so_pcb
== NULL
)
633 ar
->k_ar
.ar_arg_sockinfo
.sai_type
=
635 ar
->k_ar
.ar_arg_sockinfo
.sai_domain
= SOCK_DOM(so
);
636 ar
->k_ar
.ar_arg_sockinfo
.sai_protocol
= SOCK_PROTO(so
);
637 pcb
= (struct inpcb
*)so
->so_pcb
;
638 sin6
= (struct sockaddr_in6
*)
639 &ar
->k_ar
.ar_arg_sockinfo
.sai_faddr
;
640 sin6
->sin6_addr
= pcb
->in6p_faddr
;
641 sin6
->sin6_port
= pcb
->in6p_fport
;
642 sin6
= (struct sockaddr_in6
*)
643 &ar
->k_ar
.ar_arg_sockinfo
.sai_laddr
;
644 sin6
->sin6_addr
= pcb
->in6p_laddr
;
645 sin6
->sin6_port
= pcb
->in6p_lport
;
646 ARG_SET_VALID(ar
, ARG_SOCKINFO
);
651 /* XXXAUDIT: else? */
657 * Store a path as given by the user process for auditing into the audit
658 * record stored on the user thread. This function will allocate the memory
659 * to store the path info if not already available. This memory will be
660 * freed when the audit record is freed.
662 * Note that the current working directory vp must be supplied at the audit call
663 * site to permit per thread current working directories, and that it must take
664 * a upath starting with '/' into account for chroot if the path is absolute.
665 * This results in the real (non-chroot) path being recorded in the audit
668 * XXXAUDIT: Possibly assert that the memory isn't already allocated?
671 audit_arg_upath(struct kaudit_record
*ar
, struct vnode
*cwd_vp
, char *upath
, u_int64_t flag
)
675 KASSERT(upath
!= NULL
, ("audit_arg_upath: upath == NULL"));
676 KASSERT((flag
== ARG_UPATH1
) || (flag
== ARG_UPATH2
),
677 ("audit_arg_upath: flag %llu", (unsigned long long)flag
));
678 KASSERT((flag
!= ARG_UPATH1
) || (flag
!= ARG_UPATH2
),
679 ("audit_arg_upath: flag %llu", (unsigned long long)flag
));
681 if (flag
== ARG_UPATH1
)
682 pathp
= &ar
->k_ar
.ar_arg_upath1
;
684 pathp
= &ar
->k_ar
.ar_arg_upath2
;
687 *pathp
= malloc(MAXPATHLEN
, M_AUDITPATH
, M_WAITOK
);
691 if (audit_canon_path(cwd_vp
, upath
, *pathp
) == 0)
692 ARG_SET_VALID(ar
, flag
);
694 free(*pathp
, M_AUDITPATH
);
700 * Function to save the path and vnode attr information into the audit
703 * It is assumed that the caller will hold any vnode locks necessary to
704 * perform a VNOP_GETATTR() on the passed vnode.
706 * XXX: The attr code is very similar to vfs_vnops.c:vn_stat(), but always
707 * provides access to the generation number as we need that to construct the
710 * XXX: We should accept the process argument from the caller, since it's
711 * very likely they already have a reference.
713 * XXX: Error handling in this function is poor.
715 * XXXAUDIT: Possibly KASSERT the path pointer is NULL?
718 audit_arg_vnpath(struct kaudit_record
*ar
, struct vnode
*vp
, u_int64_t flags
)
720 struct vnode_attr va
;
724 struct vnode_au_info
*vnp
;
727 char **vnode_mac_labelp
;
731 KASSERT(vp
!= NULL
, ("audit_arg_vnpath: vp == NULL"));
732 KASSERT((flags
== ARG_VNODE1
) || (flags
== ARG_VNODE2
),
733 ("audit_arg_vnpath: flags != ARG_VNODE[1,2]"));
738 * XXXAUDIT: The below clears, and then resets the flags for valid
739 * arguments. Ideally, either the new vnode is used, or the old one
742 if (flags
& ARG_VNODE1
) {
743 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_KPATH1
);
744 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_VNODE1
);
745 pathp
= &ar
->k_ar
.ar_arg_kpath1
;
746 vnp
= &ar
->k_ar
.ar_arg_vnode1
;
748 vnode_mac_labelp
= &ar
->k_ar
.ar_vnode1_mac_labels
;
751 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_KPATH2
);
752 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_VNODE2
);
753 pathp
= &ar
->k_ar
.ar_arg_kpath2
;
754 vnp
= &ar
->k_ar
.ar_arg_vnode2
;
756 vnode_mac_labelp
= &ar
->k_ar
.ar_vnode2_mac_labels
;
761 *pathp
= malloc(MAXPATHLEN
, M_AUDITPATH
, M_WAITOK
);
766 * If vn_getpath() succeeds, place it in a string buffer
767 * attached to the audit record, and set a flag indicating
771 if (vn_getpath(vp
, *pathp
, &len
) == 0) {
772 if (flags
& ARG_VNODE1
)
773 ARG_SET_VALID(ar
, ARG_KPATH1
);
775 ARG_SET_VALID(ar
, ARG_KPATH2
);
777 free(*pathp
, M_AUDITPATH
);
782 VATTR_WANTED(&va
, va_mode
);
783 VATTR_WANTED(&va
, va_uid
);
784 VATTR_WANTED(&va
, va_gid
);
785 VATTR_WANTED(&va
, va_rdev
);
786 VATTR_WANTED(&va
, va_fsid
);
787 VATTR_WANTED(&va
, va_fileid
);
788 VATTR_WANTED(&va
, va_gen
);
789 error
= vnode_getattr(vp
, &va
, vfs_context_current());
791 /* XXX: How to handle this case? */
796 if (*vnode_mac_labelp
== NULL
&& (vp
->v_lflag
& VL_LABELED
) == VL_LABELED
) {
797 *vnode_mac_labelp
= (char *)zalloc(audit_mac_label_zone
);
798 if (*vnode_mac_labelp
!= NULL
) {
799 mac
.m_buflen
= MAC_AUDIT_LABEL_LEN
;
800 mac
.m_string
= *vnode_mac_labelp
;
801 mac_vnode_label_externalize_audit(vp
, &mac
);
807 * XXX do we want to fall back here when these aren't supported?
809 vnp
->vn_mode
= va
.va_mode
;
810 vnp
->vn_uid
= va
.va_uid
;
811 vnp
->vn_gid
= va
.va_gid
;
812 vnp
->vn_dev
= va
.va_rdev
;
813 vnp
->vn_fsid
= va
.va_fsid
;
814 vnp
->vn_fileid
= (u_int32_t
)va
.va_fileid
;
815 vnp
->vn_gen
= va
.va_gen
;
816 if (flags
& ARG_VNODE1
)
817 ARG_SET_VALID(ar
, ARG_VNODE1
);
819 ARG_SET_VALID(ar
, ARG_VNODE2
);
823 audit_arg_vnpath_withref(struct kaudit_record
*ar
, struct vnode
*vp
, u_int64_t flags
)
825 if (vp
== NULL
|| vnode_getwithref(vp
))
827 audit_arg_vnpath(ar
, vp
, flags
);
832 audit_arg_mach_port1(struct kaudit_record
*ar
, mach_port_name_t port
)
835 ar
->k_ar
.ar_arg_mach_port1
= port
;
836 ARG_SET_VALID(ar
, ARG_MACHPORT1
);
840 audit_arg_mach_port2(struct kaudit_record
*ar
, mach_port_name_t port
)
843 ar
->k_ar
.ar_arg_mach_port2
= port
;
844 ARG_SET_VALID(ar
, ARG_MACHPORT2
);
849 * Audit the argument strings passed to exec.
852 audit_arg_argv(struct kaudit_record
*ar
, char *argv
, int argc
, int length
)
855 if (audit_argv
== 0 || argc
== 0)
858 if (ar
->k_ar
.ar_arg_argv
== NULL
)
859 ar
->k_ar
.ar_arg_argv
= malloc(length
, M_AUDITTEXT
, M_WAITOK
);
860 bcopy(argv
, ar
->k_ar
.ar_arg_argv
, length
);
861 ar
->k_ar
.ar_arg_argc
= argc
;
862 ARG_SET_VALID(ar
, ARG_ARGV
);
866 * Audit the environment strings passed to exec.
869 audit_arg_envv(struct kaudit_record
*ar
, char *envv
, int envc
, int length
)
872 if (audit_arge
== 0 || envc
== 0)
875 if (ar
->k_ar
.ar_arg_envv
== NULL
)
876 ar
->k_ar
.ar_arg_envv
= malloc(length
, M_AUDITTEXT
, M_WAITOK
);
877 bcopy(envv
, ar
->k_ar
.ar_arg_envv
, length
);
878 ar
->k_ar
.ar_arg_envc
= envc
;
879 ARG_SET_VALID(ar
, ARG_ENVV
);
883 * The close() system call uses it's own audit call to capture the path/vnode
884 * information because those pieces are not easily obtained within the system
888 audit_sysclose(struct kaudit_record
*ar
, proc_t p
, int fd
)
893 KASSERT(p
!= NULL
, ("audit_sysclose: p == NULL"));
895 audit_arg_fd(ar
, fd
);
897 if (fp_getfvp(p
, fd
, &fp
, &vp
) != 0)
900 audit_arg_vnpath_withref(ar
, (struct vnode
*)fp
->f_fglob
->fg_data
,
902 fp_drop(p
, fd
, fp
, 0);
905 #endif /* CONFIG_AUDIT */