1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <sys/systm.h>
24#include <sys/types.h>
25#include <sys/proc_internal.h>
26#include <sys/vnode_internal.h>
27#include <sys/fcntl.h>
28#include <sys/filedesc.h>
29#include <sys/sem.h>
30
31#include <bsm/audit.h>
32#include <bsm/audit_kernel.h>
33#include <bsm/audit_kevents.h>
34#include <bsm/audit_klib.h>
35
36
37
38
39
40
41
42
43
44
45au_event_t sys_au_event[] = {
46 AUE_NULL,
47 AUE_EXIT,
48 AUE_FORK,
49 AUE_NULL,
50 AUE_NULL,
51 AUE_OPEN_RWTC,
52 AUE_CLOSE,
53 AUE_NULL,
54 AUE_O_CREAT,
55 AUE_LINK,
56 AUE_UNLINK,
57 AUE_NULL,
58 AUE_CHDIR,
59 AUE_FCHDIR,
60 AUE_MKNOD,
61 AUE_CHMOD,
62 AUE_CHOWN,
63 AUE_NULL,
64#if COMPAT_GETFSSTAT
65 AUE_GETFSSTAT,
66#else
67 AUE_NULL,
68#endif
69 AUE_NULL,
70 AUE_NULL,
71 AUE_NULL,
72 AUE_NULL,
73 AUE_SETUID,
74 AUE_NULL,
75 AUE_NULL,
76 AUE_PTRACE,
77 AUE_RECVMSG,
78 AUE_SENDMSG,
79 AUE_RECVFROM,
80 AUE_ACCEPT,
81 AUE_NULL,
82 AUE_NULL,
83 AUE_ACCESS,
84 AUE_CHFLAGS,
85 AUE_FCHFLAGS,
86 AUE_NULL,
87 AUE_KILL,
88 AUE_O_STAT,
89 AUE_NULL,
90 AUE_O_LSTAT,
91 AUE_NULL,
92 AUE_PIPE,
93 AUE_NULL,
94 AUE_NULL,
95 AUE_KTRACE,
96 AUE_NULL,
97 AUE_NULL,
98 AUE_NULL,
99 AUE_NULL,
100 AUE_SETLOGIN,
101 AUE_ACCT,
102 AUE_NULL,
103 AUE_NULL,
104 AUE_IOCTL,
105 AUE_REBOOT,
106 AUE_REVOKE,
107 AUE_SYMLINK,
108 AUE_READLINK,
109 AUE_EXECVE,
110 AUE_UMASK,
111 AUE_CHROOT,
112 AUE_O_FSTAT,
113 AUE_NULL,
114 AUE_NULL,
115 AUE_NULL,
116 AUE_VFORK,
117 AUE_NULL,
118 AUE_NULL,
119 AUE_NULL,
120 AUE_NULL,
121 AUE_O_MMAP,
122 AUE_NULL,
123 AUE_MUNMAP,
124 AUE_MPROTECT,
125 AUE_NULL,
126 AUE_NULL,
127 AUE_NULL,
128 AUE_NULL,
129 AUE_NULL,
130 AUE_SETGROUPS,
131 AUE_NULL,
132 AUE_SETPGRP,
133 AUE_NULL,
134 AUE_NULL,
135 AUE_NULL,
136 AUE_NULL,
137 AUE_NULL,
138 AUE_O_SETHOSTNAME,
139 AUE_NULL,
140 AUE_NULL,
141 AUE_NULL,
142 AUE_FCNTL,
143 AUE_NULL,
144 AUE_NULL,
145 AUE_NULL,
146 AUE_SETPRIORITY,
147 AUE_SOCKET,
148 AUE_CONNECT,
149 AUE_NULL,
150 AUE_NULL,
151 AUE_O_SEND,
152 AUE_O_RECV,
153 AUE_NULL,
154 AUE_BIND,
155 AUE_SETSOCKOPT,
156 AUE_NULL,
157 AUE_NULL,
158 AUE_NULL,
159 AUE_NULL,
160 AUE_NULL,
161 AUE_NULL,
162 AUE_NULL,
163 AUE_O_RECVMSG,
164 AUE_O_SENDMSG,
165 AUE_NULL,
166 AUE_NULL,
167 AUE_NULL,
168 AUE_NULL,
169 AUE_NULL,
170 AUE_NULL,
171 AUE_NULL,
172 AUE_SETTIMEOFDAY,
173 AUE_FCHOWN,
174 AUE_FCHMOD,
175 AUE_O_RECVFROM,
176 AUE_NULL,
177 AUE_NULL,
178 AUE_RENAME,
179 AUE_O_TRUNCATE,
180 AUE_O_FTRUNCATE,
181 AUE_FLOCK,
182 AUE_MKFIFO,
183 AUE_SENDTO,
184 AUE_SHUTDOWN,
185 AUE_SOCKETPAIR,
186 AUE_MKDIR,
187 AUE_RMDIR,
188 AUE_UTIMES,
189 AUE_FUTIMES,
190 AUE_ADJTIME,
191 AUE_NULL,
192 AUE_NULL,
193 AUE_NULL,
194 AUE_NULL,
195 AUE_O_SETRLIMIT,
196 AUE_O_KILLPG,
197 AUE_SETSID,
198 AUE_NULL,
199 AUE_NULL,
200 AUE_NULL,
201 AUE_NULL,
202 AUE_SETPRIVEXEC,
203 AUE_NULL,
204 AUE_NULL,
205 AUE_NFSSVC,
206 AUE_O_GETDIRENTRIES,
207 AUE_STATFS,
208 AUE_FSTATFS,
209 AUE_UNMOUNT,
210 AUE_NULL,
211 AUE_GETFH,
212 AUE_NULL,
213 AUE_O_SETDOMAINNAME,
214 AUE_NULL,
215#if QUOTA
216 AUE_QUOTACTL,
217#else
218 AUE_NULL,
219#endif
220 AUE_NULL,
221 AUE_MOUNT,
222 AUE_NULL,
223 AUE_NULL,
224 AUE_NULL,
225 AUE_NULL,
226 AUE_NULL,
227 AUE_NULL,
228 AUE_NULL,
229 AUE_NULL,
230 AUE_NULL,
231 AUE_NULL,
232 AUE_NULL,
233 AUE_NULL,
234 AUE_NULL,
235 AUE_SETGID,
236 AUE_SETEGID,
237 AUE_SETEUID,
238 AUE_NULL,
239 AUE_NULL,
240 AUE_NULL,
241 AUE_NULL,
242 AUE_STAT,
243 AUE_FSTAT,
244 AUE_LSTAT,
245 AUE_PATHCONF,
246 AUE_FPATHCONF,
247#if COMPAT_GETFSSTAT
248 AUE_GETFSSTAT,
249#else
250 AUE_NULL,
251#endif
252 AUE_NULL,
253 AUE_SETRLIMIT,
254 AUE_GETDIRENTRIES,
255 AUE_MMAP,
256 AUE_NULL,
257 AUE_NULL,
258 AUE_TRUNCATE,
259 AUE_FTRUNCATE,
260 AUE_SYSCTL,
261 AUE_MLOCK,
262 AUE_MUNLOCK,
263 AUE_UNDELETE,
264 AUE_NULL,
265 AUE_NULL,
266 AUE_NULL,
267 AUE_NULL,
268 AUE_NULL,
269 AUE_NULL,
270 AUE_NULL,
271 AUE_NULL,
272 AUE_NULL,
273 AUE_NULL,
274
275 AUE_NULL,
276 AUE_NULL,
277 AUE_NULL,
278 AUE_NULL,
279 AUE_GETATTRLIST,
280 AUE_SETATTRLIST,
281 AUE_GETDIRENTRIESATTR,
282 AUE_EXCHANGEDATA,
283 AUE_CHECKUSERACCESS,
284 AUE_SEARCHFS,
285 AUE_DELETE,
286 AUE_NULL,
287 AUE_NULL,
288 AUE_NULL,
289 AUE_NULL,
290 AUE_NULL,
291 AUE_NULL,
292 AUE_NULL,
293 AUE_NULL,
294 AUE_NULL,
295 AUE_NULL,
296 AUE_NULL,
297 AUE_NULL,
298 AUE_NULL,
299 AUE_NULL,
300 AUE_NULL,
301 AUE_NULL,
302 AUE_NULL,
303 AUE_NULL,
304 AUE_NULL,
305 AUE_NULL,
306 AUE_NULL,
307 AUE_NULL,
308 AUE_NULL,
309 AUE_MINHERIT,
310 AUE_NULL,
311 AUE_NULL,
312 AUE_NULL,
313 AUE_SEMCTL,
314 AUE_SEMGET,
315 AUE_SEMOP,
316 AUE_NULL,
317 AUE_MSGCTL,
318 AUE_MSGGET,
319 AUE_MSGSND,
320 AUE_MSGRCV,
321 AUE_SHMAT,
322 AUE_SHMCTL,
323 AUE_SHMDT,
324 AUE_SHMGET,
325 AUE_SHMOPEN,
326 AUE_SHMUNLINK,
327 AUE_SEMOPEN,
328 AUE_SEMCLOSE,
329 AUE_SEMUNLINK,
330 AUE_NULL,
331 AUE_NULL,
332 AUE_NULL,
333 AUE_NULL,
334 AUE_NULL,
335 AUE_NULL,
336 AUE_NULL,
337 AUE_NULL,
338 AUE_NULL,
339 AUE_NULL,
340 AUE_NULL,
341 AUE_NULL,
342 AUE_NULL,
343 AUE_NULL,
344 AUE_NULL,
345 AUE_NULL,
346 AUE_NULL,
347 AUE_NULL,
348 AUE_NULL,
349 AUE_NULL,
350 AUE_NULL,
351 AUE_NULL,
352 AUE_NULL,
353 AUE_NULL,
354 AUE_NULL,
355 AUE_LOADSHFILE,
356 AUE_RESETSHFILE,
357 AUE_NEWSYSTEMSHREG,
358 AUE_NULL,
359 AUE_NULL,
360 AUE_NULL,
361 AUE_NULL,
362 AUE_NULL,
363 AUE_NULL,
364 AUE_NULL,
365 AUE_NULL,
366 AUE_NULL,
367 AUE_NULL,
368 AUE_NULL,
369 AUE_NULL,
370 AUE_NULL,
371 AUE_NULL,
372 AUE_NULL,
373 AUE_NULL,
374 AUE_NULL,
375 AUE_NULL,
376 AUE_NULL,
377 AUE_NULL,
378 AUE_NULL,
379 AUE_NULL,
380 AUE_NULL,
381 AUE_NULL,
382 AUE_NULL,
383 AUE_NULL,
384 AUE_NULL,
385 AUE_NULL,
386 AUE_NULL,
387 AUE_NULL,
388 AUE_NULL,
389 AUE_NULL,
390 AUE_NULL,
391 AUE_NULL,
392 AUE_NULL,
393 AUE_NULL,
394 AUE_NULL,
395 AUE_NULL,
396 AUE_NULL,
397 AUE_NULL,
398 AUE_NULL,
399 AUE_NULL,
400 AUE_NULL,
401 AUE_NULL,
402 AUE_NULL,
403 AUE_NULL,
404 AUE_NULL,
405 AUE_NULL,
406 AUE_NULL,
407 AUE_NULL,
408 AUE_NULL,
409 AUE_AUDIT,
410 AUE_AUDITON,
411 AUE_NULL,
412 AUE_GETAUID,
413 AUE_SETAUID,
414 AUE_GETAUDIT,
415 AUE_SETAUDIT,
416 AUE_GETAUDIT_ADDR,
417 AUE_SETAUDIT_ADDR,
418 AUE_AUDITCTL,
419 AUE_NULL,
420 AUE_NULL,
421 AUE_NULL,
422 AUE_NULL,
423 AUE_LCHOWN,
424 AUE_NULL,
425 AUE_NULL,
426 AUE_NULL,
427 AUE_NULL,
428 AUE_NULL
429};
430int nsys_au_event = sizeof(sys_au_event) / sizeof(sys_au_event[0]);
431
432
433
434
435
436#define EVCLASSMAP_HASH_TABLE_SIZE 251
437struct evclass_elem {
438 au_event_t event;
439 au_class_t class;
440 LIST_ENTRY(evclass_elem) entry;
441};
442struct evclass_list {
443 LIST_HEAD(, evclass_elem) head;
444};
445
446struct evclass_list evclass_hash[EVCLASSMAP_HASH_TABLE_SIZE];
447
448au_class_t au_event_class(au_event_t event)
449{
450
451 struct evclass_list *evcl;
452 struct evclass_elem *evc;
453
454 evcl = &evclass_hash[event % EVCLASSMAP_HASH_TABLE_SIZE];
455
456
457 LIST_FOREACH(evc, &evcl->head, entry) {
458 if (evc->event == event)
459 return (evc->class);
460 }
461 return (AU_NULL);
462}
463
464
465
466
467
468
469
470void au_evclassmap_insert(au_event_t event, au_class_t class)
471{
472 struct evclass_list *evcl;
473 struct evclass_elem *evc;
474
475 evcl = &evclass_hash[event % EVCLASSMAP_HASH_TABLE_SIZE];
476
477 LIST_FOREACH(evc, &evcl->head, entry) {
478 if (evc->event == event) {
479 evc->class = class;
480 return;
481 }
482 }
483 kmem_alloc(kernel_map, (vm_offset_t *)&evc, sizeof(*evc));
484 if (evc == NULL) {
485 return;
486 }
487 evc->event = event;
488 evc->class = class;
489 LIST_INSERT_HEAD(&evcl->head, evc, entry);
490}
491
492void au_evclassmap_init()
493{
494 int i;
495 for (i = 0; i < EVCLASSMAP_HASH_TABLE_SIZE; i++) {
496 LIST_INIT(&evclass_hash[i].head);
497 }
498
499
500 for (i = 0; i < nsys_au_event; i++) {
501 if (sys_au_event[i] != AUE_NULL) {
502 au_evclassmap_insert(sys_au_event[i], AU_NULL);
503 }
504 }
505
506 au_evclassmap_insert(AUE_TASKFORPID, AU_NULL);
507 au_evclassmap_insert(AUE_PIDFORTASK, AU_NULL);
508 au_evclassmap_insert(AUE_SWAPON, AU_NULL);
509 au_evclassmap_insert(AUE_SWAPOFF, AU_NULL);
510 au_evclassmap_insert(AUE_MAPFD, AU_NULL);
511 au_evclassmap_insert(AUE_INITPROCESS, AU_NULL);
512
513
514 au_evclassmap_insert(AUE_OPEN_R, AU_FREAD);
515 au_evclassmap_insert(AUE_OPEN_RC, AU_FREAD|AU_FCREATE);
516 au_evclassmap_insert(AUE_OPEN_RTC, AU_FREAD|AU_FCREATE|AU_FDELETE);
517 au_evclassmap_insert(AUE_OPEN_RT, AU_FREAD|AU_FDELETE);
518 au_evclassmap_insert(AUE_OPEN_RW, AU_FREAD|AU_FWRITE);
519 au_evclassmap_insert(AUE_OPEN_RWC, AU_FREAD|AU_FWRITE|AU_FCREATE);
520 au_evclassmap_insert(AUE_OPEN_RWTC, AU_FREAD|AU_FWRITE|AU_FCREATE|AU_FDELETE);
521 au_evclassmap_insert(AUE_OPEN_RWT, AU_FREAD|AU_FWRITE|AU_FDELETE);
522 au_evclassmap_insert(AUE_OPEN_W, AU_FWRITE);
523 au_evclassmap_insert(AUE_OPEN_WC, AU_FWRITE|AU_FCREATE);
524 au_evclassmap_insert(AUE_OPEN_WTC, AU_FWRITE|AU_FCREATE|AU_FDELETE);
525 au_evclassmap_insert(AUE_OPEN_WT, AU_FWRITE|AU_FDELETE);
526}
527
528
529
530
531
532int au_preselect(au_event_t event, au_mask_t *mask_p, int sorf)
533{
534 au_class_t effmask = 0;
535 au_class_t ae_class;
536
537 if(mask_p == NULL)
538 return (-1);
539
540 ae_class = au_event_class(event);
541
542
543
544 if(sorf & AU_PRS_SUCCESS) {
545 effmask |= (mask_p->am_success & ae_class);
546 }
547
548 if(sorf & AU_PRS_FAILURE) {
549 effmask |= (mask_p->am_failure & ae_class);
550 }
551
552 if(effmask)
553 return (1);
554 else
555 return (0);
556}
557
558
559
560
561au_event_t ctlname_to_sysctlevent(int name[], uint64_t valid_arg) {
562
563
564 if ((valid_arg & (ARG_CTLNAME | ARG_LEN)) !=
565 (ARG_CTLNAME | ARG_LEN))
566 return AUE_SYSCTL;
567
568 switch (name[0]) {
569
570 case KERN_OSTYPE:
571 case KERN_OSRELEASE:
572 case KERN_OSREV:
573 case KERN_VERSION:
574 case KERN_ARGMAX:
575 case KERN_CLOCKRATE:
576 case KERN_BOOTTIME:
577 case KERN_POSIX1:
578 case KERN_NGROUPS:
579 case KERN_JOB_CONTROL:
580 case KERN_SAVED_IDS:
581 case KERN_NETBOOT:
582 case KERN_SYMFILE:
583 case KERN_SHREG_PRIVATIZABLE:
584 return AUE_SYSCTL_NONADMIN;
585
586
587 case KERN_MAXVNODES:
588 case KERN_MAXPROC:
589 case KERN_MAXFILES:
590 case KERN_MAXPROCPERUID:
591 case KERN_MAXFILESPERPROC:
592 case KERN_HOSTID:
593 case KERN_AIOMAX:
594 case KERN_AIOPROCMAX:
595 case KERN_AIOTHREADS:
596 case KERN_COREDUMP:
597 case KERN_SUGID_COREDUMP:
598 return (valid_arg & ARG_VALUE) ?
599 AUE_SYSCTL : AUE_SYSCTL_NONADMIN;
600
601 default:
602 return AUE_SYSCTL;
603 }
604
605}
606
607
608
609
610
611au_event_t flags_and_error_to_openevent(int oflags, int error) {
612 au_event_t aevent;
613
614
615 oflags = oflags & (O_RDONLY | O_CREAT | O_TRUNC | O_RDWR | O_WRONLY);
616
617
618
619
620 switch (oflags) {
621 case O_RDONLY:
622 aevent = AUE_OPEN_R;
623 break;
624 case (O_RDONLY | O_CREAT):
625 aevent = AUE_OPEN_RC;
626 break;
627 case (O_RDONLY | O_CREAT | O_TRUNC):
628 aevent = AUE_OPEN_RTC;
629 break;
630 case (O_RDONLY | O_TRUNC):
631 aevent = AUE_OPEN_RT;
632 break;
633 case O_RDWR:
634 aevent = AUE_OPEN_RW;
635 break;
636 case (O_RDWR | O_CREAT):
637 aevent = AUE_OPEN_RWC;
638 break;
639 case (O_RDWR | O_CREAT | O_TRUNC):
640 aevent = AUE_OPEN_RWTC;
641 break;
642 case (O_RDWR | O_TRUNC):
643 aevent = AUE_OPEN_RWT;
644 break;
645 case O_WRONLY:
646 aevent = AUE_OPEN_W;
647 break;
648 case (O_WRONLY | O_CREAT):
649 aevent = AUE_OPEN_WC;
650 break;
651 case (O_WRONLY | O_CREAT | O_TRUNC):
652 aevent = AUE_OPEN_WTC;
653 break;
654 case (O_WRONLY | O_TRUNC):
655 aevent = AUE_OPEN_WT;
656 break;
657 default:
658 aevent = AUE_OPEN;
659 break;
660}
661
662
663
664
665
666
667 switch (aevent) {
668 case AUE_OPEN_R:
669 case AUE_OPEN_RT:
670 case AUE_OPEN_RW:
671 case AUE_OPEN_RWT:
672 case AUE_OPEN_W:
673 case AUE_OPEN_WT:
674 if (error == ENOENT)
675 aevent = AUE_OPEN;
676}
677 return aevent;
678}
679
680
681au_event_t msgctl_to_event(int cmd)
682{
683 switch (cmd) {
684 case IPC_RMID:
685 return AUE_MSGCTL_RMID;
686 case IPC_SET:
687 return AUE_MSGCTL_SET;
688 case IPC_STAT:
689 return AUE_MSGCTL_STAT;
690 default:
691 return AUE_MSGCTL;
692
693 }
694}
695
696
697au_event_t semctl_to_event(int cmd)
698{
699 switch (cmd) {
700 case GETALL:
701 return AUE_SEMCTL_GETALL;
702 case GETNCNT:
703 return AUE_SEMCTL_GETNCNT;
704 case GETPID:
705 return AUE_SEMCTL_GETPID;
706 case GETVAL:
707 return AUE_SEMCTL_GETVAL;
708 case GETZCNT:
709 return AUE_SEMCTL_GETZCNT;
710 case IPC_RMID:
711 return AUE_SEMCTL_RMID;
712 case IPC_SET:
713 return AUE_SEMCTL_SET;
714 case SETALL:
715 return AUE_SEMCTL_SETALL;
716 case SETVAL:
717 return AUE_SEMCTL_SETVAL;
718 case IPC_STAT:
719 return AUE_SEMCTL_STAT;
720 default:
721 return AUE_SEMCTL;
722
723 }
724}
725
726
727int auditon_command_event(int cmd)
728{
729 switch(cmd) {
730 case A_GETPOLICY:
731 return AUE_AUDITON_GPOLICY;
732 break;
733 case A_SETPOLICY:
734 return AUE_AUDITON_SPOLICY;
735 break;
736 case A_GETKMASK:
737 return AUE_AUDITON_GETKMASK;
738 break;
739 case A_SETKMASK:
740 return AUE_AUDITON_SETKMASK;
741 break;
742 case A_GETQCTRL:
743 return AUE_AUDITON_GQCTRL;
744 break;
745 case A_SETQCTRL:
746 return AUE_AUDITON_SQCTRL;
747 break;
748 case A_GETCWD:
749 return AUE_AUDITON_GETCWD;
750 break;
751 case A_GETCAR:
752 return AUE_AUDITON_GETCAR;
753 break;
754 case A_GETSTAT:
755 return AUE_AUDITON_GETSTAT;
756 break;
757 case A_SETSTAT:
758 return AUE_AUDITON_SETSTAT;
759 break;
760 case A_SETUMASK:
761 return AUE_AUDITON_SETUMASK;
762 break;
763 case A_SETSMASK:
764 return AUE_AUDITON_SETSMASK;
765 break;
766 case A_GETCOND:
767 return AUE_AUDITON_GETCOND;
768 break;
769 case A_SETCOND:
770 return AUE_AUDITON_SETCOND;
771 break;
772 case A_GETCLASS:
773 return AUE_AUDITON_GETCLASS;
774 break;
775 case A_SETCLASS:
776 return AUE_AUDITON_SETCLASS;
777 break;
778 case A_GETPINFO:
779 case A_SETPMASK:
780 case A_SETFSIZE:
781 case A_GETFSIZE:
782 case A_GETPINFO_ADDR:
783 case A_GETKAUDIT:
784 case A_SETKAUDIT:
785 default:
786 return AUE_AUDITON;
787 break;
788 }
789}
790
791
792
793
794
795
796
797
798
799int canon_path(struct proc *p, char *path, char *cpath)
800{
801 char *bufp;
802 int len;
803 struct vnode *vnp;
804 struct filedesc *fdp;
805 int ret;
806
807 fdp = p->p_fd;
808 bufp = path;
809 if (*(path) == '/') {
810 while (*(bufp) == '/')
811 bufp++;
812
813
814
815 if ((fdp->fd_rdir == NULL) ||
816 (fdp->fd_rdir == rootvnode)) {
817 vnp = NULL;
818 bufp--;
819 } else {
820 vnp = fdp->fd_rdir;
821 }
822 } else {
823 vnp = fdp->fd_cdir;
824 bufp = path;
825 }
826 if (vnp != NULL) {
827 len = MAXPATHLEN;
828 ret = vn_getpath(vnp, cpath, &len);
829 if (ret != 0) {
830 cpath[0] = '\0';
831 return (ret);
832 }
833 if (len < MAXPATHLEN)
834 cpath[len-1] = '/';
835 strncpy(cpath + len, bufp, MAXPATHLEN - len);
836 } else {
837 strncpy(cpath, bufp, MAXPATHLEN);
838 }
839 return (0);
840}
841