2 * Copyright (c) 1999-2012 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/wait_queue.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.
116 ARG_SET_VALID(ar
, ARG_ADDR64
);
118 ARG_SET_VALID(ar
, ARG_ADDR32
);
122 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
)
134 ar
->k_ar
.ar_arg_len
= len
;
135 ARG_SET_VALID(ar
, ARG_LEN
);
139 audit_arg_fd(struct kaudit_record
*ar
, int fd
)
142 ar
->k_ar
.ar_arg_fd
= fd
;
143 ARG_SET_VALID(ar
, ARG_FD
);
147 audit_arg_fflags(struct kaudit_record
*ar
, int fflags
)
150 ar
->k_ar
.ar_arg_fflags
= fflags
;
151 ARG_SET_VALID(ar
, ARG_FFLAGS
);
155 audit_arg_gid(struct kaudit_record
*ar
, gid_t gid
)
158 ar
->k_ar
.ar_arg_gid
= gid
;
159 ARG_SET_VALID(ar
, ARG_GID
);
163 audit_arg_uid(struct kaudit_record
*ar
, uid_t uid
)
166 ar
->k_ar
.ar_arg_uid
= uid
;
167 ARG_SET_VALID(ar
, ARG_UID
);
171 audit_arg_egid(struct kaudit_record
*ar
, gid_t egid
)
174 ar
->k_ar
.ar_arg_egid
= egid
;
175 ARG_SET_VALID(ar
, ARG_EGID
);
179 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
)
190 ar
->k_ar
.ar_arg_rgid
= rgid
;
191 ARG_SET_VALID(ar
, ARG_RGID
);
195 audit_arg_ruid(struct kaudit_record
*ar
, uid_t ruid
)
198 ar
->k_ar
.ar_arg_ruid
= ruid
;
199 ARG_SET_VALID(ar
, ARG_RUID
);
203 audit_arg_sgid(struct kaudit_record
*ar
, gid_t sgid
)
206 ar
->k_ar
.ar_arg_sgid
= sgid
;
207 ARG_SET_VALID(ar
, ARG_SGID
);
211 audit_arg_suid(struct kaudit_record
*ar
, uid_t suid
)
214 ar
->k_ar
.ar_arg_suid
= suid
;
215 ARG_SET_VALID(ar
, ARG_SUID
);
219 audit_arg_groupset(struct kaudit_record
*ar
, gid_t
*gidset
, u_int gidset_size
)
223 for (i
= 0; i
< gidset_size
; i
++)
224 ar
->k_ar
.ar_arg_groups
.gidset
[i
] = gidset
[i
];
225 ar
->k_ar
.ar_arg_groups
.gidset_size
= gidset_size
;
226 ARG_SET_VALID(ar
, ARG_GROUPSET
);
230 audit_arg_login(struct kaudit_record
*ar
, char *login
)
233 strlcpy(ar
->k_ar
.ar_arg_login
, login
, MAXLOGNAME
);
234 ARG_SET_VALID(ar
, ARG_LOGIN
);
238 audit_arg_ctlname(struct kaudit_record
*ar
, int *name
, int namelen
)
241 bcopy(name
, &ar
->k_ar
.ar_arg_ctlname
, namelen
* sizeof(int));
242 ar
->k_ar
.ar_arg_len
= namelen
;
243 ARG_SET_VALID(ar
, ARG_CTLNAME
| ARG_LEN
);
247 audit_arg_mask(struct kaudit_record
*ar
, int mask
)
250 ar
->k_ar
.ar_arg_mask
= mask
;
251 ARG_SET_VALID(ar
, ARG_MASK
);
255 audit_arg_mode(struct kaudit_record
*ar
, mode_t mode
)
258 ar
->k_ar
.ar_arg_mode
= mode
;
259 ARG_SET_VALID(ar
, ARG_MODE
);
263 audit_arg_value32(struct kaudit_record
*ar
, uint32_t value32
)
266 ar
->k_ar
.ar_arg_value32
= value32
;
267 ARG_SET_VALID(ar
, ARG_VALUE32
);
271 audit_arg_value64(struct kaudit_record
*ar
, uint64_t value64
)
274 ar
->k_ar
.ar_arg_value64
= value64
;
275 ARG_SET_VALID(ar
, ARG_VALUE64
);
279 audit_arg_owner(struct kaudit_record
*ar
, uid_t uid
, gid_t gid
)
282 ar
->k_ar
.ar_arg_uid
= uid
;
283 ar
->k_ar
.ar_arg_gid
= gid
;
284 ARG_SET_VALID(ar
, ARG_UID
| ARG_GID
);
288 audit_arg_pid(struct kaudit_record
*ar
, pid_t pid
)
291 ar
->k_ar
.ar_arg_pid
= pid
;
292 ARG_SET_VALID(ar
, ARG_PID
);
296 audit_arg_process(struct kaudit_record
*ar
, proc_t p
)
298 kauth_cred_t my_cred
;
300 KASSERT(p
!= NULL
, ("audit_arg_process: p == NULL"));
305 my_cred
= kauth_cred_proc_ref(p
);
306 ar
->k_ar
.ar_arg_auid
= my_cred
->cr_audit
.as_aia_p
->ai_auid
;
307 ar
->k_ar
.ar_arg_asid
= my_cred
->cr_audit
.as_aia_p
->ai_asid
;
308 bcopy(&my_cred
->cr_audit
.as_aia_p
->ai_termid
,
309 &ar
->k_ar
.ar_arg_termid_addr
, sizeof(au_tid_addr_t
));
310 ar
->k_ar
.ar_arg_euid
= kauth_cred_getuid(my_cred
);
311 ar
->k_ar
.ar_arg_egid
= kauth_cred_getgid(my_cred
);
312 ar
->k_ar
.ar_arg_ruid
= kauth_cred_getruid(my_cred
);
313 ar
->k_ar
.ar_arg_rgid
= kauth_cred_getrgid(my_cred
);
314 kauth_cred_unref(&my_cred
);
315 ar
->k_ar
.ar_arg_pid
= p
->p_pid
;
316 ARG_SET_VALID(ar
, ARG_AUID
| ARG_EUID
| ARG_EGID
| ARG_RUID
|
317 ARG_RGID
| ARG_ASID
| ARG_TERMID_ADDR
| ARG_PID
| ARG_PROCESS
);
321 audit_arg_signum(struct kaudit_record
*ar
, u_int signum
)
324 ar
->k_ar
.ar_arg_signum
= signum
;
325 ARG_SET_VALID(ar
, ARG_SIGNUM
);
329 audit_arg_socket(struct kaudit_record
*ar
, int sodomain
, int sotype
,
333 ar
->k_ar
.ar_arg_sockinfo
.sai_domain
= sodomain
;
334 ar
->k_ar
.ar_arg_sockinfo
.sai_type
= sotype
;
335 ar
->k_ar
.ar_arg_sockinfo
.sai_protocol
= soprotocol
;
336 ARG_SET_VALID(ar
, ARG_SOCKINFO
);
340 * Note that the current working directory vp must be supplied at the audit
341 * call site to permit per thread current working directories, and that it
342 * must take a upath starting with '/' into account for chroot if the path
343 * is absolute. This results in the real (non-chroot) path being recorded
344 * in the audit record.
347 audit_arg_sockaddr(struct kaudit_record
*ar
, struct vnode
*cwd_vp
,
351 struct sockaddr_un
*sun
;
352 char path
[SOCK_MAXADDRLEN
- offsetof(struct sockaddr_un
, sun_path
) + 1];
354 KASSERT(sa
!= NULL
, ("audit_arg_sockaddr: sa == NULL"));
356 if (cwd_vp
== NULL
|| sa
== NULL
)
359 bcopy(sa
, &ar
->k_ar
.ar_arg_sockaddr
, sa
->sa_len
);
360 switch (sa
->sa_family
) {
362 ARG_SET_VALID(ar
, ARG_SADDRINET
);
366 ARG_SET_VALID(ar
, ARG_SADDRINET6
);
370 sun
= (struct sockaddr_un
*)sa
;
371 slen
= sun
->sun_len
- offsetof(struct sockaddr_un
, sun_path
);
375 * Make sure the path is NULL-terminated
377 if (sun
->sun_path
[slen
] != 0) {
378 bcopy(sun
->sun_path
, path
, slen
);
380 audit_arg_upath(ar
, cwd_vp
, path
, ARG_UPATH1
);
382 audit_arg_upath(ar
, cwd_vp
, sun
->sun_path
,
386 ARG_SET_VALID(ar
, ARG_SADDRUNIX
);
388 /* XXXAUDIT: default:? */
393 audit_arg_auid(struct kaudit_record
*ar
, uid_t auid
)
396 ar
->k_ar
.ar_arg_auid
= auid
;
397 ARG_SET_VALID(ar
, ARG_AUID
);
401 audit_arg_auditinfo(struct kaudit_record
*ar
, struct auditinfo
*au_info
)
404 ar
->k_ar
.ar_arg_auid
= au_info
->ai_auid
;
405 ar
->k_ar
.ar_arg_asid
= au_info
->ai_asid
;
406 ar
->k_ar
.ar_arg_amask
.am_success
= au_info
->ai_mask
.am_success
;
407 ar
->k_ar
.ar_arg_amask
.am_failure
= au_info
->ai_mask
.am_failure
;
408 ar
->k_ar
.ar_arg_termid
.port
= au_info
->ai_termid
.port
;
409 ar
->k_ar
.ar_arg_termid
.machine
= au_info
->ai_termid
.machine
;
410 ARG_SET_VALID(ar
, ARG_AUID
| ARG_ASID
| ARG_AMASK
| ARG_TERMID
);
414 audit_arg_auditinfo_addr(struct kaudit_record
*ar
,
415 struct auditinfo_addr
*au_info
)
418 ar
->k_ar
.ar_arg_auid
= au_info
->ai_auid
;
419 ar
->k_ar
.ar_arg_asid
= au_info
->ai_asid
;
420 ar
->k_ar
.ar_arg_amask
.am_success
= au_info
->ai_mask
.am_success
;
421 ar
->k_ar
.ar_arg_amask
.am_failure
= au_info
->ai_mask
.am_failure
;
422 ar
->k_ar
.ar_arg_termid_addr
.at_type
= au_info
->ai_termid
.at_type
;
423 ar
->k_ar
.ar_arg_termid_addr
.at_port
= au_info
->ai_termid
.at_port
;
424 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[0] = au_info
->ai_termid
.at_addr
[0];
425 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[1] = au_info
->ai_termid
.at_addr
[1];
426 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[2] = au_info
->ai_termid
.at_addr
[2];
427 ar
->k_ar
.ar_arg_termid_addr
.at_addr
[3] = au_info
->ai_termid
.at_addr
[3];
428 ARG_SET_VALID(ar
, ARG_AUID
| ARG_ASID
| ARG_AMASK
| ARG_TERMID_ADDR
);
432 audit_arg_text(struct kaudit_record
*ar
, char *text
)
435 KASSERT(text
!= NULL
, ("audit_arg_text: text == NULL"));
437 /* Invalidate the text string */
438 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_TEXT
);
442 if (ar
->k_ar
.ar_arg_text
== NULL
)
443 ar
->k_ar
.ar_arg_text
= malloc(MAXPATHLEN
, M_AUDITTEXT
,
446 strncpy(ar
->k_ar
.ar_arg_text
, text
, MAXPATHLEN
);
447 ARG_SET_VALID(ar
, ARG_TEXT
);
451 audit_arg_opaque(struct kaudit_record
*ar
, void *data
, size_t size
)
454 KASSERT(data
!= NULL
, ("audit_arg_opaque: data == NULL"));
455 KASSERT(size
<= UINT16_MAX
, ("audit_arg_opaque: size > UINT16_MAX"));
457 if (data
== NULL
|| size
> UINT16_MAX
)
460 if (ar
->k_ar
.ar_arg_opaque
== NULL
)
461 ar
->k_ar
.ar_arg_opaque
= malloc(size
, M_AUDITDATA
, M_WAITOK
);
465 memcpy(ar
->k_ar
.ar_arg_opaque
, data
, size
);
466 ar
->k_ar
.ar_arg_opq_size
= (u_int16_t
) size
;
467 ARG_SET_VALID(ar
, ARG_OPAQUE
);
471 audit_arg_data(struct kaudit_record
*ar
, void *data
, size_t size
, size_t number
)
475 KASSERT(data
!= NULL
, ("audit_arg_data: data == NULL"));
476 KASSERT(size
>= AUR_BYTE_SIZE
&& size
<= AUR_INT64_SIZE
,
477 ("audit_arg_data: size < AUR_BYTE_SIZE or size > AUR_INT64_SIZE"));
478 KASSERT(number
<= UINT8_MAX
,
479 ("audit_arg_data: number > UINT8_MAX"));
481 if (data
== NULL
|| size
< AUR_BYTE_SIZE
|| size
> AUR_INT64_SIZE
||
487 if (ar
->k_ar
.ar_arg_data
== NULL
)
488 ar
->k_ar
.ar_arg_data
= malloc(sz
, M_AUDITDATA
, M_WAITOK
);
492 memcpy(ar
->k_ar
.ar_arg_data
, data
, sz
);
496 ar
->k_ar
.ar_arg_data_type
= AUR_BYTE
;
500 ar
->k_ar
.ar_arg_data_type
= AUR_SHORT
;
504 ar
->k_ar
.ar_arg_data_type
= AUR_INT32
;
508 ar
->k_ar
.ar_arg_data_type
= AUR_INT64
;
512 free(ar
->k_ar
.ar_arg_data
, M_AUDITDATA
);
513 ar
->k_ar
.ar_arg_data
= NULL
;
517 ar
->k_ar
.ar_arg_data_count
= (u_char
)number
;
519 ARG_SET_VALID(ar
, ARG_DATA
);
523 audit_arg_cmd(struct kaudit_record
*ar
, int cmd
)
526 ar
->k_ar
.ar_arg_cmd
= cmd
;
527 ARG_SET_VALID(ar
, ARG_CMD
);
531 audit_arg_svipc_cmd(struct kaudit_record
*ar
, int cmd
)
534 ar
->k_ar
.ar_arg_svipc_cmd
= cmd
;
535 ARG_SET_VALID(ar
, ARG_SVIPC_CMD
);
539 audit_arg_svipc_perm(struct kaudit_record
*ar
, struct ipc_perm
*perm
)
542 bcopy(perm
, &ar
->k_ar
.ar_arg_svipc_perm
,
543 sizeof(ar
->k_ar
.ar_arg_svipc_perm
));
544 ARG_SET_VALID(ar
, ARG_SVIPC_PERM
);
548 audit_arg_svipc_id(struct kaudit_record
*ar
, int id
)
551 ar
->k_ar
.ar_arg_svipc_id
= id
;
552 ARG_SET_VALID(ar
, ARG_SVIPC_ID
);
556 audit_arg_svipc_addr(struct kaudit_record
*ar
, user_addr_t addr
)
559 ar
->k_ar
.ar_arg_svipc_addr
= addr
;
560 ARG_SET_VALID(ar
, ARG_SVIPC_ADDR
);
564 audit_arg_posix_ipc_perm(struct kaudit_record
*ar
, uid_t uid
, gid_t gid
,
568 ar
->k_ar
.ar_arg_pipc_perm
.pipc_uid
= uid
;
569 ar
->k_ar
.ar_arg_pipc_perm
.pipc_gid
= gid
;
570 ar
->k_ar
.ar_arg_pipc_perm
.pipc_mode
= mode
;
571 ARG_SET_VALID(ar
, ARG_POSIX_IPC_PERM
);
575 audit_arg_auditon(struct kaudit_record
*ar
, union auditon_udata
*udata
)
578 bcopy((void *)udata
, &ar
->k_ar
.ar_arg_auditon
,
579 sizeof(ar
->k_ar
.ar_arg_auditon
));
580 ARG_SET_VALID(ar
, ARG_AUDITON
);
584 * Audit information about a file, either the file's vnode info, or its
585 * socket address info.
588 audit_arg_file(struct kaudit_record
*ar
, __unused proc_t p
,
593 struct sockaddr_in
*sin
;
594 struct sockaddr_in6
*sin6
;
596 switch (FILEGLOB_DTYPE(fp
->f_fglob
)) {
598 /* case DTYPE_FIFO: */
599 audit_arg_vnpath_withref(ar
,
600 (struct vnode
*)fp
->f_fglob
->fg_data
, ARG_VNODE1
);
604 so
= (struct socket
*)fp
->f_fglob
->fg_data
;
605 if (SOCK_CHECK_DOM(so
, PF_INET
)) {
606 if (so
->so_pcb
== NULL
)
608 ar
->k_ar
.ar_arg_sockinfo
.sai_type
=
610 ar
->k_ar
.ar_arg_sockinfo
.sai_domain
= SOCK_DOM(so
);
611 ar
->k_ar
.ar_arg_sockinfo
.sai_protocol
= SOCK_PROTO(so
);
612 pcb
= (struct inpcb
*)so
->so_pcb
;
613 sin
= (struct sockaddr_in
*)
614 &ar
->k_ar
.ar_arg_sockinfo
.sai_faddr
;
615 sin
->sin_addr
.s_addr
= pcb
->inp_faddr
.s_addr
;
616 sin
->sin_port
= pcb
->inp_fport
;
617 sin
= (struct sockaddr_in
*)
618 &ar
->k_ar
.ar_arg_sockinfo
.sai_laddr
;
619 sin
->sin_addr
.s_addr
= pcb
->inp_laddr
.s_addr
;
620 sin
->sin_port
= pcb
->inp_lport
;
621 ARG_SET_VALID(ar
, ARG_SOCKINFO
);
623 if (SOCK_CHECK_DOM(so
, PF_INET6
)) {
624 if (so
->so_pcb
== NULL
)
626 ar
->k_ar
.ar_arg_sockinfo
.sai_type
=
628 ar
->k_ar
.ar_arg_sockinfo
.sai_domain
= SOCK_DOM(so
);
629 ar
->k_ar
.ar_arg_sockinfo
.sai_protocol
= SOCK_PROTO(so
);
630 pcb
= (struct inpcb
*)so
->so_pcb
;
631 sin6
= (struct sockaddr_in6
*)
632 &ar
->k_ar
.ar_arg_sockinfo
.sai_faddr
;
633 sin6
->sin6_addr
= pcb
->in6p_faddr
;
634 sin6
->sin6_port
= pcb
->in6p_fport
;
635 sin6
= (struct sockaddr_in6
*)
636 &ar
->k_ar
.ar_arg_sockinfo
.sai_laddr
;
637 sin6
->sin6_addr
= pcb
->in6p_laddr
;
638 sin6
->sin6_port
= pcb
->in6p_lport
;
639 ARG_SET_VALID(ar
, ARG_SOCKINFO
);
644 /* XXXAUDIT: else? */
650 * Store a path as given by the user process for auditing into the audit
651 * record stored on the user thread. This function will allocate the memory
652 * to store the path info if not already available. This memory will be
653 * freed when the audit record is freed.
655 * Note that the current working directory vp must be supplied at the audit call
656 * site to permit per thread current working directories, and that it must take
657 * a upath starting with '/' into account for chroot if the path is absolute.
658 * This results in the real (non-chroot) path being recorded in the audit
661 * XXXAUDIT: Possibly assert that the memory isn't already allocated?
664 audit_arg_upath(struct kaudit_record
*ar
, struct vnode
*cwd_vp
, char *upath
, u_int64_t flag
)
668 KASSERT(upath
!= NULL
, ("audit_arg_upath: upath == NULL"));
669 KASSERT((flag
== ARG_UPATH1
) || (flag
== ARG_UPATH2
),
670 ("audit_arg_upath: flag %llu", (unsigned long long)flag
));
671 KASSERT((flag
!= ARG_UPATH1
) || (flag
!= ARG_UPATH2
),
672 ("audit_arg_upath: flag %llu", (unsigned long long)flag
));
674 if (flag
== ARG_UPATH1
)
675 pathp
= &ar
->k_ar
.ar_arg_upath1
;
677 pathp
= &ar
->k_ar
.ar_arg_upath2
;
680 *pathp
= malloc(MAXPATHLEN
, M_AUDITPATH
, M_WAITOK
);
684 if (audit_canon_path(cwd_vp
, upath
, *pathp
) == 0)
685 ARG_SET_VALID(ar
, flag
);
687 free(*pathp
, M_AUDITPATH
);
693 * Function to save the path and vnode attr information into the audit
696 * It is assumed that the caller will hold any vnode locks necessary to
697 * perform a VNOP_GETATTR() on the passed vnode.
699 * XXX: The attr code is very similar to vfs_vnops.c:vn_stat(), but always
700 * provides access to the generation number as we need that to construct the
703 * XXX: We should accept the process argument from the caller, since it's
704 * very likely they already have a reference.
706 * XXX: Error handling in this function is poor.
708 * XXXAUDIT: Possibly KASSERT the path pointer is NULL?
711 audit_arg_vnpath(struct kaudit_record
*ar
, struct vnode
*vp
, u_int64_t flags
)
713 struct vnode_attr va
;
717 struct vnode_au_info
*vnp
;
720 char **vnode_mac_labelp
;
724 KASSERT(vp
!= NULL
, ("audit_arg_vnpath: vp == NULL"));
725 KASSERT((flags
== ARG_VNODE1
) || (flags
== ARG_VNODE2
),
726 ("audit_arg_vnpath: flags != ARG_VNODE[1,2]"));
731 * XXXAUDIT: The below clears, and then resets the flags for valid
732 * arguments. Ideally, either the new vnode is used, or the old one
735 if (flags
& ARG_VNODE1
) {
736 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_KPATH1
);
737 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_VNODE1
);
738 pathp
= &ar
->k_ar
.ar_arg_kpath1
;
739 vnp
= &ar
->k_ar
.ar_arg_vnode1
;
741 vnode_mac_labelp
= &ar
->k_ar
.ar_vnode1_mac_labels
;
744 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_KPATH2
);
745 ar
->k_ar
.ar_valid_arg
&= (ARG_ALL
^ ARG_VNODE2
);
746 pathp
= &ar
->k_ar
.ar_arg_kpath2
;
747 vnp
= &ar
->k_ar
.ar_arg_vnode2
;
749 vnode_mac_labelp
= &ar
->k_ar
.ar_vnode2_mac_labels
;
754 *pathp
= malloc(MAXPATHLEN
, M_AUDITPATH
, M_WAITOK
);
759 * If vn_getpath() succeeds, place it in a string buffer
760 * attached to the audit record, and set a flag indicating
764 if (vn_getpath(vp
, *pathp
, &len
) == 0) {
765 if (flags
& ARG_VNODE1
)
766 ARG_SET_VALID(ar
, ARG_KPATH1
);
768 ARG_SET_VALID(ar
, ARG_KPATH2
);
770 free(*pathp
, M_AUDITPATH
);
775 VATTR_WANTED(&va
, va_mode
);
776 VATTR_WANTED(&va
, va_uid
);
777 VATTR_WANTED(&va
, va_gid
);
778 VATTR_WANTED(&va
, va_rdev
);
779 VATTR_WANTED(&va
, va_fsid
);
780 VATTR_WANTED(&va
, va_fileid
);
781 VATTR_WANTED(&va
, va_gen
);
782 error
= vnode_getattr(vp
, &va
, vfs_context_current());
784 /* XXX: How to handle this case? */
789 if (*vnode_mac_labelp
== NULL
&& (vp
->v_lflag
& VL_LABELED
) == VL_LABELED
) {
790 *vnode_mac_labelp
= (char *)zalloc(audit_mac_label_zone
);
791 if (*vnode_mac_labelp
!= NULL
) {
792 mac
.m_buflen
= MAC_AUDIT_LABEL_LEN
;
793 mac
.m_string
= *vnode_mac_labelp
;
794 mac_vnode_label_externalize_audit(vp
, &mac
);
800 * XXX do we want to fall back here when these aren't supported?
802 vnp
->vn_mode
= va
.va_mode
;
803 vnp
->vn_uid
= va
.va_uid
;
804 vnp
->vn_gid
= va
.va_gid
;
805 vnp
->vn_dev
= va
.va_rdev
;
806 vnp
->vn_fsid
= va
.va_fsid
;
807 vnp
->vn_fileid
= (u_int32_t
)va
.va_fileid
;
808 vnp
->vn_gen
= va
.va_gen
;
809 if (flags
& ARG_VNODE1
)
810 ARG_SET_VALID(ar
, ARG_VNODE1
);
812 ARG_SET_VALID(ar
, ARG_VNODE2
);
816 audit_arg_vnpath_withref(struct kaudit_record
*ar
, struct vnode
*vp
, u_int64_t flags
)
818 if (vp
== NULL
|| vnode_getwithref(vp
))
820 audit_arg_vnpath(ar
, vp
, flags
);
825 audit_arg_mach_port1(struct kaudit_record
*ar
, mach_port_name_t port
)
828 ar
->k_ar
.ar_arg_mach_port1
= port
;
829 ARG_SET_VALID(ar
, ARG_MACHPORT1
);
833 audit_arg_mach_port2(struct kaudit_record
*ar
, mach_port_name_t port
)
836 ar
->k_ar
.ar_arg_mach_port2
= port
;
837 ARG_SET_VALID(ar
, ARG_MACHPORT2
);
842 * Audit the argument strings passed to exec.
845 audit_arg_argv(struct kaudit_record
*ar
, char *argv
, int argc
, int length
)
848 if (audit_argv
== 0 || argc
== 0)
851 if (ar
->k_ar
.ar_arg_argv
== NULL
)
852 ar
->k_ar
.ar_arg_argv
= malloc(length
, M_AUDITTEXT
, M_WAITOK
);
853 bcopy(argv
, ar
->k_ar
.ar_arg_argv
, length
);
854 ar
->k_ar
.ar_arg_argc
= argc
;
855 ARG_SET_VALID(ar
, ARG_ARGV
);
859 * Audit the environment strings passed to exec.
862 audit_arg_envv(struct kaudit_record
*ar
, char *envv
, int envc
, int length
)
865 if (audit_arge
== 0 || envc
== 0)
868 if (ar
->k_ar
.ar_arg_envv
== NULL
)
869 ar
->k_ar
.ar_arg_envv
= malloc(length
, M_AUDITTEXT
, M_WAITOK
);
870 bcopy(envv
, ar
->k_ar
.ar_arg_envv
, length
);
871 ar
->k_ar
.ar_arg_envc
= envc
;
872 ARG_SET_VALID(ar
, ARG_ENVV
);
876 * The close() system call uses it's own audit call to capture the path/vnode
877 * information because those pieces are not easily obtained within the system
881 audit_sysclose(struct kaudit_record
*ar
, proc_t p
, int fd
)
886 KASSERT(p
!= NULL
, ("audit_sysclose: p == NULL"));
888 audit_arg_fd(ar
, fd
);
890 if (fp_getfvp(p
, fd
, &fp
, &vp
) != 0)
893 audit_arg_vnpath_withref(ar
, (struct vnode
*)fp
->f_fglob
->fg_data
,
895 fp_drop(p
, fd
, fp
, 0);
898 #endif /* CONFIG_AUDIT */