2 * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
23 #include <sys/types.h>
24 #include <sys/vnode_internal.h>
27 #include <sys/socketvar.h>
28 #include <sys/socket.h>
29 #include <sys/queue.h>
30 #include <sys/fcntl.h>
34 #include <bsm/audit.h>
35 #include <bsm/audit_record.h>
36 #include <bsm/audit_kernel.h>
37 #include <bsm/audit_kevents.h>
38 #include <bsm/audit_klib.h>
40 #include <netinet/in_systm.h>
41 #include <netinet/in.h>
42 #include <netinet/ip.h>
44 #include <kern/lock.h>
45 #include <kern/kalloc.h>
47 /* The number of BSM records allocated. */
48 static int bsm_rec_count
= 0;
51 * Records that can be recycled are maintained in the list given below
52 * The maximum number of elements that can be present in this list is
53 * bounded by MAX_AUDIT_RECORDS. Memory allocated for these records are never
56 LIST_HEAD(, au_record
) bsm_free_q
;
59 * Lock for serializing access to the list of audit records.
61 static mutex_t
*bsm_audit_mutex
;
63 static void audit_sys_auditon(struct audit_record
*ar
, struct au_record
*rec
);
66 * Initialize the BSM auditing subsystem.
71 printf("BSM auditing present\n");
72 LIST_INIT(&bsm_free_q
);
73 bsm_audit_mutex
= mutex_alloc(0);
78 * This call reserves memory for the audit record.
79 * Memory must be guaranteed before any auditable event can be
81 * The au_record structure maintains a reference to the
82 * memory allocated above and also the list of tokens associated
88 struct au_record
*rec
= NULL
;
91 * Find an unused record, remove it from the free list, mark as used
93 mutex_lock(bsm_audit_mutex
);
94 if (!LIST_EMPTY(&bsm_free_q
)) {
95 rec
= LIST_FIRST(&bsm_free_q
);
96 LIST_REMOVE(rec
, au_rec_q
);
98 mutex_unlock(bsm_audit_mutex
);
101 mutex_lock(bsm_audit_mutex
);
102 if (bsm_rec_count
>= MAX_AUDIT_RECORDS
) {
103 /* XXX We need to increase size of MAX_AUDIT_RECORDS */
104 mutex_unlock(bsm_audit_mutex
);
107 mutex_unlock(bsm_audit_mutex
);
110 * Create a new BSM kernel record.
112 rec
= (struct au_record
*)kalloc(sizeof(*rec
));
116 rec
->data
= (u_char
*)kalloc(MAX_AUDIT_RECORD_SIZE
* sizeof(u_char
));
117 if((rec
->data
) == NULL
) {
118 kfree(rec
, sizeof(*rec
));
121 mutex_lock(bsm_audit_mutex
);
123 mutex_unlock(bsm_audit_mutex
);
125 memset(rec
->data
, 0, MAX_AUDIT_RECORD_SIZE
);
127 TAILQ_INIT(&rec
->token_q
);
135 * Store the token with the record descriptor
138 int kau_write(struct au_record
*rec
, struct au_token
*tok
)
141 return -1; /* Invalid Token */
144 /* Add the token to the tail */
146 * XXX Not locking here -- we should not be writing to
147 * XXX the same audit record from different threads
149 TAILQ_INSERT_TAIL(&rec
->token_q
, tok
, tokens
);
151 rec
->len
+= tok
->len
; /* grow record length by token size bytes */
157 * Close out the audit record by adding the header token, identifying
158 * any missing tokens. Write out the tokens to the record memory.
161 kau_close(struct au_record
*rec
, struct timespec
*ctime
, short event
)
165 token_t
*cur
, *hdr
, *trail
;
168 tot_rec_size
= rec
->len
+ HEADER_SIZE
+ TRAILER_SIZE
;
169 if(tot_rec_size
<= MAX_AUDIT_RECORD_SIZE
) {
170 /* Create the header token */
171 hdr
= kau_to_header32(ctime
, tot_rec_size
, event
, 0);
174 /* Add to head of list */
175 TAILQ_INSERT_HEAD(&rec
->token_q
, hdr
, tokens
);
177 trail
= au_to_trailer(tot_rec_size
);
179 TAILQ_INSERT_TAIL(&rec
->token_q
, trail
, tokens
);
182 /* Serialize token data to the record */
184 rec
->len
= tot_rec_size
;
186 TAILQ_FOREACH(cur
, &rec
->token_q
, tokens
) {
187 memcpy(dptr
, cur
->t_data
, cur
->len
);
196 * Free a BSM audit record by releasing all the tokens and clearing the
197 * audit record information.
199 void kau_free(struct au_record
*rec
)
201 struct au_token
*tok
;
203 /* Free the token list */
204 while ((tok
= TAILQ_FIRST(&rec
->token_q
))) {
205 TAILQ_REMOVE(&rec
->token_q
, tok
, tokens
);
206 kfree(tok
, sizeof(*tok
) + tok
->len
);
212 mutex_lock(bsm_audit_mutex
);
214 /* Add the record to the freelist */
215 LIST_INSERT_HEAD(&bsm_free_q
, rec
, au_rec_q
);
217 mutex_unlock(bsm_audit_mutex
);
222 * XXX May want turn some (or all) of these macros into functions in order
223 * to reduce the generated code sized.
225 #define UPATH1_TOKENS \
227 if (ar->ar_valid_arg & ARG_UPATH1) { \
228 tok = au_to_path(ar->ar_arg_upath1); \
229 kau_write(rec, tok); \
233 #define UPATH2_TOKENS \
235 if (ar->ar_valid_arg & ARG_UPATH2) { \
236 tok = au_to_path(ar->ar_arg_upath2); \
237 kau_write(rec, tok); \
241 #define UPATH1_KPATH1_VNODE1_TOKENS \
243 if (ar->ar_valid_arg & ARG_UPATH1) { \
244 tok = au_to_path(ar->ar_arg_upath1); \
245 kau_write(rec, tok); \
247 if (ar->ar_valid_arg & ARG_KPATH1) { \
248 tok = au_to_path(ar->ar_arg_kpath1); \
249 kau_write(rec, tok); \
251 if (ar->ar_valid_arg & ARG_VNODE1) { \
252 tok = kau_to_attr32(&ar->ar_arg_vnode1);\
253 kau_write(rec, tok); \
257 #define KPATH1_VNODE1_TOKENS \
259 if (ar->ar_valid_arg & ARG_KPATH1) { \
260 tok = au_to_path(ar->ar_arg_kpath1); \
261 kau_write(rec, tok); \
263 if (ar->ar_valid_arg & ARG_VNODE1) { \
264 tok = kau_to_attr32(&ar->ar_arg_vnode1);\
265 kau_write(rec, tok); \
269 #define KPATH2_VNODE2_TOKENS \
271 if (ar->ar_valid_arg & ARG_KPATH2) { \
272 tok = au_to_path(ar->ar_arg_kpath2); \
273 kau_write(rec, tok); \
275 if (ar->ar_valid_arg & ARG_VNODE2) { \
276 tok = kau_to_attr32(&ar->ar_arg_vnode1);\
277 kau_write(rec, tok); \
281 #define FD_KPATH1_VNODE1_TOKENS \
283 if (ar->ar_valid_arg & ARG_KPATH1) { \
284 tok = au_to_path(ar->ar_arg_kpath1); \
285 kau_write(rec, tok); \
286 if (ar->ar_valid_arg & ARG_VNODE1) { \
287 tok = kau_to_attr32(&ar->ar_arg_vnode1);\
288 kau_write(rec, tok); \
291 tok = au_to_arg32(1, "no path: fd", ar->ar_arg_fd); \
292 kau_write(rec, tok); \
296 #define PROCESS_PID_TOKENS(argn) \
298 if ((ar->ar_arg_pid > 0) /* Kill a single process */ \
299 && (ar->ar_valid_arg & ARG_PROCESS)) { \
300 tok = au_to_process(ar->ar_arg_auid, ar->ar_arg_euid, \
301 ar->ar_arg_egid, ar->ar_arg_ruid, \
302 ar->ar_arg_rgid, ar->ar_arg_pid, \
303 ar->ar_arg_asid, &ar->ar_arg_termid); \
304 kau_write(rec, tok); \
306 tok = au_to_arg32(argn, "process", ar->ar_arg_pid);\
307 kau_write(rec, tok); \
312 * Implement auditing for the auditon() system call. The audit tokens
313 * that are generated depend on the command that was sent into the
314 * auditon() system call.
318 audit_sys_auditon(struct audit_record
*ar
, struct au_record
*rec
)
320 struct au_token
*tok
;
322 switch (ar
->ar_arg_cmd
) {
324 if (sizeof(ar
->ar_arg_auditon
.au_flags
) > 4)
325 tok
= au_to_arg64(1, "policy",
326 ar
->ar_arg_auditon
.au_flags
);
328 tok
= au_to_arg32(1, "policy",
329 ar
->ar_arg_auditon
.au_flags
);
333 tok
= au_to_arg32(2, "setkmask:as_success",
334 ar
->ar_arg_auditon
.au_mask
.am_success
);
336 tok
= au_to_arg32(2, "setkmask:as_failure",
337 ar
->ar_arg_auditon
.au_mask
.am_failure
);
341 tok
= au_to_arg32(3, "setqctrl:aq_hiwater",
342 ar
->ar_arg_auditon
.au_qctrl
.aq_hiwater
);
344 tok
= au_to_arg32(3, "setqctrl:aq_lowater",
345 ar
->ar_arg_auditon
.au_qctrl
.aq_lowater
);
347 tok
= au_to_arg32(3, "setqctrl:aq_bufsz",
348 ar
->ar_arg_auditon
.au_qctrl
.aq_bufsz
);
350 tok
= au_to_arg32(3, "setqctrl:aq_delay",
351 ar
->ar_arg_auditon
.au_qctrl
.aq_delay
);
353 tok
= au_to_arg32(3, "setqctrl:aq_minfree",
354 ar
->ar_arg_auditon
.au_qctrl
.aq_minfree
);
358 tok
= au_to_arg32(3, "setumask:as_success",
359 ar
->ar_arg_auditon
.au_auinfo
.ai_mask
.am_success
);
361 tok
= au_to_arg32(3, "setumask:as_failure",
362 ar
->ar_arg_auditon
.au_auinfo
.ai_mask
.am_failure
);
366 tok
= au_to_arg32(3, "setsmask:as_success",
367 ar
->ar_arg_auditon
.au_auinfo
.ai_mask
.am_success
);
369 tok
= au_to_arg32(3, "setsmask:as_failure",
370 ar
->ar_arg_auditon
.au_auinfo
.ai_mask
.am_failure
);
374 if (sizeof(ar
->ar_arg_auditon
.au_cond
) > 4)
375 tok
= au_to_arg64(3, "setcond",
376 ar
->ar_arg_auditon
.au_cond
);
378 tok
= au_to_arg32(3, "setcond",
379 ar
->ar_arg_auditon
.au_cond
);
383 tok
= au_to_arg32(2, "setclass:ec_event",
384 ar
->ar_arg_auditon
.au_evclass
.ec_number
);
386 tok
= au_to_arg32(3, "setclass:ec_class",
387 ar
->ar_arg_auditon
.au_evclass
.ec_class
);
391 tok
= au_to_arg32(2, "setpmask:as_success",
392 ar
->ar_arg_auditon
.au_aupinfo
.ap_mask
.am_success
);
394 tok
= au_to_arg32(2, "setpmask:as_failure",
395 ar
->ar_arg_auditon
.au_aupinfo
.ap_mask
.am_failure
);
399 tok
= au_to_arg32(2, "setfsize:filesize",
400 ar
->ar_arg_auditon
.au_fstat
.af_filesz
);
409 * Convert an internal kernel audit record to a BSM record and return
410 * a success/failure indicator. The BSM record is passed as an out
411 * parameter to this function.
413 * BSM_SUCCESS: The BSM record is valid
414 * BSM_FAILURE: Failure; the BSM record is NULL.
415 * BSM_NOAUDIT: The event is not auditable for BSM; the BSM record is NULL.
418 kaudit_to_bsm(struct kaudit_record
*kar
, struct au_record
**pau
)
420 struct au_token
*tok
, *subj_tok
;
421 struct au_record
*rec
;
423 struct audit_record
*ar
;
428 return (BSM_FAILURE
);
434 return (BSM_FAILURE
);
436 /* Create the subject token */
437 tid
.port
= ar
->ar_subj_term
.port
;
438 tid
.machine
= ar
->ar_subj_term
.machine
;
439 subj_tok
= au_to_subject32(ar
->ar_subj_auid
, /* audit ID */
440 ar
->ar_subj_cred
.cr_uid
, /* eff uid */
441 ar
->ar_subj_egid
, /* eff group id */
442 ar
->ar_subj_ruid
, /* real uid */
443 ar
->ar_subj_rgid
, /* real group id */
444 ar
->ar_subj_pid
, /* process id */
445 ar
->ar_subj_asid
, /* session ID */
448 /* The logic inside each case fills in the tokens required for the
449 * event, except for the header, trailer, and return tokens. The
450 * header and trailer tokens are added by the kau_close() function.
451 * The return token is added outside of the switch statement.
453 switch(ar
->ar_event
) {
456 * Socket-related events.
465 tok
= au_to_arg32(1, "fd", ar
->ar_arg_fd
);
467 if (ar
->ar_valid_arg
& ARG_SADDRINET
) {
468 tok
= au_to_sock_inet(
469 (struct sockaddr_in
*)&ar
->ar_arg_sockaddr
);
472 if (ar
->ar_valid_arg
& ARG_SADDRUNIX
) {
473 tok
= au_to_sock_unix(
474 (struct sockaddr_un
*)&ar
->ar_arg_sockaddr
);
478 /* XXX Need to handle ARG_SADDRINET6 */
483 tok
= au_to_arg32(1,"domain", ar
->ar_arg_sockinfo
.so_domain
);
485 tok
= au_to_arg32(2,"type", ar
->ar_arg_sockinfo
.so_type
);
487 tok
= au_to_arg32(3,"protocol",ar
->ar_arg_sockinfo
.so_protocol
);
493 tok
= au_to_arg32(1, "fd", ar
->ar_arg_fd
);
498 if (ar
->ar_valid_arg
& (ARG_KPATH1
| ARG_UPATH1
)) {
499 UPATH1_KPATH1_VNODE1_TOKENS
;
501 tok
= au_to_arg32(1, "accounting off", 0);
507 tok
= au_to_arg32(2, "setauid", ar
->ar_arg_auid
);
512 if (ar
->ar_valid_arg
& ARG_AUID
) {
513 tok
= au_to_arg32(1, "setaudit:auid", ar
->ar_arg_auid
);
515 tok
= au_to_arg32(1, "setaudit:port",
516 ar
->ar_arg_termid
.port
);
518 tok
= au_to_arg32(1, "setaudit:machine",
519 ar
->ar_arg_termid
.machine
);
521 tok
= au_to_arg32(1, "setaudit:as_success",
522 ar
->ar_arg_amask
.am_success
);
524 tok
= au_to_arg32(1, "setaudit:as_failure",
525 ar
->ar_arg_amask
.am_failure
);
527 tok
= au_to_arg32(1, "setaudit:asid", ar
->ar_arg_asid
);
532 case AUE_SETAUDIT_ADDR
:
533 break; /* XXX need to add arguments */
536 /* For AUDITON commands without own event, audit the cmd */
537 tok
= au_to_arg32(1, "cmd", ar
->ar_arg_cmd
);
541 case AUE_AUDITON_GETCAR
:
542 case AUE_AUDITON_GETCLASS
:
543 case AUE_AUDITON_GETCOND
:
544 case AUE_AUDITON_GETCWD
:
545 case AUE_AUDITON_GETKMASK
:
546 case AUE_AUDITON_GETSTAT
:
547 case AUE_AUDITON_GPOLICY
:
548 case AUE_AUDITON_GQCTRL
:
549 case AUE_AUDITON_SETCLASS
:
550 case AUE_AUDITON_SETCOND
:
551 case AUE_AUDITON_SETKMASK
:
552 case AUE_AUDITON_SETSMASK
:
553 case AUE_AUDITON_SETSTAT
:
554 case AUE_AUDITON_SETUMASK
:
555 case AUE_AUDITON_SPOLICY
:
556 case AUE_AUDITON_SQCTRL
:
557 if (ar
->ar_valid_arg
& ARG_AUDITON
) {
558 audit_sys_auditon(ar
, rec
);
563 UPATH1_KPATH1_VNODE1_TOKENS
;
570 case AUE_GETAUDIT_ADDR
:
577 case AUE_SETTIMEOFDAY
:
578 case AUE_NEWSYSTEMSHREG
:
579 /* Header, subject, and return tokens added at end */
586 case AUE_GETATTRLIST
:
595 case AUE_SETATTRLIST
:
602 UPATH1_KPATH1_VNODE1_TOKENS
;
606 tok
= au_to_arg32(2, "flags", ar
->ar_arg_fflags
);
608 UPATH1_KPATH1_VNODE1_TOKENS
;
612 tok
= au_to_arg32(2, "new file mode", ar
->ar_arg_mode
);
614 UPATH1_KPATH1_VNODE1_TOKENS
;
619 tok
= au_to_arg32(2, "new file uid", ar
->ar_arg_uid
);
621 tok
= au_to_arg32(3, "new file gid", ar
->ar_arg_gid
);
623 UPATH1_KPATH1_VNODE1_TOKENS
;
626 case AUE_EXCHANGEDATA
:
627 UPATH1_KPATH1_VNODE1_TOKENS
;
628 KPATH2_VNODE2_TOKENS
;
632 tok
= au_to_arg32(2, "fd", ar
->ar_arg_fd
);
634 UPATH1_KPATH1_VNODE1_TOKENS
;
638 tok
= au_to_arg32(2, "new file mode", ar
->ar_arg_mode
);
640 FD_KPATH1_VNODE1_TOKENS
;
644 tok
= au_to_arg32(1, "request", ar
->ar_arg_cmd
);
646 if (ar
->ar_valid_arg
& (ARG_KPATH1
| ARG_UPATH1
)) {
647 UPATH1_KPATH1_VNODE1_TOKENS
;
653 case AUE_FSTAT
: /* XXX Need to handle sockets and shm */
657 case AUE_GETDIRENTRIES
:
658 case AUE_GETDIRENTRIESATTR
:
659 FD_KPATH1_VNODE1_TOKENS
;
663 tok
= au_to_arg32(2, "new file uid", ar
->ar_arg_uid
);
665 tok
= au_to_arg32(3, "new file gid", ar
->ar_arg_gid
);
667 FD_KPATH1_VNODE1_TOKENS
;
671 tok
= au_to_arg32(2, "cmd", ar
->ar_arg_cmd
);
673 if (ar
->ar_valid_arg
& ARG_VNODE1
) {
674 FD_KPATH1_VNODE1_TOKENS
;
679 tok
= au_to_arg32(2, "flags", ar
->ar_arg_fflags
);
681 FD_KPATH1_VNODE1_TOKENS
;
685 tok
= au_to_arg32(2, "operation", ar
->ar_arg_cmd
);
687 FD_KPATH1_VNODE1_TOKENS
;
692 tok
= au_to_arg32(0, "child PID", ar
->ar_arg_pid
);
697 tok
= au_to_arg32(2, "cmd", ar
->ar_arg_cmd
);
699 tok
= au_to_arg32(1, "arg", (u_int32_t
)ar
->ar_arg_addr
);
701 if (ar
->ar_valid_arg
& ARG_VNODE1
) {
702 FD_KPATH1_VNODE1_TOKENS
;
704 if (ar
->ar_valid_arg
& ARG_SOCKINFO
) {
705 tok
= kau_to_socket(&ar
->ar_arg_sockinfo
);
708 tok
= au_to_arg32(1, "fd", ar
->ar_arg_fd
);
715 tok
= au_to_arg32(2, "signal", ar
->ar_arg_signum
);
717 PROCESS_PID_TOKENS(1);
721 tok
= au_to_arg32(2, "ops", ar
->ar_arg_cmd
);
723 tok
= au_to_arg32(3, "trpoints", ar
->ar_arg_value
);
725 PROCESS_PID_TOKENS(4);
726 UPATH1_KPATH1_VNODE1_TOKENS
;
731 UPATH1_KPATH1_VNODE1_TOKENS
;
736 tok
= au_to_arg32(4, "base addr", (u_int32_t
)ar
->ar_arg_addr
);
738 UPATH1_KPATH1_VNODE1_TOKENS
;
742 tok
= au_to_arg32(2, "mode", ar
->ar_arg_mode
);
744 UPATH1_KPATH1_VNODE1_TOKENS
;
748 tok
= au_to_arg32(2, "mode", ar
->ar_arg_mode
);
750 tok
= au_to_arg32(3, "dev", ar
->ar_arg_dev
);
752 UPATH1_KPATH1_VNODE1_TOKENS
;
761 tok
= au_to_arg32(1, "addr", (u_int32_t
)ar
->ar_arg_addr
); /* LP64todo */
763 tok
= au_to_arg32(2, "len", ar
->ar_arg_len
); /* LP64todo */
765 if (ar
->ar_event
== AUE_MMAP
)
766 FD_KPATH1_VNODE1_TOKENS
;
767 if (ar
->ar_event
== AUE_MPROTECT
) {
768 tok
= au_to_arg32(3, "protection", ar
->ar_arg_value
);
771 if (ar
->ar_event
== AUE_MINHERIT
) {
772 tok
= au_to_arg32(3, "inherit", ar
->ar_arg_value
);
778 /* XXX Need to handle NFS mounts */
779 tok
= au_to_arg32(3, "flags", ar
->ar_arg_fflags
);
781 if (ar
->ar_valid_arg
& ARG_TEXT
) {
782 tok
= au_to_text(ar
->ar_arg_text
);
787 UPATH1_KPATH1_VNODE1_TOKENS
;
791 ar
->ar_event
= msgctl_to_event(ar
->ar_arg_svipc_cmd
);
795 tok
= au_to_arg32(1, "msg ID", ar
->ar_arg_svipc_id
);
797 if (ar
->ar_errno
!= EINVAL
) {
798 tok
= au_to_ipc(AT_IPC_MSG
, ar
->ar_arg_svipc_id
);
804 if (ar
->ar_errno
== 0) {
805 tok
= au_to_ipc(AT_IPC_MSG
, ar
->ar_arg_svipc_id
);
810 case AUE_RESETSHFILE
:
811 tok
= au_to_arg32(1, "base addr", (u_int32_t
)ar
->ar_arg_addr
);
821 tok
= au_to_arg32(3, "mode", ar
->ar_arg_mode
);
832 tok
= au_to_arg32(2, "flags", ar
->ar_arg_fflags
);
834 UPATH1_KPATH1_VNODE1_TOKENS
;
838 tok
= au_to_arg32(1, "request", ar
->ar_arg_cmd
);
840 tok
= au_to_arg32(3, "addr", (u_int32_t
)ar
->ar_arg_addr
); /* LP64todo */
842 tok
= au_to_arg32(4, "data", ar
->ar_arg_value
);
844 PROCESS_PID_TOKENS(2);
848 tok
= au_to_arg32(2, "command", ar
->ar_arg_cmd
);
850 tok
= au_to_arg32(3, "uid", ar
->ar_arg_uid
);
852 UPATH1_KPATH1_VNODE1_TOKENS
;
856 tok
= au_to_arg32(1, "howto", ar
->ar_arg_cmd
);
861 ar
->ar_event
= semctl_to_event(ar
->ar_arg_svipc_cmd
);
864 tok
= au_to_arg32(1, "sem ID", ar
->ar_arg_svipc_id
);
866 if (ar
->ar_errno
!= EINVAL
) {
867 tok
= au_to_ipc(AT_IPC_SEM
, ar
->ar_arg_svipc_id
);
872 if (ar
->ar_errno
== 0) {
873 tok
= au_to_ipc(AT_IPC_SEM
, ar
->ar_arg_svipc_id
);
878 tok
= au_to_arg32(1, "gid", ar
->ar_arg_egid
);
882 tok
= au_to_arg32(1, "uid", ar
->ar_arg_euid
);
886 tok
= au_to_arg32(1, "gid", ar
->ar_arg_gid
);
890 tok
= au_to_arg32(1, "uid", ar
->ar_arg_uid
);
894 if (ar
->ar_valid_arg
& ARG_GROUPSET
) {
895 for(ctr
= 0; ctr
< ar
->ar_arg_groups
.gidset_size
; ctr
++)
897 tok
= au_to_arg32(1, "setgroups", ar
->ar_arg_groups
.gidset
[ctr
]);
904 if (ar
->ar_valid_arg
& ARG_TEXT
) {
905 tok
= au_to_text(ar
->ar_arg_text
);
910 case AUE_SETPRIORITY
:
911 tok
= au_to_arg32(1, "which", ar
->ar_arg_cmd
);
913 tok
= au_to_arg32(2, "who", ar
->ar_arg_uid
);
915 tok
= au_to_arg32(2, "priority", ar
->ar_arg_value
);
919 case AUE_SETPRIVEXEC
:
920 tok
= au_to_arg32(1, "flag", ar
->ar_arg_value
);
924 /* AUE_SHMAT, AUE_SHMCTL, AUE_SHMDT and AUE_SHMGET are SysV IPC */
926 tok
= au_to_arg32(1, "shmid", ar
->ar_arg_svipc_id
);
928 tok
= au_to_arg32(2, "shmaddr", (int)ar
->ar_arg_svipc_addr
);
930 if (ar
->ar_valid_arg
& ARG_SVIPC_PERM
) {
931 tok
= au_to_ipc(AT_IPC_SHM
, ar
->ar_arg_svipc_id
);
933 tok
= au_to_ipc_perm(&ar
->ar_arg_svipc_perm
);
939 tok
= au_to_arg32(1, "shmid", ar
->ar_arg_svipc_id
);
941 switch (ar
->ar_arg_svipc_cmd
) {
943 ar
->ar_event
= AUE_SHMCTL_STAT
;
944 if (ar
->ar_valid_arg
& ARG_SVIPC_PERM
) {
945 tok
= au_to_ipc(AT_IPC_SHM
,
946 ar
->ar_arg_svipc_id
);
951 ar
->ar_event
= AUE_SHMCTL_RMID
;
952 if (ar
->ar_valid_arg
& ARG_SVIPC_PERM
) {
953 tok
= au_to_ipc(AT_IPC_SHM
,
954 ar
->ar_arg_svipc_id
);
959 ar
->ar_event
= AUE_SHMCTL_SET
;
960 if (ar
->ar_valid_arg
& ARG_SVIPC_PERM
) {
961 tok
= au_to_ipc(AT_IPC_SHM
,
962 ar
->ar_arg_svipc_id
);
964 tok
= au_to_ipc_perm(&ar
->ar_arg_svipc_perm
);
969 break; /* We will audit a bad command */
974 tok
= au_to_arg32(1, "shmaddr", (int)ar
->ar_arg_svipc_addr
);
979 /* This is unusual; the return value is in an argument token */
980 tok
= au_to_arg32(0, "shmid", ar
->ar_arg_svipc_id
);
982 if (ar
->ar_valid_arg
& ARG_SVIPC_PERM
) {
983 tok
= au_to_ipc(AT_IPC_SHM
, ar
->ar_arg_svipc_id
);
985 tok
= au_to_ipc_perm(&ar
->ar_arg_svipc_perm
);
990 /* AUE_SHMOPEN, AUE_SHMUNLINK, AUE_SEMOPEN, AUE_SEMCLOSE
991 * and AUE_SEMUNLINK are Posix IPC */
993 tok
= au_to_arg32(2, "flags", ar
->ar_arg_fflags
);
995 tok
= au_to_arg32(3, "mode", ar
->ar_arg_mode
);
998 if (ar
->ar_valid_arg
& ARG_TEXT
) {
999 tok
= au_to_text(ar
->ar_arg_text
);
1000 kau_write(rec
, tok
);
1002 if (ar
->ar_valid_arg
& ARG_POSIX_IPC_PERM
) {
1003 /* Create an ipc_perm token */
1004 struct ipc_perm perm
;
1005 perm
.uid
= ar
->ar_arg_pipc_perm
.pipc_uid
;
1006 perm
.gid
= ar
->ar_arg_pipc_perm
.pipc_gid
;
1007 perm
.cuid
= ar
->ar_arg_pipc_perm
.pipc_uid
;
1008 perm
.cgid
= ar
->ar_arg_pipc_perm
.pipc_gid
;
1009 perm
.mode
= ar
->ar_arg_pipc_perm
.pipc_mode
;
1012 tok
= au_to_ipc_perm(&perm
);
1013 kau_write(rec
, tok
);
1018 tok
= au_to_arg32(2, "flags", ar
->ar_arg_fflags
);
1019 kau_write(rec
, tok
);
1020 tok
= au_to_arg32(3, "mode", ar
->ar_arg_mode
);
1021 kau_write(rec
, tok
);
1022 tok
= au_to_arg32(4, "value", ar
->ar_arg_value
);
1023 kau_write(rec
, tok
);
1026 if (ar
->ar_valid_arg
& ARG_TEXT
) {
1027 tok
= au_to_text(ar
->ar_arg_text
);
1028 kau_write(rec
, tok
);
1030 if (ar
->ar_valid_arg
& ARG_POSIX_IPC_PERM
) {
1031 /* Create an ipc_perm token */
1032 struct ipc_perm perm
;
1033 perm
.uid
= ar
->ar_arg_pipc_perm
.pipc_uid
;
1034 perm
.gid
= ar
->ar_arg_pipc_perm
.pipc_gid
;
1035 perm
.cuid
= ar
->ar_arg_pipc_perm
.pipc_uid
;
1036 perm
.cgid
= ar
->ar_arg_pipc_perm
.pipc_gid
;
1037 perm
.mode
= ar
->ar_arg_pipc_perm
.pipc_mode
;
1040 tok
= au_to_ipc_perm(&perm
);
1041 kau_write(rec
, tok
);
1046 tok
= au_to_arg32(1, "sem", ar
->ar_arg_fd
);
1047 kau_write(rec
, tok
);
1051 if (ar
->ar_valid_arg
& ARG_TEXT
) {
1052 tok
= au_to_text(ar
->ar_arg_text
);
1053 kau_write(rec
, tok
);
1055 UPATH1_KPATH1_VNODE1_TOKENS
;
1059 case AUE_SYSCTL_NONADMIN
:
1060 if (ar
->ar_valid_arg
& (ARG_CTLNAME
| ARG_LEN
)) {
1061 for (ctr
= 0; ctr
< ar
->ar_arg_len
; ctr
++) {
1062 tok
= au_to_arg32(1, "name", ar
->ar_arg_ctlname
[ctr
]);
1063 kau_write(rec
, tok
);
1066 if (ar
->ar_valid_arg
& ARG_VALUE
) {
1067 tok
= au_to_arg32(5, "newval", ar
->ar_arg_value
);
1068 kau_write(rec
, tok
);
1070 if (ar
->ar_valid_arg
& ARG_TEXT
) {
1071 tok
= au_to_text(ar
->ar_arg_text
);
1072 kau_write(rec
, tok
);
1077 tok
= au_to_arg32(1, "new mask", ar
->ar_arg_mask
);
1078 kau_write(rec
, tok
);
1079 tok
= au_to_arg32(0, "prev mask", ar
->ar_retval
);
1080 kau_write(rec
, tok
);
1083 /************************
1084 * Mach system calls *
1085 ************************/
1086 case AUE_INITPROCESS
:
1089 case AUE_PIDFORTASK
:
1090 tok
= au_to_arg32(1, "port", (u_int32_t
)ar
->ar_arg_mach_port1
);
1091 kau_write(rec
, tok
);
1092 if (ar
->ar_valid_arg
& ARG_PID
) {
1093 tok
= au_to_arg32(2, "pid", (u_int32_t
)ar
->ar_arg_pid
);
1094 kau_write(rec
, tok
);
1098 case AUE_TASKFORPID
:
1099 tok
= au_to_arg32(1, "target port",
1100 (u_int32_t
)ar
->ar_arg_mach_port1
);
1101 kau_write(rec
, tok
);
1102 if (ar
->ar_valid_arg
& ARG_MACHPORT2
) {
1103 tok
= au_to_arg32(3, "task port",
1104 (u_int32_t
)ar
->ar_arg_mach_port2
);
1105 kau_write(rec
, tok
);
1107 PROCESS_PID_TOKENS(2);
1111 tok
= au_to_arg32(4, "priority",
1112 (u_int32_t
)ar
->ar_arg_value
);
1113 kau_write(rec
, tok
);
1114 UPATH1_KPATH1_VNODE1_TOKENS
;
1118 UPATH1_KPATH1_VNODE1_TOKENS
;
1122 tok
= au_to_arg32(3, "va", (u_int32_t
)ar
->ar_arg_addr
);
1123 kau_write(rec
, tok
);
1124 FD_KPATH1_VNODE1_TOKENS
;
1127 default: /* We shouldn't fall through to here. */
1128 printf("BSM conversion requested for unknown event %d\n",
1134 kau_write(rec
, subj_tok
);
1135 tok
= au_to_return32((char)ar
->ar_errno
, ar
->ar_retval
);
1136 kau_write(rec
, tok
); /* Every record gets a return token */
1138 kau_close(rec
, &ar
->ar_endtime
, ar
->ar_event
);
1145 * Verify that a record is a valid BSM record. This verification is
1146 * simple now, but may be expanded on sometime in the future.
1147 * Return 1 if the record is good, 0 otherwise.
1151 bsm_rec_verify(void* rec
)
1153 char c
= *(char *)rec
;
1155 * Check the token ID of the first token; it has to be a header
1158 /* XXXAUDIT There needs to be a token structure to map a token.
1159 * XXXAUDIT 'Shouldn't be simply looking at the first char.
1161 if ( (c
!= AU_HEADER_32_TOKEN
) &&
1162 (c
!= AU_HEADER_EX_32_TOKEN
) &&
1163 (c
!= AU_HEADER_64_TOKEN
) &&
1164 (c
!= AU_HEADER_EX_64_TOKEN
) ) {