2 * Copyright (c) 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@
24 #include <sys/systm.h>
25 #include <sys/types.h>
26 #include <sys/proc_internal.h>
27 #include <sys/vnode_internal.h>
28 #include <sys/fcntl.h>
29 #include <sys/filedesc.h>
32 #include <bsm/audit.h>
33 #include <bsm/audit_kernel.h>
34 #include <bsm/audit_kevents.h>
35 #include <bsm/audit_klib.h>
38 * Initialize the system call to audit event mapping table. This table
39 * must be kept in sync with the system call table. This table is meant to
40 * be directly accessed.
41 * XXX This should be improved, though, to make it independent of the syscall
42 * table (but we don't want to traverse a large table for every system call
43 * to find a match). Ultimately, it would be best to place the audit event
44 * number in the system call table.
46 au_event_t sys_au_event
[] = {
47 AUE_NULL
, /* 0 = indir */
48 AUE_EXIT
, /* 1 = exit */
49 AUE_FORK
, /* 2 = fork */
50 AUE_NULL
, /* 3 = read */
51 AUE_NULL
, /* 4 = write */
52 AUE_OPEN_RWTC
, /* 5 = open */
53 AUE_CLOSE
, /* 6 = close */
54 AUE_NULL
, /* 7 = wait4 */
55 AUE_O_CREAT
, /* 8 = old creat */
56 AUE_LINK
, /* 9 = link */
57 AUE_UNLINK
, /* 10 = unlink */
58 AUE_NULL
, /* 11 was obsolete execv */
59 AUE_CHDIR
, /* 12 = chdir */
60 AUE_FCHDIR
, /* 13 = fchdir */
61 AUE_MKNOD
, /* 14 = mknod */
62 AUE_CHMOD
, /* 15 = chmod */
63 AUE_CHOWN
, /* 16 = chown; now 3 args */
64 AUE_NULL
, /* 17 = old break */
66 AUE_GETFSSTAT
, /* 18 = getfsstat */
68 AUE_NULL
, /* 18 = ogetfsstat */
70 AUE_NULL
, /* 19 = old lseek */
71 AUE_NULL
, /* 20 = getpid */
72 AUE_NULL
, /* 21 was obsolete mount */
73 AUE_NULL
, /* 22 was obsolete umount */
74 AUE_SETUID
, /* 23 = setuid */
75 AUE_NULL
, /* 24 = getuid */
76 AUE_NULL
, /* 25 = geteuid */
77 AUE_PTRACE
, /* 26 = ptrace */
78 AUE_RECVMSG
, /* 27 = recvmsg */
79 AUE_SENDMSG
, /* 28 = sendmsg */
80 AUE_RECVFROM
, /* 29 = recvfrom */
81 AUE_ACCEPT
, /* 30 = accept */
82 AUE_NULL
, /* 31 = getpeername */
83 AUE_NULL
, /* 32 = getsockname */
84 AUE_ACCESS
, /* 33 = access */
85 AUE_CHFLAGS
, /* 34 = chflags */
86 AUE_FCHFLAGS
, /* 35 = fchflags */
87 AUE_NULL
, /* 36 = sync */
88 AUE_KILL
, /* 37 = kill */
89 AUE_O_STAT
, /* 38 = old stat */
90 AUE_NULL
, /* 39 = getppid */
91 AUE_O_LSTAT
, /* 40 = old lstat */
92 AUE_NULL
, /* 41 = dup */
93 AUE_PIPE
, /* 42 = pipe */
94 AUE_NULL
, /* 43 = getegid */
95 AUE_NULL
, /* 44 = profil */
96 AUE_KTRACE
, /* 45 = ktrace */
97 AUE_NULL
, /* 46 = sigaction */
98 AUE_NULL
, /* 47 = getgid */
99 AUE_NULL
, /* 48 = sigprocmask */
100 AUE_NULL
, /* 49 = getlogin */
101 AUE_SETLOGIN
, /* 50 = setlogin */
102 AUE_ACCT
, /* 51 = turn acct off/on */
103 AUE_NULL
, /* 52 = sigpending */
104 AUE_NULL
, /* 53 = sigaltstack */
105 AUE_IOCTL
, /* 54 = ioctl */
106 AUE_REBOOT
, /* 55 = reboot */
107 AUE_REVOKE
, /* 56 = revoke */
108 AUE_SYMLINK
, /* 57 = symlink */
109 AUE_READLINK
, /* 58 = readlink */
110 AUE_EXECVE
, /* 59 = execve */
111 AUE_UMASK
, /* 60 = umask */
112 AUE_CHROOT
, /* 61 = chroot */
113 AUE_O_FSTAT
, /* 62 = old fstat */
114 AUE_NULL
, /* 63 = used internally, reserved */
115 AUE_NULL
, /* 64 = old getpagesize */
116 AUE_NULL
, /* 65 = msync */
117 AUE_VFORK
, /* 66 = vfork */
118 AUE_NULL
, /* 67 was obsolete vread */
119 AUE_NULL
, /* 68 was obsolete vwrite */
120 AUE_NULL
, /* 69 = sbrk */
121 AUE_NULL
, /* 70 = sstk */
122 AUE_O_MMAP
, /* 71 = old mmap */
123 AUE_NULL
, /* 72 = old vadvise */
124 AUE_MUNMAP
, /* 73 = munmap */
125 AUE_MPROTECT
, /* 74 = mprotect */
126 AUE_NULL
, /* 75 = madvise */
127 AUE_NULL
, /* 76 was obsolete vhangup */
128 AUE_NULL
, /* 77 was obsolete vlimit */
129 AUE_NULL
, /* 78 = mincore */
130 AUE_NULL
, /* 79 = getgroups */
131 AUE_SETGROUPS
, /* 80 = setgroups */
132 AUE_NULL
, /* 81 = getpgrp */
133 AUE_SETPGRP
, /* 82 = setpgid */
134 AUE_NULL
, /* 83 = setitimer */
135 AUE_NULL
, /* 84 = old wait */
136 AUE_NULL
, /* 85 = swapon */
137 AUE_NULL
, /* 86 = getitimer */
138 AUE_NULL
, /* 87 = old gethostname */
139 AUE_O_SETHOSTNAME
, /* 88 = old sethostname */
140 AUE_NULL
, /* 89 getdtablesize */
141 AUE_NULL
, /* 90 = dup2 */
142 AUE_NULL
, /* 91 was obsolete getdopt */
143 AUE_FCNTL
, /* 92 = fcntl */
144 AUE_NULL
, /* 93 = select */
145 AUE_NULL
, /* 94 was obsolete setdopt */
146 AUE_NULL
, /* 95 = fsync */
147 AUE_SETPRIORITY
, /* 96 = setpriority */
148 AUE_SOCKET
, /* 97 = socket */
149 AUE_CONNECT
, /* 98 = connect */
150 AUE_NULL
, /* 99 = accept */
151 AUE_NULL
, /* 100 = getpriority */
152 AUE_O_SEND
, /* 101 = old send */
153 AUE_O_RECV
, /* 102 = old recv */
154 AUE_NULL
, /* 103 = sigreturn */
155 AUE_BIND
, /* 104 = bind */
156 AUE_SETSOCKOPT
, /* 105 = setsockopt */
157 AUE_NULL
, /* 106 = listen */
158 AUE_NULL
, /* 107 was vtimes */
159 AUE_NULL
, /* 108 = sigvec */
160 AUE_NULL
, /* 109 = sigblock */
161 AUE_NULL
, /* 110 = sigsetmask */
162 AUE_NULL
, /* 111 = sigpause */
163 AUE_NULL
, /* 112 = sigstack */
164 AUE_O_RECVMSG
, /* 113 = recvmsg */
165 AUE_O_SENDMSG
, /* 114 = sendmsg */
166 AUE_NULL
, /* 115 = old vtrace */
167 AUE_NULL
, /* 116 = gettimeofday */
168 AUE_NULL
, /* 117 = getrusage */
169 AUE_NULL
, /* 118 = getsockopt */
170 AUE_NULL
, /* 119 = old resuba */
171 AUE_NULL
, /* 120 = readv */
172 AUE_NULL
, /* 121 = writev */
173 AUE_SETTIMEOFDAY
, /* 122 = settimeofday */
174 AUE_FCHOWN
, /* 123 = fchown */
175 AUE_FCHMOD
, /* 124 = fchmod */
176 AUE_O_RECVFROM
, /* 125 = recvfrom */
177 AUE_NULL
, /* 126 = setreuid */
178 AUE_NULL
, /* 127 = setregid */
179 AUE_RENAME
, /* 128 = rename */
180 AUE_O_TRUNCATE
, /* 129 = old truncate */
181 AUE_O_FTRUNCATE
, /* 130 = old ftruncate */
182 AUE_FLOCK
, /* 131 = flock */
183 AUE_MKFIFO
, /* 132 = mkfifo */
184 AUE_SENDTO
, /* 133 = sendto */
185 AUE_SHUTDOWN
, /* 134 = shutdown */
186 AUE_SOCKETPAIR
, /* 135 = socketpair */
187 AUE_MKDIR
, /* 136 = mkdir */
188 AUE_RMDIR
, /* 137 = rmdir */
189 AUE_UTIMES
, /* 138 = utimes */
190 AUE_FUTIMES
, /* 139 = futimes */
191 AUE_ADJTIME
, /* 140 = adjtime */
192 AUE_NULL
, /* 141 = getpeername */
193 AUE_NULL
, /* 142 = old gethostid */
194 AUE_NULL
, /* 143 = old sethostid */
195 AUE_NULL
, /* 144 = old getrlimit */
196 AUE_O_SETRLIMIT
, /* 145 = old setrlimit */
197 AUE_O_KILLPG
, /* 146 = old killpg */
198 AUE_SETSID
, /* 147 = setsid */
199 AUE_NULL
, /* 148 was setquota */
200 AUE_NULL
, /* 149 was qquota */
201 AUE_NULL
, /* 150 = getsockname */
202 AUE_NULL
, /* 151 = getpgid */
203 AUE_SETPRIVEXEC
, /* 152 = setprivexec */
204 AUE_NULL
, /* 153 = pread */
205 AUE_NULL
, /* 154 = pwrite */
206 AUE_NFSSVC
, /* 155 = nfs_svc */
207 AUE_O_GETDIRENTRIES
, /* 156 = old getdirentries */
208 AUE_STATFS
, /* 157 = statfs */
209 AUE_FSTATFS
, /* 158 = fstatfs */
210 AUE_UNMOUNT
, /* 159 = unmount */
211 AUE_NULL
, /* 160 was async_daemon */
212 AUE_GETFH
, /* 161 = get file handle */
213 AUE_NULL
, /* 162 = getdomainname */
214 AUE_O_SETDOMAINNAME
, /* 163 = setdomainname */
217 AUE_QUOTACTL
, /* 165 = quotactl */
219 AUE_NULL
, /* 165 = not configured */
221 AUE_NULL
, /* 166 was exportfs */
222 AUE_MOUNT
, /* 167 = mount */
223 AUE_NULL
, /* 168 was ustat */
224 AUE_NULL
, /* 169 = nosys */
225 AUE_NULL
, /* 170 was table */
226 AUE_NULL
, /* 171 = old wait3 */
227 AUE_NULL
, /* 172 was rpause */
228 AUE_NULL
, /* 173 = nosys */
229 AUE_NULL
, /* 174 was getdents */
230 AUE_NULL
, /* 175 was gc_control */
231 AUE_NULL
, /* 176 = add_profil */
236 AUE_SETGID
, /* 181 */
237 AUE_SETEGID
, /* 182 */
238 AUE_SETEUID
, /* 183 */
239 AUE_NULL
, /* 184 = nosys */
240 AUE_NULL
, /* 185 = nosys */
241 AUE_NULL
, /* 186 = nosys */
242 AUE_NULL
, /* 187 = nosys */
243 AUE_STAT
, /* 188 = stat */
244 AUE_FSTAT
, /* 189 = fstat */
245 AUE_LSTAT
, /* 190 = lstat */
246 AUE_PATHCONF
, /* 191 = pathconf */
247 AUE_FPATHCONF
, /* 192 = fpathconf */
249 AUE_GETFSSTAT
, /* 193 = getfsstat */
251 AUE_NULL
, /* 193 is unused */
253 AUE_NULL
, /* 194 = getrlimit */
254 AUE_SETRLIMIT
, /* 195 = setrlimit */
255 AUE_GETDIRENTRIES
, /* 196 = getdirentries */
256 AUE_MMAP
, /* 197 = mmap */
257 AUE_NULL
, /* 198 = __syscall */
258 AUE_NULL
, /* 199 = lseek */
259 AUE_TRUNCATE
, /* 200 = truncate */
260 AUE_FTRUNCATE
, /* 201 = ftruncate */
261 AUE_SYSCTL
, /* 202 = __sysctl */
262 AUE_MLOCK
, /* 203 = mlock */
263 AUE_MUNLOCK
, /* 204 = munlock */
264 AUE_UNDELETE
, /* 205 = undelete */
265 AUE_NULL
, /* 206 = ATsocket */
266 AUE_NULL
, /* 207 = ATgetmsg*/
267 AUE_NULL
, /* 208 = ATputmsg*/
268 AUE_NULL
, /* 209 = ATPsndreq*/
269 AUE_NULL
, /* 210 = ATPsndrsp*/
270 AUE_NULL
, /* 211 = ATPgetreq*/
271 AUE_NULL
, /* 212 = ATPgetrsp*/
272 AUE_NULL
, /* 213 = Reserved for AppleTalk */
273 AUE_NULL
, /* 214 = Reserved for AppleTalk */
274 AUE_NULL
, /* 215 = Reserved for AppleTalk */
276 AUE_NULL
, /* 216 = HFS make complex file call (multipel forks */
277 AUE_NULL
, /* 217 = HFS statv extended stat call for HFS */
278 AUE_NULL
, /* 218 = HFS lstatv extended lstat call for HFS */
279 AUE_NULL
, /* 219 = HFS fstatv extended fstat call for HFS */
280 AUE_GETATTRLIST
,/* 220 = HFS getarrtlist get attribute list cal */
281 AUE_SETATTRLIST
,/* 221 = HFS setattrlist set attribute list */
282 AUE_GETDIRENTRIESATTR
,/* 222 = HFS getdirentriesattr get directory attributes */
283 AUE_EXCHANGEDATA
,/* 223 = HFS exchangedata exchange file contents */
284 AUE_CHECKUSERACCESS
,/* 224 = HFS checkuseraccess check access to file */
285 AUE_SEARCHFS
, /* 225 = HFS searchfs to implement catalog searching */
286 AUE_DELETE
, /* 226 = private delete (Carbon semantics) */
287 AUE_NULL
, /* 227 = copyfile - orignally for AFP */
302 AUE_NULL
, /* 242 = fsctl */
307 AUE_NULL
, /* 247 = nfsclnt*/
308 AUE_NULL
, /* 248 = fhopen */
310 AUE_MINHERIT
, /* 250 = minherit */
311 AUE_NULL
, /* 251 = semsys */
312 AUE_NULL
, /* 252 = msgsys */
313 AUE_NULL
, /* 253 = shmsys */
314 AUE_SEMCTL
, /* 254 = semctl */
315 AUE_SEMGET
, /* 255 = semget */
316 AUE_SEMOP
, /* 256 = semop */
317 AUE_NULL
, /* 257 = semconfig */
318 AUE_MSGCTL
, /* 258 = msgctl */
319 AUE_MSGGET
, /* 259 = msgget */
320 AUE_MSGSND
, /* 260 = msgsnd */
321 AUE_MSGRCV
, /* 261 = msgrcv */
322 AUE_SHMAT
, /* 262 = shmat */
323 AUE_SHMCTL
, /* 263 = shmctl */
324 AUE_SHMDT
, /* 264 = shmdt */
325 AUE_SHMGET
, /* 265 = shmget */
326 AUE_SHMOPEN
, /* 266 = shm_open */
327 AUE_SHMUNLINK
, /* 267 = shm_unlink */
328 AUE_SEMOPEN
, /* 268 = sem_open */
329 AUE_SEMCLOSE
, /* 269 = sem_close */
330 AUE_SEMUNLINK
, /* 270 = sem_unlink */
331 AUE_NULL
, /* 271 = sem_wait */
332 AUE_NULL
, /* 272 = sem_trywait */
333 AUE_NULL
, /* 273 = sem_post */
334 AUE_NULL
, /* 274 = sem_getvalue */
335 AUE_NULL
, /* 275 = sem_init */
336 AUE_NULL
, /* 276 = sem_destroy */
356 AUE_LOADSHFILE
, /* 296 = load_shared_file */
357 AUE_RESETSHFILE
, /* 297 = reset_shared_file */
358 AUE_NEWSYSTEMSHREG
, /* 298 = new_system_shared_regions */
370 AUE_NULL
, /* 310 = getsid */
384 AUE_NULL
, /* 324 = mlockall*/
385 AUE_NULL
, /* 325 = munlockall*/
387 AUE_NULL
, /* 327 = issetugid */
395 AUE_NULL
, /* 335 = utrace */
411 AUE_AUDITON
, /* 351 */
413 AUE_GETAUID
, /* 353 */
414 AUE_SETAUID
, /* 354 */
415 AUE_GETAUDIT
, /* 355 */
416 AUE_SETAUDIT
, /* 356 */
417 AUE_GETAUDIT_ADDR
, /* 357 */
418 AUE_SETAUDIT_ADDR
, /* 358 */
419 AUE_AUDITCTL
, /* 359 */
422 AUE_NULL
, /* 362 = kqueue */
423 AUE_NULL
, /* 363 = kevent */
424 AUE_LCHOWN
, /* 364 = lchown */
431 int nsys_au_event
= sizeof(sys_au_event
) / sizeof(sys_au_event
[0]);
434 * Hash table functions for the audit event number to event class mask mapping.
437 #define EVCLASSMAP_HASH_TABLE_SIZE 251
438 struct evclass_elem
{
441 LIST_ENTRY(evclass_elem
) entry
;
443 struct evclass_list
{
444 LIST_HEAD(, evclass_elem
) head
;
447 struct evclass_list evclass_hash
[EVCLASSMAP_HASH_TABLE_SIZE
];
449 au_class_t
au_event_class(au_event_t event
)
452 struct evclass_list
*evcl
;
453 struct evclass_elem
*evc
;
455 evcl
= &evclass_hash
[event
% EVCLASSMAP_HASH_TABLE_SIZE
];
457 /* If an entry at our hash location matches the event, just return */
458 LIST_FOREACH(evc
, &evcl
->head
, entry
) {
459 if (evc
->event
== event
)
466 * Insert a event to class mapping. If the event already exists in the
467 * mapping, then replace the mapping with the new one.
468 * XXX There is currently no constraints placed on the number of mappings.
469 * May want to either limit to a number, or in terms of memory usage.
471 void au_evclassmap_insert(au_event_t event
, au_class_t
class)
473 struct evclass_list
*evcl
;
474 struct evclass_elem
*evc
;
476 evcl
= &evclass_hash
[event
% EVCLASSMAP_HASH_TABLE_SIZE
];
478 LIST_FOREACH(evc
, &evcl
->head
, entry
) {
479 if (evc
->event
== event
) {
484 kmem_alloc(kernel_map
, (vm_offset_t
*)&evc
, sizeof(*evc
));
490 LIST_INSERT_HEAD(&evcl
->head
, evc
, entry
);
493 void au_evclassmap_init()
496 for (i
= 0; i
< EVCLASSMAP_HASH_TABLE_SIZE
; i
++) {
497 LIST_INIT(&evclass_hash
[i
].head
);
500 /* Set up the initial event to class mapping for system calls. */
501 for (i
= 0; i
< nsys_au_event
; i
++) {
502 if (sys_au_event
[i
] != AUE_NULL
) {
503 au_evclassmap_insert(sys_au_event
[i
], AU_NULL
);
506 /* Add the Mach system call events */
507 au_evclassmap_insert(AUE_TASKFORPID
, AU_NULL
);
508 au_evclassmap_insert(AUE_PIDFORTASK
, AU_NULL
);
509 au_evclassmap_insert(AUE_SWAPON
, AU_NULL
);
510 au_evclassmap_insert(AUE_SWAPOFF
, AU_NULL
);
511 au_evclassmap_insert(AUE_MAPFD
, AU_NULL
);
512 au_evclassmap_insert(AUE_INITPROCESS
, AU_NULL
);
514 /* Add the specific open events to the mapping. */
515 au_evclassmap_insert(AUE_OPEN_R
, AU_FREAD
);
516 au_evclassmap_insert(AUE_OPEN_RC
, AU_FREAD
|AU_FCREATE
);
517 au_evclassmap_insert(AUE_OPEN_RTC
, AU_FREAD
|AU_FCREATE
|AU_FDELETE
);
518 au_evclassmap_insert(AUE_OPEN_RT
, AU_FREAD
|AU_FDELETE
);
519 au_evclassmap_insert(AUE_OPEN_RW
, AU_FREAD
|AU_FWRITE
);
520 au_evclassmap_insert(AUE_OPEN_RWC
, AU_FREAD
|AU_FWRITE
|AU_FCREATE
);
521 au_evclassmap_insert(AUE_OPEN_RWTC
, AU_FREAD
|AU_FWRITE
|AU_FCREATE
|AU_FDELETE
);
522 au_evclassmap_insert(AUE_OPEN_RWT
, AU_FREAD
|AU_FWRITE
|AU_FDELETE
);
523 au_evclassmap_insert(AUE_OPEN_W
, AU_FWRITE
);
524 au_evclassmap_insert(AUE_OPEN_WC
, AU_FWRITE
|AU_FCREATE
);
525 au_evclassmap_insert(AUE_OPEN_WTC
, AU_FWRITE
|AU_FCREATE
|AU_FDELETE
);
526 au_evclassmap_insert(AUE_OPEN_WT
, AU_FWRITE
|AU_FDELETE
);
530 * Check whether an event is aditable by comparing the mask of classes this
531 * event is part of against the given mask.
533 int au_preselect(au_event_t event
, au_mask_t
*mask_p
, int sorf
)
535 au_class_t effmask
= 0;
541 ae_class
= au_event_class(event
);
543 * Perform the actual check of the masks against the event.
545 if(sorf
& AU_PRS_SUCCESS
) {
546 effmask
|= (mask_p
->am_success
& ae_class
);
549 if(sorf
& AU_PRS_FAILURE
) {
550 effmask
|= (mask_p
->am_failure
& ae_class
);
560 * Convert sysctl names and present arguments to events
562 au_event_t
ctlname_to_sysctlevent(int name
[], uint64_t valid_arg
) {
564 /* can't parse it - so return the worst case */
565 if ((valid_arg
& (ARG_CTLNAME
| ARG_LEN
)) !=
566 (ARG_CTLNAME
| ARG_LEN
))
570 /* non-admin "lookups" treat them special */
580 case KERN_JOB_CONTROL
:
584 case KERN_SHREG_PRIVATIZABLE
:
585 return AUE_SYSCTL_NONADMIN
;
587 /* only treat the sets as admin */
591 case KERN_MAXPROCPERUID
:
592 case KERN_MAXFILESPERPROC
:
595 case KERN_AIOPROCMAX
:
596 case KERN_AIOTHREADS
:
598 case KERN_SUGID_COREDUMP
:
599 return (valid_arg
& ARG_VALUE
) ?
600 AUE_SYSCTL
: AUE_SYSCTL_NONADMIN
;
609 * Convert an open flags specifier into a specific type of open event for
612 au_event_t
flags_and_error_to_openevent(int oflags
, int error
) {
615 /* Need to check only those flags we care about. */
616 oflags
= oflags
& (O_RDONLY
| O_CREAT
| O_TRUNC
| O_RDWR
| O_WRONLY
);
618 /* These checks determine what flags are on with the condition
619 * that ONLY that combination is on, and no other flags are on.
625 case (O_RDONLY
| O_CREAT
):
626 aevent
= AUE_OPEN_RC
;
628 case (O_RDONLY
| O_CREAT
| O_TRUNC
):
629 aevent
= AUE_OPEN_RTC
;
631 case (O_RDONLY
| O_TRUNC
):
632 aevent
= AUE_OPEN_RT
;
635 aevent
= AUE_OPEN_RW
;
637 case (O_RDWR
| O_CREAT
):
638 aevent
= AUE_OPEN_RWC
;
640 case (O_RDWR
| O_CREAT
| O_TRUNC
):
641 aevent
= AUE_OPEN_RWTC
;
643 case (O_RDWR
| O_TRUNC
):
644 aevent
= AUE_OPEN_RWT
;
649 case (O_WRONLY
| O_CREAT
):
650 aevent
= AUE_OPEN_WC
;
652 case (O_WRONLY
| O_CREAT
| O_TRUNC
):
653 aevent
= AUE_OPEN_WTC
;
655 case (O_WRONLY
| O_TRUNC
):
656 aevent
= AUE_OPEN_WT
;
664 * Convert chatty errors to better matching events.
665 * Failures to find a file are really just attribute
666 * events - so recast them as such.
681 /* Convert a MSGCTL command to a specific event. */
682 au_event_t
msgctl_to_event(int cmd
)
686 return AUE_MSGCTL_RMID
;
688 return AUE_MSGCTL_SET
;
690 return AUE_MSGCTL_STAT
;
693 /* We will audit a bad command */
697 /* Convert a SEMCTL command to a specific event. */
698 au_event_t
semctl_to_event(int cmd
)
702 return AUE_SEMCTL_GETALL
;
704 return AUE_SEMCTL_GETNCNT
;
706 return AUE_SEMCTL_GETPID
;
708 return AUE_SEMCTL_GETVAL
;
710 return AUE_SEMCTL_GETZCNT
;
712 return AUE_SEMCTL_RMID
;
714 return AUE_SEMCTL_SET
;
716 return AUE_SEMCTL_SETALL
;
718 return AUE_SEMCTL_SETVAL
;
720 return AUE_SEMCTL_STAT
;
723 /* We will audit a bad command */
727 /* Convert a command for the auditon() system call to a audit event. */
728 int auditon_command_event(int cmd
)
732 return AUE_AUDITON_GPOLICY
;
735 return AUE_AUDITON_SPOLICY
;
738 return AUE_AUDITON_GETKMASK
;
741 return AUE_AUDITON_SETKMASK
;
744 return AUE_AUDITON_GQCTRL
;
747 return AUE_AUDITON_SQCTRL
;
750 return AUE_AUDITON_GETCWD
;
753 return AUE_AUDITON_GETCAR
;
756 return AUE_AUDITON_GETSTAT
;
759 return AUE_AUDITON_SETSTAT
;
762 return AUE_AUDITON_SETUMASK
;
765 return AUE_AUDITON_SETSMASK
;
768 return AUE_AUDITON_GETCOND
;
771 return AUE_AUDITON_SETCOND
;
774 return AUE_AUDITON_GETCLASS
;
777 return AUE_AUDITON_SETCLASS
;
783 case A_GETPINFO_ADDR
:
787 return AUE_AUDITON
; /* No special record */
793 * Create a canonical path from given path by prefixing either the
794 * root directory, or the current working directory.
795 * If the process working directory is NULL, we could use 'rootvnode'
796 * to obtain the root directoty, but this results in a volfs name
797 * written to the audit log. So we will leave the filename starting
798 * with '/' in the audit log in this case.
800 int canon_path(struct proc
*p
, char *path
, char *cpath
)
805 struct filedesc
*fdp
;
810 if (*(path
) == '/') {
811 while (*(bufp
) == '/')
812 bufp
++; /* skip leading '/'s */
813 /* If no process root, or it is the same as the system root,
814 * audit the path as passed in with a single '/'.
816 if ((fdp
->fd_rdir
== NULL
) ||
817 (fdp
->fd_rdir
== rootvnode
)) {
819 bufp
--; /* restore one '/' */
821 vnp
= fdp
->fd_rdir
; /* use process root */
824 vnp
= fdp
->fd_cdir
; /* prepend the current dir */
829 ret
= vn_getpath(vnp
, cpath
, &len
);
834 if (len
< MAXPATHLEN
)
836 strncpy(cpath
+ len
, bufp
, MAXPATHLEN
- len
);
838 strncpy(cpath
, bufp
, MAXPATHLEN
);