1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved. 24 * Copyright (c) 2011 Bayard G. Bell. All rights reserved. 25 */ 26 27 /* 28 * This file contains the audit event table used to control the production 29 * of audit records for each system call. 30 */ 31 32 #include <sys/policy.h> 33 #include <sys/cred.h> 34 #include <sys/types.h> 35 #include <sys/systm.h> 36 #include <sys/systeminfo.h> /* for sysinfo auditing */ 37 #include <sys/utsname.h> /* for sysinfo auditing */ 38 #include <sys/proc.h> 39 #include <sys/vnode.h> 40 #include <sys/mman.h> /* for mmap(2) auditing etc. */ 41 #include <sys/fcntl.h> 42 #include <sys/modctl.h> /* for modctl auditing */ 43 #include <sys/vnode.h> 44 #include <sys/user.h> 45 #include <sys/types.h> 46 #include <sys/processor.h> 47 #include <sys/procset.h> 48 #include <sys/acl.h> 49 #include <sys/ipc.h> 50 #include <sys/door.h> 51 #include <sys/sem.h> 52 #include <sys/msg.h> 53 #include <sys/shm.h> 54 #include <sys/kmem.h> 55 #include <sys/file.h> /* for accept */ 56 #include <sys/utssys.h> /* for fuser */ 57 #include <sys/tsol/label.h> 58 #include <sys/tsol/tndb.h> 59 #include <sys/tsol/tsyscall.h> 60 #include <c2/audit.h> 61 #include <c2/audit_kernel.h> 62 #include <c2/audit_kevents.h> 63 #include <c2/audit_record.h> 64 #include <sys/procset.h> 65 #include <nfs/mount.h> 66 #include <sys/param.h> 67 #include <sys/debug.h> 68 #include <sys/sysmacros.h> 69 #include <sys/stream.h> 70 #include <sys/strsubr.h> 71 #include <sys/stropts.h> 72 #include <sys/tihdr.h> 73 #include <sys/socket.h> 74 #include <sys/socketvar.h> 75 #include <sys/vfs_opreg.h> 76 #include <fs/sockfs/sockcommon.h> 77 #include <netinet/in.h> 78 #include <sys/ddi.h> 79 #include <sys/port_impl.h> 80 #include <sys/secflags.h> 81 82 static au_event_t aui_fchownat(au_event_t); 83 static au_event_t aui_fchmodat(au_event_t); 84 static au_event_t aui_open(au_event_t); 85 static au_event_t aui_openat(au_event_t); 86 static au_event_t aui_unlinkat(au_event_t); 87 static au_event_t aui_fstatat(au_event_t); 88 static au_event_t aui_msgsys(au_event_t); 89 static au_event_t aui_shmsys(au_event_t); 90 static au_event_t aui_semsys(au_event_t); 91 static au_event_t aui_utssys(au_event_t); 92 static au_event_t aui_fcntl(au_event_t); 93 static au_event_t aui_execve(au_event_t); 94 static au_event_t aui_memcntl(au_event_t); 95 static au_event_t aui_sysinfo(au_event_t); 96 static au_event_t aui_portfs(au_event_t); 97 static au_event_t aui_auditsys(au_event_t); 98 static au_event_t aui_modctl(au_event_t); 99 static au_event_t aui_acl(au_event_t); 100 static au_event_t aui_doorfs(au_event_t); 101 static au_event_t aui_privsys(au_event_t); 102 static au_event_t aui_forksys(au_event_t); 103 static au_event_t aui_labelsys(au_event_t); 104 static au_event_t aui_setpgrp(au_event_t); 105 106 107 static void aus_exit(struct t_audit_data *); 108 static void aus_open(struct t_audit_data *); 109 static void aus_openat(struct t_audit_data *); 110 static void aus_acl(struct t_audit_data *); 111 static void aus_acct(struct t_audit_data *); 112 static void aus_chown(struct t_audit_data *); 113 static void aus_fchown(struct t_audit_data *); 114 static void aus_lchown(struct t_audit_data *); 115 static void aus_fchownat(struct t_audit_data *); 116 static void aus_chmod(struct t_audit_data *); 117 static void aus_facl(struct t_audit_data *); 118 static void aus_fchmod(struct t_audit_data *); 119 static void aus_fchmodat(struct t_audit_data *); 120 static void aus_fcntl(struct t_audit_data *); 121 static void aus_mkdir(struct t_audit_data *); 122 static void aus_mkdirat(struct t_audit_data *); 123 static void aus_mknod(struct t_audit_data *); 124 static void aus_mknodat(struct t_audit_data *); 125 static void aus_mount(struct t_audit_data *); 126 static void aus_umount2(struct t_audit_data *); 127 static void aus_msgsys(struct t_audit_data *); 128 static void aus_semsys(struct t_audit_data *); 129 static void aus_close(struct t_audit_data *); 130 static void aus_fstatfs(struct t_audit_data *); 131 static void aus_setgid(struct t_audit_data *); 132 static void aus_setpgrp(struct t_audit_data *); 133 static void aus_setuid(struct t_audit_data *); 134 static void aus_shmsys(struct t_audit_data *); 135 static void aus_doorfs(struct t_audit_data *); 136 static void aus_ioctl(struct t_audit_data *); 137 static void aus_memcntl(struct t_audit_data *); 138 static void aus_mmap(struct t_audit_data *); 139 static void aus_munmap(struct t_audit_data *); 140 static void aus_priocntlsys(struct t_audit_data *); 141 static void aus_setegid(struct t_audit_data *); 142 static void aus_setgroups(struct t_audit_data *); 143 static void aus_seteuid(struct t_audit_data *); 144 static void aus_putmsg(struct t_audit_data *); 145 static void aus_putpmsg(struct t_audit_data *); 146 static void aus_getmsg(struct t_audit_data *); 147 static void aus_getpmsg(struct t_audit_data *); 148 static void aus_auditsys(struct t_audit_data *); 149 static void aus_sysinfo(struct t_audit_data *); 150 static void aus_modctl(struct t_audit_data *); 151 static void aus_kill(struct t_audit_data *); 152 static void aus_setregid(struct t_audit_data *); 153 static void aus_setreuid(struct t_audit_data *); 154 static void aus_labelsys(struct t_audit_data *); 155 156 static void auf_mknod(struct t_audit_data *, int, rval_t *); 157 static void auf_mknodat(struct t_audit_data *, int, rval_t *); 158 static void auf_msgsys(struct t_audit_data *, int, rval_t *); 159 static void auf_semsys(struct t_audit_data *, int, rval_t *); 160 static void auf_shmsys(struct t_audit_data *, int, rval_t *); 161 static void auf_read(struct t_audit_data *, int, rval_t *); 162 static void auf_write(struct t_audit_data *, int, rval_t *); 163 164 static void aus_sigqueue(struct t_audit_data *); 165 static void aus_p_online(struct t_audit_data *); 166 static void aus_processor_bind(struct t_audit_data *); 167 static void aus_inst_sync(struct t_audit_data *); 168 static void aus_brandsys(struct t_audit_data *); 169 170 static void auf_accept(struct t_audit_data *, int, rval_t *); 171 172 static void auf_bind(struct t_audit_data *, int, rval_t *); 173 static void auf_connect(struct t_audit_data *, int, rval_t *); 174 static void aus_shutdown(struct t_audit_data *); 175 static void auf_setsockopt(struct t_audit_data *, int, rval_t *); 176 static void aus_sockconfig(struct t_audit_data *); 177 static void auf_recv(struct t_audit_data *, int, rval_t *); 178 static void auf_recvmsg(struct t_audit_data *, int, rval_t *); 179 static void auf_send(struct t_audit_data *, int, rval_t *); 180 static void auf_sendmsg(struct t_audit_data *, int, rval_t *); 181 static void auf_recvfrom(struct t_audit_data *, int, rval_t *); 182 static void auf_sendto(struct t_audit_data *, int, rval_t *); 183 static void aus_socket(struct t_audit_data *); 184 /* 185 * This table contains mapping information for converting system call numbers 186 * to audit event IDs. In several cases it is necessary to map a single system 187 * call to several events. 188 */ 189 190 #define aui_null NULL /* NULL initialize function */ 191 #define aus_null NULL /* NULL start function */ 192 #define auf_null NULL /* NULL finish function */ 193 194 struct audit_s2e audit_s2e[] = 195 { 196 /* 197 * ---------- ---------- ---------- ---------- 198 * INITIAL AUDIT START SYSTEM 199 * PROCESSING EVENT PROCESSING CALL 200 * ---------- ---------- ---------- ----------- 201 * FINISH EVENT 202 * PROCESSING CONTROL 203 * ---------------------------------------------------------- 204 */ 205 aui_null, AUE_NULL, aus_null, /* 0 unused (indirect) */ 206 auf_null, 0, 207 aui_null, AUE_EXIT, aus_exit, /* 1 exit */ 208 auf_null, S2E_NPT, 209 aui_null, AUE_PSECFLAGS, aus_null, /* 2 psecflags */ 210 auf_null, 0, 211 aui_null, AUE_READ, aus_null, /* 3 read */ 212 auf_read, S2E_PUB, 213 aui_null, AUE_WRITE, aus_null, /* 4 write */ 214 auf_write, 0, 215 aui_open, AUE_OPEN, aus_open, /* 5 open */ 216 auf_null, S2E_SP, 217 aui_null, AUE_CLOSE, aus_close, /* 6 close */ 218 auf_null, 0, 219 aui_null, AUE_LINK, aus_null, /* 7 linkat */ 220 auf_null, 0, 221 aui_null, AUE_NULL, aus_null, /* 8 (loadable) was creat */ 222 auf_null, 0, 223 aui_null, AUE_LINK, aus_null, /* 9 link */ 224 auf_null, 0, 225 aui_null, AUE_UNLINK, aus_null, /* 10 unlink */ 226 auf_null, 0, 227 aui_null, AUE_SYMLINK, aus_null, /* 11 symlinkat */ 228 auf_null, 0, 229 aui_null, AUE_CHDIR, aus_null, /* 12 chdir */ 230 auf_null, S2E_SP, 231 aui_null, AUE_NULL, aus_null, /* 13 time */ 232 auf_null, 0, 233 aui_null, AUE_MKNOD, aus_mknod, /* 14 mknod */ 234 auf_mknod, S2E_MLD, 235 aui_null, AUE_CHMOD, aus_chmod, /* 15 chmod */ 236 auf_null, 0, 237 aui_null, AUE_CHOWN, aus_chown, /* 16 chown */ 238 auf_null, 0, 239 aui_null, AUE_NULL, aus_null, /* 17 brk */ 240 auf_null, 0, 241 aui_null, AUE_STAT, aus_null, /* 18 stat */ 242 auf_null, S2E_PUB, 243 aui_null, AUE_NULL, aus_null, /* 19 lseek */ 244 auf_null, 0, 245 aui_null, AUE_NULL, aus_null, /* 20 getpid */ 246 auf_null, 0, 247 aui_null, AUE_MOUNT, aus_mount, /* 21 mount */ 248 auf_null, S2E_MLD, 249 aui_null, AUE_READLINK, aus_null, /* 22 readlinkat */ 250 auf_null, S2E_PUB, 251 aui_null, AUE_SETUID, aus_setuid, /* 23 setuid */ 252 auf_null, 0, 253 aui_null, AUE_NULL, aus_null, /* 24 getuid */ 254 auf_null, 0, 255 aui_null, AUE_STIME, aus_null, /* 25 stime */ 256 auf_null, 0, 257 aui_null, AUE_NULL, aus_null, /* 26 pcsample */ 258 auf_null, 0, 259 aui_null, AUE_NULL, aus_null, /* 27 alarm */ 260 auf_null, 0, 261 aui_null, AUE_NULL, aus_null, /* 28 fstat */ 262 auf_null, 0, 263 aui_null, AUE_NULL, aus_null, /* 29 pause */ 264 auf_null, 0, 265 aui_null, AUE_NULL, aus_null, /* 30 (loadable) was utime */ 266 auf_null, 0, 267 aui_null, AUE_NULL, aus_null, /* 31 stty (TIOCSETP-audit?) */ 268 auf_null, 0, 269 aui_null, AUE_NULL, aus_null, /* 32 gtty */ 270 auf_null, 0, 271 aui_null, AUE_ACCESS, aus_null, /* 33 access */ 272 auf_null, S2E_PUB, 273 aui_null, AUE_NICE, aus_null, /* 34 nice */ 274 auf_null, 0, 275 aui_null, AUE_STATFS, aus_null, /* 35 statfs */ 276 auf_null, S2E_PUB, 277 aui_null, AUE_NULL, aus_null, /* 36 sync */ 278 auf_null, 0, 279 aui_null, AUE_KILL, aus_kill, /* 37 kill */ 280 auf_null, 0, 281 aui_null, AUE_FSTATFS, aus_fstatfs, /* 38 fstatfs */ 282 auf_null, S2E_PUB, 283 aui_setpgrp, AUE_SETPGRP, aus_setpgrp, /* 39 setpgrp */ 284 auf_null, 0, 285 aui_null, AUE_NULL, aus_null, /* 40 uucopystr */ 286 auf_null, 0, 287 aui_null, AUE_NULL, aus_null, /* 41 (loadable) was dup */ 288 auf_null, 0, 289 aui_null, AUE_PIPE, aus_null, /* 42 (loadable) pipe */ 290 auf_null, 0, 291 aui_null, AUE_NULL, aus_null, /* 43 times */ 292 auf_null, 0, 293 aui_null, AUE_NULL, aus_null, /* 44 profil */ 294 auf_null, 0, 295 aui_null, AUE_ACCESS, aus_null, /* 45 faccessat */ 296 auf_null, S2E_PUB, 297 aui_null, AUE_SETGID, aus_setgid, /* 46 setgid */ 298 auf_null, 0, 299 aui_null, AUE_NULL, aus_null, /* 47 getgid */ 300 auf_null, 0, 301 aui_null, AUE_MKNOD, aus_mknodat, /* 48 mknodat */ 302 auf_mknodat, S2E_MLD, 303 aui_msgsys, AUE_MSGSYS, aus_msgsys, /* 49 (loadable) msgsys */ 304 auf_msgsys, 0, 305 #if defined(__x86) 306 aui_null, AUE_NULL, aus_null, /* 50 sysi86 */ 307 auf_null, 0, 308 #else 309 aui_null, AUE_NULL, aus_null, /* 50 (loadable) was sys3b */ 310 auf_null, 0, 311 #endif /* __x86 */ 312 aui_null, AUE_ACCT, aus_acct, /* 51 (loadable) sysacct */ 313 auf_null, 0, 314 aui_shmsys, AUE_SHMSYS, aus_shmsys, /* 52 (loadable) shmsys */ 315 auf_shmsys, 0, 316 aui_semsys, AUE_SEMSYS, aus_semsys, /* 53 (loadable) semsys */ 317 auf_semsys, 0, 318 aui_null, AUE_IOCTL, aus_ioctl, /* 54 ioctl */ 319 auf_null, 0, 320 aui_null, AUE_NULL, aus_null, /* 55 uadmin */ 321 auf_null, 0, 322 aui_fchownat, AUE_NULL, aus_fchownat, /* 56 fchownat */ 323 auf_null, 0, 324 aui_utssys, AUE_FUSERS, aus_null, /* 57 utssys */ 325 auf_null, 0, 326 aui_null, AUE_NULL, aus_null, /* 58 fsync */ 327 auf_null, 0, 328 aui_execve, AUE_EXECVE, aus_null, /* 59 exece */ 329 auf_null, S2E_MLD, 330 aui_null, AUE_NULL, aus_null, /* 60 umask */ 331 auf_null, 0, 332 aui_null, AUE_CHROOT, aus_null, /* 61 chroot */ 333 auf_null, S2E_SP, 334 aui_fcntl, AUE_FCNTL, aus_fcntl, /* 62 fcntl */ 335 auf_null, 0, 336 aui_null, AUE_NULL, aus_null, /* 63 ulimit */ 337 auf_null, 0, 338 aui_null, AUE_RENAME, aus_null, /* 64 renameat */ 339 auf_null, 0, 340 aui_unlinkat, AUE_NULL, aus_null, /* 65 unlinkat */ 341 auf_null, 0, 342 aui_fstatat, AUE_NULL, aus_null, /* 66 fstatat */ 343 auf_null, S2E_PUB, 344 aui_fstatat, AUE_NULL, aus_null, /* 67 fstatat64 */ 345 auf_null, S2E_PUB, 346 aui_openat, AUE_OPEN, aus_openat, /* 68 openat */ 347 auf_null, S2E_SP, 348 aui_openat, AUE_OPEN, aus_openat, /* 69 openat64 */ 349 auf_null, S2E_SP, 350 aui_null, AUE_NULL, aus_null, /* 70 tasksys */ 351 auf_null, 0, 352 aui_null, AUE_NULL, aus_null, /* 71 (loadable) acctctl */ 353 auf_null, 0, 354 aui_null, AUE_NULL, aus_null, /* 72 (loadable) exacct */ 355 auf_null, 0, 356 aui_null, AUE_NULL, aus_null, /* 73 getpagesizes */ 357 auf_null, 0, 358 aui_null, AUE_NULL, aus_null, /* 74 rctlsys */ 359 auf_null, 0, 360 aui_null, AUE_NULL, aus_null, /* 75 sidsys */ 361 auf_null, 0, 362 aui_null, AUE_NULL, aus_null, /* 76 (loadable) was fsat */ 363 auf_null, 0, 364 aui_null, AUE_NULL, aus_null, /* 77 syslwp_park */ 365 auf_null, 0, 366 aui_null, AUE_NULL, aus_null, /* 78 sendfilev */ 367 auf_null, 0, 368 aui_null, AUE_RMDIR, aus_null, /* 79 rmdir */ 369 auf_null, 0, 370 aui_null, AUE_MKDIR, aus_mkdir, /* 80 mkdir */ 371 auf_null, 0, 372 aui_null, AUE_NULL, aus_null, /* 81 getdents */ 373 auf_null, 0, 374 aui_privsys, AUE_NULL, aus_null, /* 82 privsys */ 375 auf_null, 0, 376 aui_null, AUE_NULL, aus_null, /* 83 ucredsys */ 377 auf_null, 0, 378 aui_null, AUE_NULL, aus_null, /* 84 sysfs */ 379 auf_null, 0, 380 aui_null, AUE_GETMSG, aus_getmsg, /* 85 getmsg */ 381 auf_null, 0, 382 aui_null, AUE_PUTMSG, aus_putmsg, /* 86 putmsg */ 383 auf_null, 0, 384 aui_null, AUE_NULL, aus_null, /* 87 (loadable) was poll */ 385 auf_null, 0, 386 aui_null, AUE_LSTAT, aus_null, /* 88 lstat */ 387 auf_null, S2E_PUB, 388 aui_null, AUE_SYMLINK, aus_null, /* 89 symlink */ 389 auf_null, 0, 390 aui_null, AUE_READLINK, aus_null, /* 90 readlink */ 391 auf_null, S2E_PUB, 392 aui_null, AUE_SETGROUPS, aus_setgroups, /* 91 setgroups */ 393 auf_null, 0, 394 aui_null, AUE_NULL, aus_null, /* 92 getgroups */ 395 auf_null, 0, 396 aui_null, AUE_FCHMOD, aus_fchmod, /* 93 fchmod */ 397 auf_null, 0, 398 aui_null, AUE_FCHOWN, aus_fchown, /* 94 fchown */ 399 auf_null, 0, 400 aui_null, AUE_NULL, aus_null, /* 95 sigprocmask */ 401 auf_null, 0, 402 aui_null, AUE_NULL, aus_null, /* 96 sigsuspend */ 403 auf_null, 0, 404 aui_null, AUE_NULL, aus_null, /* 97 sigaltstack */ 405 auf_null, 0, 406 aui_null, AUE_NULL, aus_null, /* 98 sigaction */ 407 auf_null, 0, 408 aui_null, AUE_NULL, aus_null, /* 99 sigpending */ 409 auf_null, 0, 410 aui_null, AUE_NULL, aus_null, /* 100 setcontext */ 411 auf_null, 0, 412 aui_fchmodat, AUE_NULL, aus_fchmodat, /* 101 fchmodat */ 413 auf_null, 0, 414 aui_null, AUE_MKDIR, aus_mkdirat, /* 102 mkdirat */ 415 auf_null, 0, 416 aui_null, AUE_STATVFS, aus_null, /* 103 statvfs */ 417 auf_null, S2E_PUB, 418 aui_null, AUE_NULL, aus_null, /* 104 fstatvfs */ 419 auf_null, 0, 420 aui_null, AUE_NULL, aus_null, /* 105 getloadavg */ 421 auf_null, 0, 422 aui_null, AUE_NULL, aus_null, /* 106 nfssys */ 423 auf_null, 0, 424 aui_null, AUE_NULL, aus_null, /* 107 waitsys */ 425 auf_null, 0, 426 aui_null, AUE_NULL, aus_null, /* 108 sigsendsys */ 427 auf_null, 0, 428 #if defined(__x86) 429 aui_null, AUE_NULL, aus_null, /* 109 hrtsys */ 430 auf_null, 0, 431 #else 432 aui_null, AUE_NULL, aus_null, /* 109 (loadable) */ 433 auf_null, 0, 434 #endif /* __x86 */ 435 aui_null, AUE_UTIMES, aus_null, /* 110 utimesys */ 436 auf_null, 0, 437 aui_null, AUE_NULL, aus_null, /* 111 sigresend */ 438 auf_null, 0, 439 aui_null, AUE_PRIOCNTLSYS, aus_priocntlsys, /* 112 priocntlsys */ 440 auf_null, 0, 441 aui_null, AUE_PATHCONF, aus_null, /* 113 pathconf */ 442 auf_null, S2E_PUB, 443 aui_null, AUE_NULL, aus_null, /* 114 mincore */ 444 auf_null, 0, 445 aui_null, AUE_MMAP, aus_mmap, /* 115 mmap */ 446 auf_null, 0, 447 aui_null, AUE_NULL, aus_null, /* 116 mprotect */ 448 auf_null, 0, 449 aui_null, AUE_MUNMAP, aus_munmap, /* 117 munmap */ 450 auf_null, 0, 451 aui_null, AUE_NULL, aus_null, /* 118 fpathconf */ 452 auf_null, 0, 453 aui_null, AUE_VFORK, aus_null, /* 119 vfork */ 454 auf_null, 0, 455 aui_null, AUE_FCHDIR, aus_null, /* 120 fchdir */ 456 auf_null, 0, 457 aui_null, AUE_READ, aus_null, /* 121 readv */ 458 auf_read, S2E_PUB, 459 aui_null, AUE_WRITE, aus_null, /* 122 writev */ 460 auf_write, 0, 461 aui_null, AUE_NULL, aus_null, /* 123 (loadable) was xstat */ 462 auf_null, 0, 463 aui_null, AUE_NULL, aus_null, /* 124 (loadable) was lxstat */ 464 auf_null, 0, 465 aui_null, AUE_NULL, aus_null, /* 125 (loadable) was fxstat */ 466 auf_null, 0, 467 aui_null, AUE_NULL, aus_null, /* 126 (loadable) was xmknod */ 468 auf_null, 0, 469 aui_null, AUE_NULL, aus_null, /* 127 mmapobj */ 470 auf_null, 0, 471 aui_null, AUE_SETRLIMIT, aus_null, /* 128 setrlimit */ 472 auf_null, 0, 473 aui_null, AUE_NULL, aus_null, /* 129 getrlimit */ 474 auf_null, 0, 475 aui_null, AUE_LCHOWN, aus_lchown, /* 130 lchown */ 476 auf_null, 0, 477 aui_memcntl, AUE_MEMCNTL, aus_memcntl, /* 131 memcntl */ 478 auf_null, 0, 479 aui_null, AUE_GETPMSG, aus_getpmsg, /* 132 getpmsg */ 480 auf_null, 0, 481 aui_null, AUE_PUTPMSG, aus_putpmsg, /* 133 putpmsg */ 482 auf_null, 0, 483 aui_null, AUE_RENAME, aus_null, /* 134 rename */ 484 auf_null, 0, 485 aui_null, AUE_NULL, aus_null, /* 135 uname */ 486 auf_null, 0, 487 aui_null, AUE_SETEGID, aus_setegid, /* 136 setegid */ 488 auf_null, 0, 489 aui_null, AUE_NULL, aus_null, /* 137 sysconfig */ 490 auf_null, 0, 491 aui_null, AUE_ADJTIME, aus_null, /* 138 adjtime */ 492 auf_null, 0, 493 aui_sysinfo, AUE_SYSINFO, aus_sysinfo, /* 139 systeminfo */ 494 auf_null, 0, 495 aui_null, AUE_NULL, aus_null, /* 140 (loadable) sharefs */ 496 auf_null, 0, 497 aui_null, AUE_SETEUID, aus_seteuid, /* 141 seteuid */ 498 auf_null, 0, 499 aui_forksys, AUE_NULL, aus_null, /* 142 forksys */ 500 auf_null, 0, 501 aui_null, AUE_NULL, aus_null, /* 143 (loadable) was fork1 */ 502 auf_null, 0, 503 aui_null, AUE_NULL, aus_null, /* 144 sigwait */ 504 auf_null, 0, 505 aui_null, AUE_NULL, aus_null, /* 145 lwp_info */ 506 auf_null, 0, 507 aui_null, AUE_NULL, aus_null, /* 146 yield */ 508 auf_null, 0, 509 aui_null, AUE_NULL, aus_null, /* 147 (loadable) */ 510 /* was lwp_sema_wait */ 511 auf_null, 0, 512 aui_null, AUE_NULL, aus_null, /* 148 lwp_sema_post */ 513 auf_null, 0, 514 aui_null, AUE_NULL, aus_null, /* 149 lwp_sema_trywait */ 515 auf_null, 0, 516 aui_null, AUE_NULL, aus_null, /* 150 lwp_detach */ 517 auf_null, 0, 518 aui_null, AUE_NULL, aus_null, /* 151 corectl */ 519 auf_null, 0, 520 aui_modctl, AUE_MODCTL, aus_modctl, /* 152 modctl */ 521 auf_null, 0, 522 aui_null, AUE_FCHROOT, aus_null, /* 153 fchroot */ 523 auf_null, 0, 524 aui_null, AUE_NULL, aus_null, /* 154 (loadable) was utimes */ 525 auf_null, 0, 526 aui_null, AUE_NULL, aus_null, /* 155 vhangup */ 527 auf_null, 0, 528 aui_null, AUE_NULL, aus_null, /* 156 gettimeofday */ 529 auf_null, 0, 530 aui_null, AUE_NULL, aus_null, /* 157 getitimer */ 531 auf_null, 0, 532 aui_null, AUE_NULL, aus_null, /* 158 setitimer */ 533 auf_null, 0, 534 aui_null, AUE_NULL, aus_null, /* 159 lwp_create */ 535 auf_null, 0, 536 aui_null, AUE_NULL, aus_null, /* 160 lwp_exit */ 537 auf_null, 0, 538 aui_null, AUE_NULL, aus_null, /* 161 lwp_suspend */ 539 auf_null, 0, 540 aui_null, AUE_NULL, aus_null, /* 162 lwp_continue */ 541 auf_null, 0, 542 aui_null, AUE_NULL, aus_null, /* 163 lwp_kill */ 543 auf_null, 0, 544 aui_null, AUE_NULL, aus_null, /* 164 lwp_self */ 545 auf_null, 0, 546 aui_null, AUE_NULL, aus_null, /* 165 lwp_sigmask */ 547 auf_null, 0, 548 aui_null, AUE_NULL, aus_null, /* 166 lwp_private */ 549 auf_null, 0, 550 aui_null, AUE_NULL, aus_null, /* 167 lwp_wait */ 551 auf_null, 0, 552 aui_null, AUE_NULL, aus_null, /* 168 lwp_mutex_wakeup */ 553 auf_null, 0, 554 aui_null, AUE_NULL, aus_null, /* 169 (loadable) */ 555 /* was lwp_mutex_lock */ 556 auf_null, 0, 557 aui_null, AUE_NULL, aus_null, /* 170 lwp_cond_wait */ 558 auf_null, 0, 559 aui_null, AUE_NULL, aus_null, /* 171 lwp_cond_signal */ 560 auf_null, 0, 561 aui_null, AUE_NULL, aus_null, /* 172 lwp_cond_broadcast */ 562 auf_null, 0, 563 aui_null, AUE_READ, aus_null, /* 173 pread */ 564 auf_read, S2E_PUB, 565 aui_null, AUE_WRITE, aus_null, /* 174 pwrite */ 566 auf_write, 0, 567 aui_null, AUE_NULL, aus_null, /* 175 llseek */ 568 auf_null, 0, 569 aui_null, AUE_INST_SYNC, aus_inst_sync, /* 176 (loadable) inst_sync */ 570 auf_null, 0, 571 aui_null, AUE_BRANDSYS, aus_brandsys, /* 177 brandsys */ 572 auf_null, 0, 573 aui_null, AUE_NULL, aus_null, /* 178 (loadable) kaio */ 574 auf_null, 0, 575 aui_null, AUE_NULL, aus_null, /* 179 (loadable) cpc */ 576 auf_null, 0, 577 aui_null, AUE_NULL, aus_null, /* 180 lgrpsys */ 578 auf_null, 0, 579 aui_null, AUE_NULL, aus_null, /* 181 rusagesys */ 580 auf_null, 0, 581 aui_portfs, AUE_PORTFS, aus_null, /* 182 (loadable) portfs */ 582 auf_null, S2E_MLD, 583 aui_null, AUE_NULL, aus_null, /* 183 pollsys */ 584 auf_null, 0, 585 aui_labelsys, AUE_NULL, aus_labelsys, /* 184 labelsys */ 586 auf_null, 0, 587 aui_acl, AUE_ACLSET, aus_acl, /* 185 acl */ 588 auf_null, 0, 589 aui_auditsys, AUE_AUDITSYS, aus_auditsys, /* 186 auditsys */ 590 auf_null, 0, 591 aui_null, AUE_PROCESSOR_BIND, aus_processor_bind, /* 187 processor_bind */ 592 auf_null, 0, 593 aui_null, AUE_NULL, aus_null, /* 188 processor_info */ 594 auf_null, 0, 595 aui_null, AUE_P_ONLINE, aus_p_online, /* 189 p_online */ 596 auf_null, 0, 597 aui_null, AUE_NULL, aus_sigqueue, /* 190 sigqueue */ 598 auf_null, 0, 599 aui_null, AUE_NULL, aus_null, /* 191 clock_gettime */ 600 auf_null, 0, 601 aui_null, AUE_CLOCK_SETTIME, aus_null, /* 192 clock_settime */ 602 auf_null, 0, 603 aui_null, AUE_NULL, aus_null, /* 193 clock_getres */ 604 auf_null, 0, 605 aui_null, AUE_NULL, aus_null, /* 194 timer_create */ 606 auf_null, 0, 607 aui_null, AUE_NULL, aus_null, /* 195 timer_delete */ 608 auf_null, 0, 609 aui_null, AUE_NULL, aus_null, /* 196 timer_settime */ 610 auf_null, 0, 611 aui_null, AUE_NULL, aus_null, /* 197 timer_gettime */ 612 auf_null, 0, 613 aui_null, AUE_NULL, aus_null, /* 198 timer_getoverrun */ 614 auf_null, 0, 615 aui_null, AUE_NULL, aus_null, /* 199 nanosleep */ 616 auf_null, 0, 617 aui_acl, AUE_FACLSET, aus_facl, /* 200 facl */ 618 auf_null, 0, 619 aui_doorfs, AUE_DOORFS, aus_doorfs, /* 201 (loadable) doorfs */ 620 auf_null, 0, 621 aui_null, AUE_SETREUID, aus_setreuid, /* 202 setreuid */ 622 auf_null, 0, 623 aui_null, AUE_SETREGID, aus_setregid, /* 203 setregid */ 624 auf_null, 0, 625 aui_null, AUE_NULL, aus_null, /* 204 install_utrap */ 626 auf_null, 0, 627 aui_null, AUE_NULL, aus_null, /* 205 signotify */ 628 auf_null, 0, 629 aui_null, AUE_NULL, aus_null, /* 206 schedctl */ 630 auf_null, 0, 631 aui_null, AUE_NULL, aus_null, /* 207 (loadable) pset */ 632 auf_null, 0, 633 aui_null, AUE_NULL, aus_null, /* 208 sparc_utrap_install */ 634 auf_null, 0, 635 aui_null, AUE_NULL, aus_null, /* 209 resolvepath */ 636 auf_null, 0, 637 aui_null, AUE_NULL, aus_null, /* 210 lwp_mutex_timedlock */ 638 auf_null, 0, 639 aui_null, AUE_NULL, aus_null, /* 211 lwp_sema_timedwait */ 640 auf_null, 0, 641 aui_null, AUE_NULL, aus_null, /* 212 lwp_rwlock_sys */ 642 auf_null, 0, 643 aui_null, AUE_NULL, aus_null, /* 213 getdents64 */ 644 auf_null, 0, 645 aui_null, AUE_MMAP, aus_mmap, /* 214 mmap64 */ 646 auf_null, 0, 647 aui_null, AUE_STAT, aus_null, /* 215 stat64 */ 648 auf_null, S2E_PUB, 649 aui_null, AUE_LSTAT, aus_null, /* 216 lstat64 */ 650 auf_null, S2E_PUB, 651 aui_null, AUE_NULL, aus_null, /* 217 fstat64 */ 652 auf_null, 0, 653 aui_null, AUE_STATVFS, aus_null, /* 218 statvfs64 */ 654 auf_null, S2E_PUB, 655 aui_null, AUE_NULL, aus_null, /* 219 fstatvfs64 */ 656 auf_null, 0, 657 aui_null, AUE_SETRLIMIT, aus_null, /* 220 setrlimit64 */ 658 auf_null, 0, 659 aui_null, AUE_NULL, aus_null, /* 221 getrlimit64 */ 660 auf_null, 0, 661 aui_null, AUE_READ, aus_null, /* 222 pread64 */ 662 auf_read, S2E_PUB, 663 aui_null, AUE_WRITE, aus_null, /* 223 pwrite64 */ 664 auf_write, 0, 665 aui_null, AUE_NULL, aus_null, /* 224 (loadable) was creat64 */ 666 auf_null, 0, 667 aui_open, AUE_OPEN, aus_open, /* 225 open64 */ 668 auf_null, S2E_SP, 669 aui_null, AUE_NULL, aus_null, /* 226 (loadable) rpcsys */ 670 auf_null, 0, 671 aui_null, AUE_NULL, aus_null, /* 227 zone */ 672 auf_null, 0, 673 aui_null, AUE_NULL, aus_null, /* 228 (loadable) autofssys */ 674 auf_null, 0, 675 aui_null, AUE_NULL, aus_null, /* 229 getcwd */ 676 auf_null, 0, 677 aui_null, AUE_SOCKET, aus_socket, /* 230 so_socket */ 678 auf_null, 0, 679 aui_null, AUE_NULL, aus_null, /* 231 so_socketpair */ 680 auf_null, 0, 681 aui_null, AUE_BIND, aus_null, /* 232 bind */ 682 auf_bind, 0, 683 aui_null, AUE_NULL, aus_null, /* 233 listen */ 684 auf_null, 0, 685 aui_null, AUE_ACCEPT, aus_null, /* 234 accept */ 686 auf_accept, 0, 687 aui_null, AUE_CONNECT, aus_null, /* 235 connect */ 688 auf_connect, 0, 689 aui_null, AUE_SHUTDOWN, aus_shutdown, /* 236 shutdown */ 690 auf_null, 0, 691 aui_null, AUE_READ, aus_null, /* 237 recv */ 692 auf_recv, 0, 693 aui_null, AUE_RECVFROM, aus_null, /* 238 recvfrom */ 694 auf_recvfrom, 0, 695 aui_null, AUE_RECVMSG, aus_null, /* 239 recvmsg */ 696 auf_recvmsg, 0, 697 aui_null, AUE_WRITE, aus_null, /* 240 send */ 698 auf_send, 0, 699 aui_null, AUE_SENDMSG, aus_null, /* 241 sendmsg */ 700 auf_sendmsg, 0, 701 aui_null, AUE_SENDTO, aus_null, /* 242 sendto */ 702 auf_sendto, 0, 703 aui_null, AUE_NULL, aus_null, /* 243 getpeername */ 704 auf_null, 0, 705 aui_null, AUE_NULL, aus_null, /* 244 getsockname */ 706 auf_null, 0, 707 aui_null, AUE_NULL, aus_null, /* 245 getsockopt */ 708 auf_null, 0, 709 aui_null, AUE_SETSOCKOPT, aus_null, /* 246 setsockopt */ 710 auf_setsockopt, 0, 711 aui_null, AUE_SOCKCONFIG, aus_sockconfig, /* 247 sockconfig */ 712 auf_null, 0, 713 aui_null, AUE_NULL, aus_null, /* 248 ntp_gettime */ 714 auf_null, 0, 715 aui_null, AUE_NTP_ADJTIME, aus_null, /* 249 ntp_adjtime */ 716 auf_null, 0, 717 aui_null, AUE_NULL, aus_null, /* 250 lwp_mutex_unlock */ 718 auf_null, 0, 719 aui_null, AUE_NULL, aus_null, /* 251 lwp_mutex_trylock */ 720 auf_null, 0, 721 aui_null, AUE_NULL, aus_null, /* 252 lwp_mutex_register */ 722 auf_null, 0, 723 aui_null, AUE_NULL, aus_null, /* 253 cladm */ 724 auf_null, 0, 725 aui_null, AUE_NULL, aus_null, /* 254 uucopy */ 726 auf_null, 0, 727 aui_null, AUE_UMOUNT2, aus_umount2, /* 255 umount2 */ 728 auf_null, 0 729 }; 730 731 uint_t num_syscall = sizeof (audit_s2e) / sizeof (struct audit_s2e); 732 733 734 /* exit start function */ 735 /*ARGSUSED*/ 736 static void 737 aus_exit(struct t_audit_data *tad) 738 { 739 uint32_t rval; 740 struct a { 741 long rval; 742 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 743 744 rval = (uint32_t)uap->rval; 745 au_uwrite(au_to_arg32(1, "exit status", rval)); 746 } 747 748 749 /* acct start function */ 750 /*ARGSUSED*/ 751 static void 752 aus_acct(struct t_audit_data *tad) 753 { 754 klwp_t *clwp = ttolwp(curthread); 755 uintptr_t fname; 756 757 struct a { 758 long fname; /* char * */ 759 } *uap = (struct a *)clwp->lwp_ap; 760 761 fname = (uintptr_t)uap->fname; 762 763 if (fname == 0) 764 au_uwrite(au_to_arg32(1, "accounting off", (uint32_t)0)); 765 } 766 767 /* chown start function */ 768 /*ARGSUSED*/ 769 static void 770 aus_chown(struct t_audit_data *tad) 771 { 772 klwp_t *clwp = ttolwp(curthread); 773 uint32_t uid, gid; 774 775 struct a { 776 long fname; /* char * */ 777 long uid; 778 long gid; 779 } *uap = (struct a *)clwp->lwp_ap; 780 781 uid = (uint32_t)uap->uid; 782 gid = (uint32_t)uap->gid; 783 784 au_uwrite(au_to_arg32(2, "new file uid", uid)); 785 au_uwrite(au_to_arg32(3, "new file gid", gid)); 786 } 787 788 /* fchown start function */ 789 /*ARGSUSED*/ 790 static void 791 aus_fchown(struct t_audit_data *tad) 792 { 793 klwp_t *clwp = ttolwp(curthread); 794 uint32_t uid, gid, fd; 795 struct file *fp; 796 struct vnode *vp; 797 struct f_audit_data *fad; 798 799 struct a { 800 long fd; 801 long uid; 802 long gid; 803 } *uap = (struct a *)clwp->lwp_ap; 804 805 fd = (uint32_t)uap->fd; 806 uid = (uint32_t)uap->uid; 807 gid = (uint32_t)uap->gid; 808 809 au_uwrite(au_to_arg32(2, "new file uid", uid)); 810 au_uwrite(au_to_arg32(3, "new file gid", gid)); 811 812 /* 813 * convert file pointer to file descriptor 814 * Note: fd ref count incremented here. 815 */ 816 if ((fp = getf(fd)) == NULL) 817 return; 818 819 /* get path from file struct here */ 820 fad = F2A(fp); 821 if (fad->fad_aupath != NULL) { 822 au_uwrite(au_to_path(fad->fad_aupath)); 823 } else { 824 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 825 } 826 827 vp = fp->f_vnode; 828 audit_attributes(vp); 829 830 /* decrement file descriptor reference count */ 831 releasef(fd); 832 } 833 834 /*ARGSUSED*/ 835 static void 836 aus_lchown(struct t_audit_data *tad) 837 { 838 klwp_t *clwp = ttolwp(curthread); 839 uint32_t uid, gid; 840 841 842 struct a { 843 long fname; /* char * */ 844 long uid; 845 long gid; 846 } *uap = (struct a *)clwp->lwp_ap; 847 848 uid = (uint32_t)uap->uid; 849 gid = (uint32_t)uap->gid; 850 851 au_uwrite(au_to_arg32(2, "new file uid", uid)); 852 au_uwrite(au_to_arg32(3, "new file gid", gid)); 853 } 854 855 static au_event_t 856 aui_fchownat(au_event_t e) 857 { 858 klwp_t *clwp = ttolwp(curthread); 859 860 struct a { 861 long fd; 862 long fname; /* char * */ 863 long uid; 864 long gid; 865 long flags; 866 } *uap = (struct a *)clwp->lwp_ap; 867 868 if (uap->fname == NULL) 869 e = AUE_FCHOWN; 870 else if (uap->flags & AT_SYMLINK_NOFOLLOW) 871 e = AUE_LCHOWN; 872 else 873 e = AUE_CHOWN; 874 875 return (e); 876 } 877 878 /*ARGSUSED*/ 879 static void 880 aus_fchownat(struct t_audit_data *tad) 881 { 882 klwp_t *clwp = ttolwp(curthread); 883 uint32_t uid, gid; 884 885 struct a { 886 long fd; 887 long fname; /* char * */ 888 long uid; 889 long gid; 890 long flags; 891 } *uap = (struct a *)clwp->lwp_ap; 892 893 uid = (uint32_t)uap->uid; 894 gid = (uint32_t)uap->gid; 895 896 au_uwrite(au_to_arg32(3, "new file uid", uid)); 897 au_uwrite(au_to_arg32(4, "new file gid", gid)); 898 } 899 900 /*ARGSUSED*/ 901 static void 902 aus_chmod(struct t_audit_data *tad) 903 { 904 klwp_t *clwp = ttolwp(curthread); 905 uint32_t fmode; 906 907 struct a { 908 long fname; /* char * */ 909 long fmode; 910 } *uap = (struct a *)clwp->lwp_ap; 911 912 fmode = (uint32_t)uap->fmode; 913 914 au_uwrite(au_to_arg32(2, "new file mode", fmode&07777)); 915 } 916 917 /*ARGSUSED*/ 918 static void 919 aus_fchmod(struct t_audit_data *tad) 920 { 921 klwp_t *clwp = ttolwp(curthread); 922 uint32_t fmode, fd; 923 struct file *fp; 924 struct vnode *vp; 925 struct f_audit_data *fad; 926 927 struct a { 928 long fd; 929 long fmode; 930 } *uap = (struct a *)clwp->lwp_ap; 931 932 fd = (uint32_t)uap->fd; 933 fmode = (uint32_t)uap->fmode; 934 935 au_uwrite(au_to_arg32(2, "new file mode", fmode&07777)); 936 937 /* 938 * convert file pointer to file descriptor 939 * Note: fd ref count incremented here. 940 */ 941 if ((fp = getf(fd)) == NULL) 942 return; 943 944 /* get path from file struct here */ 945 fad = F2A(fp); 946 if (fad->fad_aupath != NULL) { 947 au_uwrite(au_to_path(fad->fad_aupath)); 948 } else { 949 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 950 } 951 952 vp = fp->f_vnode; 953 audit_attributes(vp); 954 955 /* decrement file descriptor reference count */ 956 releasef(fd); 957 } 958 959 static au_event_t 960 aui_fchmodat(au_event_t e) 961 { 962 klwp_t *clwp = ttolwp(curthread); 963 964 struct a { 965 long fd; 966 long fname; /* char * */ 967 long fmode; 968 long flag; 969 } *uap = (struct a *)clwp->lwp_ap; 970 971 if (uap->fname == NULL) 972 e = AUE_FCHMOD; 973 else 974 e = AUE_CHMOD; 975 976 return (e); 977 } 978 979 /*ARGSUSED*/ 980 static void 981 aus_fchmodat(struct t_audit_data *tad) 982 { 983 klwp_t *clwp = ttolwp(curthread); 984 uint32_t fmode; 985 uint32_t fd; 986 struct file *fp; 987 struct vnode *vp; 988 struct f_audit_data *fad; 989 990 struct a { 991 long fd; 992 long fname; /* char * */ 993 long fmode; 994 long flag; 995 } *uap = (struct a *)clwp->lwp_ap; 996 997 fd = (uint32_t)uap->fd; 998 fmode = (uint32_t)uap->fmode; 999 1000 au_uwrite(au_to_arg32(2, "new file mode", fmode&07777)); 1001 1002 if (fd == AT_FDCWD || uap->fname != NULL) /* same as chmod() */ 1003 return; 1004 1005 /* 1006 * convert file pointer to file descriptor 1007 * Note: fd ref count incremented here. 1008 */ 1009 if ((fp = getf(fd)) == NULL) 1010 return; 1011 1012 /* get path from file struct here */ 1013 fad = F2A(fp); 1014 if (fad->fad_aupath != NULL) { 1015 au_uwrite(au_to_path(fad->fad_aupath)); 1016 } else { 1017 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 1018 } 1019 1020 vp = fp->f_vnode; 1021 audit_attributes(vp); 1022 1023 /* decrement file descriptor reference count */ 1024 releasef(fd); 1025 } 1026 1027 /* 1028 * convert open mode to appropriate open event 1029 */ 1030 au_event_t 1031 open_event(uint_t fm) 1032 { 1033 au_event_t e; 1034 1035 switch (fm & (O_ACCMODE | O_CREAT | O_TRUNC)) { 1036 case O_RDONLY: 1037 e = AUE_OPEN_R; 1038 break; 1039 case O_RDONLY | O_CREAT: 1040 e = AUE_OPEN_RC; 1041 break; 1042 case O_RDONLY | O_TRUNC: 1043 e = AUE_OPEN_RT; 1044 break; 1045 case O_RDONLY | O_TRUNC | O_CREAT: 1046 e = AUE_OPEN_RTC; 1047 break; 1048 case O_WRONLY: 1049 e = AUE_OPEN_W; 1050 break; 1051 case O_WRONLY | O_CREAT: 1052 e = AUE_OPEN_WC; 1053 break; 1054 case O_WRONLY | O_TRUNC: 1055 e = AUE_OPEN_WT; 1056 break; 1057 case O_WRONLY | O_TRUNC | O_CREAT: 1058 e = AUE_OPEN_WTC; 1059 break; 1060 case O_RDWR: 1061 e = AUE_OPEN_RW; 1062 break; 1063 case O_RDWR | O_CREAT: 1064 e = AUE_OPEN_RWC; 1065 break; 1066 case O_RDWR | O_TRUNC: 1067 e = AUE_OPEN_RWT; 1068 break; 1069 case O_RDWR | O_TRUNC | O_CREAT: 1070 e = AUE_OPEN_RWTC; 1071 break; 1072 case O_SEARCH: 1073 e = AUE_OPEN_S; 1074 break; 1075 case O_EXEC: 1076 e = AUE_OPEN_E; 1077 break; 1078 default: 1079 e = AUE_NULL; 1080 break; 1081 } 1082 1083 return (e); 1084 } 1085 1086 /* ARGSUSED */ 1087 static au_event_t 1088 aui_open(au_event_t e) 1089 { 1090 klwp_t *clwp = ttolwp(curthread); 1091 uint_t fm; 1092 1093 struct a { 1094 long fnamep; /* char * */ 1095 long fmode; 1096 long cmode; 1097 } *uap = (struct a *)clwp->lwp_ap; 1098 1099 fm = (uint_t)uap->fmode; 1100 1101 return (open_event(fm)); 1102 } 1103 1104 static void 1105 aus_open(struct t_audit_data *tad) 1106 { 1107 klwp_t *clwp = ttolwp(curthread); 1108 uint_t fm; 1109 1110 struct a { 1111 long fnamep; /* char * */ 1112 long fmode; 1113 long cmode; 1114 } *uap = (struct a *)clwp->lwp_ap; 1115 1116 fm = (uint_t)uap->fmode; 1117 1118 /* If no write, create, or trunc modes, mark as a public op */ 1119 if ((fm & (O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_TRUNC)) == O_RDONLY) 1120 tad->tad_ctrl |= TAD_PUBLIC_EV; 1121 } 1122 1123 /* ARGSUSED */ 1124 static au_event_t 1125 aui_openat(au_event_t e) 1126 { 1127 t_audit_data_t *tad = T2A(curthread); 1128 klwp_t *clwp = ttolwp(curthread); 1129 uint_t fm; 1130 1131 struct a { 1132 long filedes; 1133 long fnamep; /* char * */ 1134 long fmode; 1135 long cmode; 1136 } *uap = (struct a *)clwp->lwp_ap; 1137 1138 fm = (uint_t)uap->fmode; 1139 1140 /* 1141 * __openattrdirat() does an extra pathname lookup in order to 1142 * enter the extended system attribute namespace of the referenced 1143 * extended attribute filename. 1144 */ 1145 if (fm & FXATTRDIROPEN) 1146 tad->tad_ctrl |= TAD_MLD; 1147 1148 return (open_event(fm)); 1149 } 1150 1151 static void 1152 aus_openat(struct t_audit_data *tad) 1153 { 1154 klwp_t *clwp = ttolwp(curthread); 1155 uint_t fm; 1156 1157 struct a { 1158 long filedes; 1159 long fnamep; /* char * */ 1160 long fmode; 1161 long cmode; 1162 } *uap = (struct a *)clwp->lwp_ap; 1163 1164 fm = (uint_t)uap->fmode; 1165 1166 /* If no write, create, or trunc modes, mark as a public op */ 1167 if ((fm & (O_RDONLY|O_WRONLY|O_RDWR|O_CREAT|O_TRUNC)) == O_RDONLY) 1168 tad->tad_ctrl |= TAD_PUBLIC_EV; 1169 } 1170 1171 static au_event_t 1172 aui_unlinkat(au_event_t e) 1173 { 1174 klwp_t *clwp = ttolwp(curthread); 1175 1176 struct a { 1177 long filedes; 1178 long fnamep; /* char * */ 1179 long flags; 1180 } *uap = (struct a *)clwp->lwp_ap; 1181 1182 if (uap->flags & AT_REMOVEDIR) 1183 e = AUE_RMDIR; 1184 else 1185 e = AUE_UNLINK; 1186 1187 return (e); 1188 } 1189 1190 static au_event_t 1191 aui_fstatat(au_event_t e) 1192 { 1193 klwp_t *clwp = ttolwp(curthread); 1194 1195 struct a { 1196 long filedes; 1197 long fnamep; /* char * */ 1198 long statb; 1199 long flags; 1200 } *uap = (struct a *)clwp->lwp_ap; 1201 1202 if (uap->fnamep == NULL) 1203 e = AUE_FSTAT; 1204 else if (uap->flags & AT_SYMLINK_NOFOLLOW) 1205 e = AUE_LSTAT; 1206 else 1207 e = AUE_STAT; 1208 1209 return (e); 1210 } 1211 1212 /* msgsys */ 1213 static au_event_t 1214 aui_msgsys(au_event_t e) 1215 { 1216 klwp_t *clwp = ttolwp(curthread); 1217 uint_t fm; 1218 1219 struct a { 1220 long id; /* function code id */ 1221 long ap; /* arg pointer for recvmsg */ 1222 } *uap = (struct a *)clwp->lwp_ap; 1223 1224 struct b { 1225 long msgid; 1226 long cmd; 1227 long buf; /* struct msqid_ds * */ 1228 } *uap1 = (struct b *)&clwp->lwp_ap[1]; 1229 1230 fm = (uint_t)uap->id; 1231 1232 switch (fm) { 1233 case 0: /* msgget */ 1234 e = AUE_MSGGET; 1235 break; 1236 case 1: /* msgctl */ 1237 switch ((uint_t)uap1->cmd) { 1238 case IPC_RMID: 1239 e = AUE_MSGCTL_RMID; 1240 break; 1241 case IPC_SET: 1242 e = AUE_MSGCTL_SET; 1243 break; 1244 case IPC_STAT: 1245 e = AUE_MSGCTL_STAT; 1246 break; 1247 default: 1248 e = AUE_MSGCTL; 1249 break; 1250 } 1251 break; 1252 case 2: /* msgrcv */ 1253 e = AUE_MSGRCV; 1254 break; 1255 case 3: /* msgsnd */ 1256 e = AUE_MSGSND; 1257 break; 1258 default: /* illegal system call */ 1259 e = AUE_NULL; 1260 break; 1261 } 1262 1263 return (e); 1264 } 1265 1266 1267 /* shmsys */ 1268 static au_event_t 1269 aui_shmsys(au_event_t e) 1270 { 1271 klwp_t *clwp = ttolwp(curthread); 1272 int fm; 1273 1274 struct a { /* shmsys */ 1275 long id; /* function code id */ 1276 } *uap = (struct a *)clwp->lwp_ap; 1277 1278 struct b { /* ctrl */ 1279 long shmid; 1280 long cmd; 1281 long arg; /* struct shmid_ds * */ 1282 } *uap1 = (struct b *)&clwp->lwp_ap[1]; 1283 fm = (uint_t)uap->id; 1284 1285 switch (fm) { 1286 case 0: /* shmat */ 1287 e = AUE_SHMAT; 1288 break; 1289 case 1: /* shmctl */ 1290 switch ((uint_t)uap1->cmd) { 1291 case IPC_RMID: 1292 e = AUE_SHMCTL_RMID; 1293 break; 1294 case IPC_SET: 1295 e = AUE_SHMCTL_SET; 1296 break; 1297 case IPC_STAT: 1298 e = AUE_SHMCTL_STAT; 1299 break; 1300 default: 1301 e = AUE_SHMCTL; 1302 break; 1303 } 1304 break; 1305 case 2: /* shmdt */ 1306 e = AUE_SHMDT; 1307 break; 1308 case 3: /* shmget */ 1309 e = AUE_SHMGET; 1310 break; 1311 default: /* illegal system call */ 1312 e = AUE_NULL; 1313 break; 1314 } 1315 1316 return (e); 1317 } 1318 1319 1320 /* semsys */ 1321 static au_event_t 1322 aui_semsys(au_event_t e) 1323 { 1324 klwp_t *clwp = ttolwp(curthread); 1325 uint_t fm; 1326 1327 struct a { /* semsys */ 1328 long id; 1329 } *uap = (struct a *)clwp->lwp_ap; 1330 1331 struct b { /* ctrl */ 1332 long semid; 1333 long semnum; 1334 long cmd; 1335 long arg; 1336 } *uap1 = (struct b *)&clwp->lwp_ap[1]; 1337 1338 fm = (uint_t)uap->id; 1339 1340 switch (fm) { 1341 case 0: /* semctl */ 1342 switch ((uint_t)uap1->cmd) { 1343 case IPC_RMID: 1344 e = AUE_SEMCTL_RMID; 1345 break; 1346 case IPC_SET: 1347 e = AUE_SEMCTL_SET; 1348 break; 1349 case IPC_STAT: 1350 e = AUE_SEMCTL_STAT; 1351 break; 1352 case GETNCNT: 1353 e = AUE_SEMCTL_GETNCNT; 1354 break; 1355 case GETPID: 1356 e = AUE_SEMCTL_GETPID; 1357 break; 1358 case GETVAL: 1359 e = AUE_SEMCTL_GETVAL; 1360 break; 1361 case GETALL: 1362 e = AUE_SEMCTL_GETALL; 1363 break; 1364 case GETZCNT: 1365 e = AUE_SEMCTL_GETZCNT; 1366 break; 1367 case SETVAL: 1368 e = AUE_SEMCTL_SETVAL; 1369 break; 1370 case SETALL: 1371 e = AUE_SEMCTL_SETALL; 1372 break; 1373 default: 1374 e = AUE_SEMCTL; 1375 break; 1376 } 1377 break; 1378 case 1: /* semget */ 1379 e = AUE_SEMGET; 1380 break; 1381 case 2: /* semop */ 1382 e = AUE_SEMOP; 1383 break; 1384 default: /* illegal system call */ 1385 e = AUE_NULL; 1386 break; 1387 } 1388 1389 return (e); 1390 } 1391 1392 /* utssys - uname(2), ustat(2), fusers(2) */ 1393 static au_event_t 1394 aui_utssys(au_event_t e) 1395 { 1396 klwp_t *clwp = ttolwp(curthread); 1397 uint_t type; 1398 1399 struct a { 1400 union { 1401 long cbuf; /* char * */ 1402 long ubuf; /* struct stat * */ 1403 } ub; 1404 union { 1405 long mv; /* for USTAT */ 1406 long flags; /* for FUSERS */ 1407 } un; 1408 long type; 1409 long outbp; /* char * for FUSERS */ 1410 } *uap = (struct a *)clwp->lwp_ap; 1411 1412 type = (uint_t)uap->type; 1413 1414 if (type == UTS_FUSERS) 1415 return (e); 1416 else 1417 return ((au_event_t)AUE_NULL); 1418 } 1419 1420 static au_event_t 1421 aui_fcntl(au_event_t e) 1422 { 1423 klwp_t *clwp = ttolwp(curthread); 1424 uint_t cmd; 1425 1426 struct a { 1427 long fdes; 1428 long cmd; 1429 long arg; 1430 } *uap = (struct a *)clwp->lwp_ap; 1431 1432 cmd = (uint_t)uap->cmd; 1433 1434 switch (cmd) { 1435 case F_GETLK: 1436 case F_SETLK: 1437 case F_SETLKW: 1438 break; 1439 case F_SETFL: 1440 case F_GETFL: 1441 case F_GETFD: 1442 break; 1443 default: 1444 e = (au_event_t)AUE_NULL; 1445 break; 1446 } 1447 return ((au_event_t)e); 1448 } 1449 1450 /* null function for now */ 1451 static au_event_t 1452 aui_execve(au_event_t e) 1453 { 1454 return (e); 1455 } 1456 1457 /*ARGSUSED*/ 1458 static void 1459 aus_fcntl(struct t_audit_data *tad) 1460 { 1461 klwp_t *clwp = ttolwp(curthread); 1462 uint32_t cmd, fd, flags; 1463 struct file *fp; 1464 struct vnode *vp; 1465 struct f_audit_data *fad; 1466 1467 struct a { 1468 long fd; 1469 long cmd; 1470 long arg; 1471 } *uap = (struct a *)clwp->lwp_ap; 1472 1473 cmd = (uint32_t)uap->cmd; 1474 fd = (uint32_t)uap->fd; 1475 flags = (uint32_t)uap->arg; 1476 1477 au_uwrite(au_to_arg32(2, "cmd", cmd)); 1478 1479 if (cmd == F_SETFL) 1480 au_uwrite(au_to_arg32(3, "flags", flags)); 1481 1482 /* 1483 * convert file pointer to file descriptor 1484 * Note: fd ref count incremented here. 1485 */ 1486 if ((fp = getf(fd)) == NULL) 1487 return; 1488 1489 /* get path from file struct here */ 1490 fad = F2A(fp); 1491 if (fad->fad_aupath != NULL) { 1492 au_uwrite(au_to_path(fad->fad_aupath)); 1493 } else { 1494 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 1495 } 1496 1497 vp = fp->f_vnode; 1498 audit_attributes(vp); 1499 1500 /* decrement file descriptor reference count */ 1501 releasef(fd); 1502 } 1503 1504 /*ARGSUSED*/ 1505 static void 1506 aus_kill(struct t_audit_data *tad) 1507 { 1508 klwp_t *clwp = ttolwp(curthread); 1509 struct proc *p; 1510 uint32_t signo; 1511 uid_t uid, ruid; 1512 gid_t gid, rgid; 1513 pid_t pid; 1514 const auditinfo_addr_t *ainfo; 1515 cred_t *cr; 1516 1517 struct a { 1518 long pid; 1519 long signo; 1520 } *uap = (struct a *)clwp->lwp_ap; 1521 1522 pid = (pid_t)uap->pid; 1523 signo = (uint32_t)uap->signo; 1524 1525 au_uwrite(au_to_arg32(2, "signal", signo)); 1526 if (pid > 0) { 1527 mutex_enter(&pidlock); 1528 if (((p = prfind(pid)) == (struct proc *)0) || 1529 (p->p_stat == SIDL)) { 1530 mutex_exit(&pidlock); 1531 au_uwrite(au_to_arg32(1, "process", (uint32_t)pid)); 1532 return; 1533 } 1534 mutex_enter(&p->p_lock); /* so process doesn't go away */ 1535 mutex_exit(&pidlock); 1536 1537 mutex_enter(&p->p_crlock); 1538 crhold(cr = p->p_cred); 1539 mutex_exit(&p->p_crlock); 1540 mutex_exit(&p->p_lock); 1541 1542 ainfo = crgetauinfo(cr); 1543 if (ainfo == NULL) { 1544 crfree(cr); 1545 au_uwrite(au_to_arg32(1, "process", (uint32_t)pid)); 1546 return; 1547 } 1548 1549 uid = crgetuid(cr); 1550 gid = crgetgid(cr); 1551 ruid = crgetruid(cr); 1552 rgid = crgetrgid(cr); 1553 au_uwrite(au_to_process(uid, gid, ruid, rgid, pid, 1554 ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid)); 1555 1556 if (is_system_labeled()) 1557 au_uwrite(au_to_label(CR_SL(cr))); 1558 1559 crfree(cr); 1560 } 1561 else 1562 au_uwrite(au_to_arg32(1, "process", (uint32_t)pid)); 1563 } 1564 1565 /*ARGSUSED*/ 1566 static void 1567 aus_mkdir(struct t_audit_data *tad) 1568 { 1569 klwp_t *clwp = ttolwp(curthread); 1570 uint32_t dmode; 1571 1572 struct a { 1573 long dirnamep; /* char * */ 1574 long dmode; 1575 } *uap = (struct a *)clwp->lwp_ap; 1576 1577 dmode = (uint32_t)uap->dmode; 1578 1579 au_uwrite(au_to_arg32(2, "mode", dmode)); 1580 } 1581 1582 /*ARGSUSED*/ 1583 static void 1584 aus_mkdirat(struct t_audit_data *tad) 1585 { 1586 klwp_t *clwp = ttolwp(curthread); 1587 uint32_t dmode; 1588 1589 struct a { 1590 long fd; 1591 long dirnamep; /* char * */ 1592 long dmode; 1593 } *uap = (struct a *)clwp->lwp_ap; 1594 1595 dmode = (uint32_t)uap->dmode; 1596 1597 au_uwrite(au_to_arg32(2, "mode", dmode)); 1598 } 1599 1600 /*ARGSUSED*/ 1601 static void 1602 aus_mknod(struct t_audit_data *tad) 1603 { 1604 klwp_t *clwp = ttolwp(curthread); 1605 uint32_t fmode; 1606 dev_t dev; 1607 1608 struct a { 1609 long pnamep; /* char * */ 1610 long fmode; 1611 long dev; 1612 } *uap = (struct a *)clwp->lwp_ap; 1613 1614 fmode = (uint32_t)uap->fmode; 1615 dev = (dev_t)uap->dev; 1616 1617 au_uwrite(au_to_arg32(2, "mode", fmode)); 1618 #ifdef _LP64 1619 au_uwrite(au_to_arg64(3, "dev", dev)); 1620 #else 1621 au_uwrite(au_to_arg32(3, "dev", dev)); 1622 #endif 1623 } 1624 1625 /*ARGSUSED*/ 1626 static void 1627 auf_mknod(struct t_audit_data *tad, int error, rval_t *rval) 1628 { 1629 klwp_t *clwp = ttolwp(curthread); 1630 vnode_t *dvp; 1631 caddr_t pnamep; 1632 1633 struct a { 1634 long pnamep; /* char * */ 1635 long fmode; 1636 long dev; 1637 } *uap = (struct a *)clwp->lwp_ap; 1638 1639 /* no error, then already path token in audit record */ 1640 if (error != EPERM && error != EINVAL) 1641 return; 1642 1643 /* do the lookup to force generation of path token */ 1644 pnamep = (caddr_t)uap->pnamep; 1645 tad->tad_ctrl |= TAD_NOATTRB; 1646 error = lookupname(pnamep, UIO_USERSPACE, NO_FOLLOW, &dvp, NULLVPP); 1647 if (error == 0) 1648 VN_RELE(dvp); 1649 } 1650 1651 /*ARGSUSED*/ 1652 static void 1653 aus_mknodat(struct t_audit_data *tad) 1654 { 1655 klwp_t *clwp = ttolwp(curthread); 1656 uint32_t fmode; 1657 dev_t dev; 1658 1659 struct a { 1660 long fd; 1661 long pnamep; /* char * */ 1662 long fmode; 1663 long dev; 1664 } *uap = (struct a *)clwp->lwp_ap; 1665 1666 fmode = (uint32_t)uap->fmode; 1667 dev = (dev_t)uap->dev; 1668 1669 au_uwrite(au_to_arg32(2, "mode", fmode)); 1670 #ifdef _LP64 1671 au_uwrite(au_to_arg64(3, "dev", dev)); 1672 #else 1673 au_uwrite(au_to_arg32(3, "dev", dev)); 1674 #endif 1675 } 1676 1677 /*ARGSUSED*/ 1678 static void 1679 auf_mknodat(struct t_audit_data *tad, int error, rval_t *rval) 1680 { 1681 klwp_t *clwp = ttolwp(curthread); 1682 vnode_t *startvp; 1683 vnode_t *dvp; 1684 caddr_t pnamep; 1685 int fd; 1686 1687 struct a { 1688 long fd; 1689 long pnamep; /* char * */ 1690 long fmode; 1691 long dev; 1692 } *uap = (struct a *)clwp->lwp_ap; 1693 1694 /* no error, then already path token in audit record */ 1695 if (error != EPERM && error != EINVAL) 1696 return; 1697 1698 /* do the lookup to force generation of path token */ 1699 fd = (int)uap->fd; 1700 pnamep = (caddr_t)uap->pnamep; 1701 if (pnamep == NULL || 1702 fgetstartvp(fd, pnamep, &startvp) != 0) 1703 return; 1704 tad->tad_ctrl |= TAD_NOATTRB; 1705 error = lookupnameat(pnamep, UIO_USERSPACE, NO_FOLLOW, &dvp, NULLVPP, 1706 startvp); 1707 if (error == 0) 1708 VN_RELE(dvp); 1709 if (startvp != NULL) 1710 VN_RELE(startvp); 1711 } 1712 1713 /*ARGSUSED*/ 1714 static void 1715 aus_mount(struct t_audit_data *tad) 1716 { /* AUS_START */ 1717 klwp_t *clwp = ttolwp(curthread); 1718 uint32_t flags; 1719 uintptr_t u_fstype, dataptr; 1720 STRUCT_DECL(nfs_args, nfsargs); 1721 size_t len; 1722 char *fstype, *hostname; 1723 1724 struct a { 1725 long spec; /* char * */ 1726 long dir; /* char * */ 1727 long flags; 1728 long fstype; /* char * */ 1729 long dataptr; /* char * */ 1730 long datalen; 1731 } *uap = (struct a *)clwp->lwp_ap; 1732 1733 u_fstype = (uintptr_t)uap->fstype; 1734 flags = (uint32_t)uap->flags; 1735 dataptr = (uintptr_t)uap->dataptr; 1736 1737 fstype = kmem_alloc(MAXNAMELEN, KM_SLEEP); 1738 if (copyinstr((caddr_t)u_fstype, (caddr_t)fstype, MAXNAMELEN, &len)) 1739 goto mount_free_fstype; 1740 1741 au_uwrite(au_to_arg32(3, "flags", flags)); 1742 au_uwrite(au_to_text(fstype)); 1743 1744 if (strncmp(fstype, "nfs", 3) == 0) { 1745 1746 STRUCT_INIT(nfsargs, get_udatamodel()); 1747 bzero(STRUCT_BUF(nfsargs), STRUCT_SIZE(nfsargs)); 1748 1749 if (copyin((caddr_t)dataptr, 1750 STRUCT_BUF(nfsargs), 1751 MIN(uap->datalen, STRUCT_SIZE(nfsargs)))) { 1752 /* DEBUG debug_enter((char *)NULL); */ 1753 goto mount_free_fstype; 1754 } 1755 hostname = kmem_alloc(MAXNAMELEN, KM_SLEEP); 1756 if (copyinstr(STRUCT_FGETP(nfsargs, hostname), 1757 (caddr_t)hostname, 1758 MAXNAMELEN, &len)) { 1759 goto mount_free_hostname; 1760 } 1761 au_uwrite(au_to_text(hostname)); 1762 au_uwrite(au_to_arg32(3, "internal flags", 1763 (uint_t)STRUCT_FGET(nfsargs, flags))); 1764 1765 mount_free_hostname: 1766 kmem_free(hostname, MAXNAMELEN); 1767 } 1768 1769 mount_free_fstype: 1770 kmem_free(fstype, MAXNAMELEN); 1771 } /* AUS_MOUNT */ 1772 1773 static void 1774 aus_umount_path(caddr_t umount_dir) 1775 { 1776 char *dir_path; 1777 struct audit_path *path; 1778 size_t path_len, dir_len; 1779 1780 /* length alloc'd for two string pointers */ 1781 path_len = sizeof (struct audit_path) + sizeof (char *); 1782 path = kmem_alloc(path_len, KM_SLEEP); 1783 dir_path = kmem_alloc(MAXPATHLEN, KM_SLEEP); 1784 1785 if (copyinstr(umount_dir, (caddr_t)dir_path, 1786 MAXPATHLEN, &dir_len)) 1787 goto umount2_free_dir; 1788 1789 /* 1790 * the audit_path struct assumes that the buffer pointed to 1791 * by audp_sect[n] contains string 0 immediatedly followed 1792 * by string 1. 1793 */ 1794 path->audp_sect[0] = dir_path; 1795 path->audp_sect[1] = dir_path + strlen(dir_path) + 1; 1796 path->audp_size = path_len; 1797 path->audp_ref = 1; /* not used */ 1798 path->audp_cnt = 1; /* one path string */ 1799 1800 au_uwrite(au_to_path(path)); 1801 1802 umount2_free_dir: 1803 kmem_free(dir_path, MAXPATHLEN); 1804 kmem_free(path, path_len); 1805 } 1806 1807 /*ARGSUSED*/ 1808 static void 1809 aus_umount2(struct t_audit_data *tad) 1810 { 1811 klwp_t *clwp = ttolwp(curthread); 1812 struct a { 1813 long dir; /* char * */ 1814 long flags; 1815 } *uap = (struct a *)clwp->lwp_ap; 1816 1817 aus_umount_path((caddr_t)uap->dir); 1818 1819 au_uwrite(au_to_arg32(2, "flags", (uint32_t)uap->flags)); 1820 } 1821 1822 static void 1823 aus_msgsys(struct t_audit_data *tad) 1824 { 1825 klwp_t *clwp = ttolwp(curthread); 1826 uint32_t msgid; 1827 1828 struct b { 1829 long msgid; 1830 long cmd; 1831 long buf; /* struct msqid_ds * */ 1832 } *uap1 = (struct b *)&clwp->lwp_ap[1]; 1833 1834 msgid = (uint32_t)uap1->msgid; 1835 1836 1837 switch (tad->tad_event) { 1838 case AUE_MSGGET: /* msgget */ 1839 au_uwrite(au_to_arg32(1, "msg key", msgid)); 1840 break; 1841 case AUE_MSGCTL: /* msgctl */ 1842 case AUE_MSGCTL_RMID: /* msgctl */ 1843 case AUE_MSGCTL_SET: /* msgctl */ 1844 case AUE_MSGCTL_STAT: /* msgctl */ 1845 case AUE_MSGRCV: /* msgrcv */ 1846 case AUE_MSGSND: /* msgsnd */ 1847 au_uwrite(au_to_arg32(1, "msg ID", msgid)); 1848 break; 1849 } 1850 } 1851 1852 /*ARGSUSED*/ 1853 static void 1854 auf_msgsys(struct t_audit_data *tad, int error, rval_t *rval) 1855 { 1856 int id; 1857 1858 if (error != 0) 1859 return; 1860 if (tad->tad_event == AUE_MSGGET) { 1861 uint32_t scid; 1862 uint32_t sy_flags; 1863 1864 /* need to determine type of executing binary */ 1865 scid = tad->tad_scid; 1866 #ifdef _SYSCALL32_IMPL 1867 if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE) 1868 sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 1869 else 1870 sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK; 1871 #else 1872 sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 1873 #endif 1874 if (sy_flags == SE_32RVAL1) 1875 id = rval->r_val1; 1876 if (sy_flags == (SE_32RVAL2|SE_32RVAL1)) 1877 id = rval->r_val1; 1878 if (sy_flags == SE_64RVAL) 1879 id = (int)rval->r_vals; 1880 1881 au_uwrite(au_to_ipc(AT_IPC_MSG, id)); 1882 } 1883 } 1884 1885 static void 1886 aus_semsys(struct t_audit_data *tad) 1887 { 1888 klwp_t *clwp = ttolwp(curthread); 1889 uint32_t semid; 1890 1891 struct b { /* ctrl */ 1892 long semid; 1893 long semnum; 1894 long cmd; 1895 long arg; 1896 } *uap1 = (struct b *)&clwp->lwp_ap[1]; 1897 1898 semid = (uint32_t)uap1->semid; 1899 1900 switch (tad->tad_event) { 1901 case AUE_SEMCTL_RMID: 1902 case AUE_SEMCTL_STAT: 1903 case AUE_SEMCTL_GETNCNT: 1904 case AUE_SEMCTL_GETPID: 1905 case AUE_SEMCTL_GETVAL: 1906 case AUE_SEMCTL_GETALL: 1907 case AUE_SEMCTL_GETZCNT: 1908 case AUE_SEMCTL_SET: 1909 case AUE_SEMCTL_SETVAL: 1910 case AUE_SEMCTL_SETALL: 1911 case AUE_SEMCTL: 1912 case AUE_SEMOP: 1913 au_uwrite(au_to_arg32(1, "sem ID", semid)); 1914 break; 1915 case AUE_SEMGET: 1916 au_uwrite(au_to_arg32(1, "sem key", semid)); 1917 break; 1918 } 1919 } 1920 1921 /*ARGSUSED*/ 1922 static void 1923 auf_semsys(struct t_audit_data *tad, int error, rval_t *rval) 1924 { 1925 int id; 1926 1927 if (error != 0) 1928 return; 1929 if (tad->tad_event == AUE_SEMGET) { 1930 uint32_t scid; 1931 uint32_t sy_flags; 1932 1933 /* need to determine type of executing binary */ 1934 scid = tad->tad_scid; 1935 #ifdef _SYSCALL32_IMPL 1936 if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE) 1937 sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 1938 else 1939 sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK; 1940 #else 1941 sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 1942 #endif 1943 if (sy_flags == SE_32RVAL1) 1944 id = rval->r_val1; 1945 if (sy_flags == (SE_32RVAL2|SE_32RVAL1)) 1946 id = rval->r_val1; 1947 if (sy_flags == SE_64RVAL) 1948 id = (int)rval->r_vals; 1949 1950 au_uwrite(au_to_ipc(AT_IPC_SEM, id)); 1951 } 1952 } 1953 1954 /*ARGSUSED*/ 1955 static void 1956 aus_close(struct t_audit_data *tad) 1957 { 1958 klwp_t *clwp = ttolwp(curthread); 1959 uint32_t fd; 1960 struct file *fp; 1961 struct f_audit_data *fad; 1962 struct vnode *vp; 1963 struct vattr attr; 1964 au_kcontext_t *kctx = GET_KCTX_PZ; 1965 1966 struct a { 1967 long i; 1968 } *uap = (struct a *)clwp->lwp_ap; 1969 1970 fd = (uint32_t)uap->i; 1971 1972 attr.va_mask = 0; 1973 au_uwrite(au_to_arg32(1, "fd", fd)); 1974 1975 /* 1976 * convert file pointer to file descriptor 1977 * Note: fd ref count incremented here. 1978 */ 1979 if ((fp = getf(fd)) == NULL) 1980 return; 1981 1982 fad = F2A(fp); 1983 tad->tad_evmod = (au_emod_t)fad->fad_flags; 1984 if (fad->fad_aupath != NULL) { 1985 au_uwrite(au_to_path(fad->fad_aupath)); 1986 if ((vp = fp->f_vnode) != NULL) { 1987 attr.va_mask = AT_ALL; 1988 if (VOP_GETATTR(vp, &attr, 0, CRED(), NULL) == 0) { 1989 /* 1990 * When write was not used and the file can be 1991 * considered public, skip the audit. 1992 */ 1993 if (((fp->f_flag & FWRITE) == 0) && 1994 object_is_public(&attr)) { 1995 tad->tad_flag = 0; 1996 tad->tad_evmod = 0; 1997 /* free any residual audit data */ 1998 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 1999 releasef(fd); 2000 return; 2001 } 2002 au_uwrite(au_to_attr(&attr)); 2003 audit_sec_attributes(&(u_ad), vp); 2004 } 2005 } 2006 } 2007 2008 /* decrement file descriptor reference count */ 2009 releasef(fd); 2010 } 2011 2012 /*ARGSUSED*/ 2013 static void 2014 aus_fstatfs(struct t_audit_data *tad) 2015 { 2016 klwp_t *clwp = ttolwp(curthread); 2017 uint32_t fd; 2018 struct file *fp; 2019 struct vnode *vp; 2020 struct f_audit_data *fad; 2021 2022 struct a { 2023 long fd; 2024 long buf; /* struct statfs * */ 2025 } *uap = (struct a *)clwp->lwp_ap; 2026 2027 fd = (uint_t)uap->fd; 2028 2029 /* 2030 * convert file pointer to file descriptor 2031 * Note: fd ref count incremented here. 2032 */ 2033 if ((fp = getf(fd)) == NULL) 2034 return; 2035 2036 /* get path from file struct here */ 2037 fad = F2A(fp); 2038 if (fad->fad_aupath != NULL) { 2039 au_uwrite(au_to_path(fad->fad_aupath)); 2040 } else { 2041 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 2042 } 2043 2044 vp = fp->f_vnode; 2045 audit_attributes(vp); 2046 2047 /* decrement file descriptor reference count */ 2048 releasef(fd); 2049 } 2050 2051 static au_event_t 2052 aui_setpgrp(au_event_t e) 2053 { 2054 klwp_t *clwp = ttolwp(curthread); 2055 int flag; 2056 2057 struct a { 2058 long flag; 2059 long pid; 2060 long pgid; 2061 } *uap = (struct a *)clwp->lwp_ap; 2062 2063 flag = (int)uap->flag; 2064 2065 2066 switch (flag) { 2067 2068 case 1: /* setpgrp() */ 2069 e = AUE_SETPGRP; 2070 break; 2071 2072 case 3: /* setsid() */ 2073 e = AUE_SETSID; 2074 break; 2075 2076 case 5: /* setpgid() */ 2077 e = AUE_SETPGID; 2078 break; 2079 2080 case 0: /* getpgrp() - not security relevant */ 2081 case 2: /* getsid() - not security relevant */ 2082 case 4: /* getpgid() - not security relevant */ 2083 e = AUE_NULL; 2084 break; 2085 2086 default: 2087 e = AUE_NULL; 2088 break; 2089 } 2090 2091 return (e); 2092 } 2093 2094 /*ARGSUSED*/ 2095 static void 2096 aus_setpgrp(struct t_audit_data *tad) 2097 { 2098 klwp_t *clwp = ttolwp(curthread); 2099 pid_t pgid; 2100 struct proc *p; 2101 uid_t uid, ruid; 2102 gid_t gid, rgid; 2103 pid_t pid; 2104 cred_t *cr; 2105 int flag; 2106 const auditinfo_addr_t *ainfo; 2107 2108 struct a { 2109 long flag; 2110 long pid; 2111 long pgid; 2112 } *uap = (struct a *)clwp->lwp_ap; 2113 2114 flag = (int)uap->flag; 2115 pid = (pid_t)uap->pid; 2116 pgid = (pid_t)uap->pgid; 2117 2118 2119 switch (flag) { 2120 2121 case 0: /* getpgrp() */ 2122 case 1: /* setpgrp() */ 2123 case 2: /* getsid() */ 2124 case 3: /* setsid() */ 2125 case 4: /* getpgid() */ 2126 break; 2127 2128 case 5: /* setpgid() */ 2129 2130 /* current process? */ 2131 if (pid == 0) { 2132 return; 2133 } 2134 2135 mutex_enter(&pidlock); 2136 p = prfind(pid); 2137 if (p == NULL || p->p_as == &kas || 2138 p->p_stat == SIDL || p->p_stat == SZOMB) { 2139 mutex_exit(&pidlock); 2140 return; 2141 } 2142 mutex_enter(&p->p_lock); /* so process doesn't go away */ 2143 mutex_exit(&pidlock); 2144 2145 mutex_enter(&p->p_crlock); 2146 crhold(cr = p->p_cred); 2147 mutex_exit(&p->p_crlock); 2148 mutex_exit(&p->p_lock); 2149 2150 ainfo = crgetauinfo(cr); 2151 if (ainfo == NULL) { 2152 crfree(cr); 2153 return; 2154 } 2155 2156 uid = crgetuid(cr); 2157 gid = crgetgid(cr); 2158 ruid = crgetruid(cr); 2159 rgid = crgetrgid(cr); 2160 au_uwrite(au_to_process(uid, gid, ruid, rgid, pid, 2161 ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid)); 2162 crfree(cr); 2163 au_uwrite(au_to_arg32(2, "pgid", pgid)); 2164 break; 2165 2166 default: 2167 break; 2168 } 2169 } 2170 2171 2172 /*ARGSUSED*/ 2173 static void 2174 aus_setregid(struct t_audit_data *tad) 2175 { 2176 klwp_t *clwp = ttolwp(curthread); 2177 uint32_t rgid, egid; 2178 2179 struct a { 2180 long rgid; 2181 long egid; 2182 } *uap = (struct a *)clwp->lwp_ap; 2183 2184 rgid = (uint32_t)uap->rgid; 2185 egid = (uint32_t)uap->egid; 2186 2187 au_uwrite(au_to_arg32(1, "rgid", rgid)); 2188 au_uwrite(au_to_arg32(2, "egid", egid)); 2189 } 2190 2191 /*ARGSUSED*/ 2192 static void 2193 aus_setgid(struct t_audit_data *tad) 2194 { 2195 klwp_t *clwp = ttolwp(curthread); 2196 uint32_t gid; 2197 2198 struct a { 2199 long gid; 2200 } *uap = (struct a *)clwp->lwp_ap; 2201 2202 gid = (uint32_t)uap->gid; 2203 2204 au_uwrite(au_to_arg32(1, "gid", gid)); 2205 } 2206 2207 2208 /*ARGSUSED*/ 2209 static void 2210 aus_setreuid(struct t_audit_data *tad) 2211 { 2212 klwp_t *clwp = ttolwp(curthread); 2213 uint32_t ruid, euid; 2214 2215 struct a { 2216 long ruid; 2217 long euid; 2218 } *uap = (struct a *)clwp->lwp_ap; 2219 2220 ruid = (uint32_t)uap->ruid; 2221 euid = (uint32_t)uap->euid; 2222 2223 au_uwrite(au_to_arg32(1, "ruid", ruid)); 2224 au_uwrite(au_to_arg32(2, "euid", euid)); 2225 } 2226 2227 2228 /*ARGSUSED*/ 2229 static void 2230 aus_setuid(struct t_audit_data *tad) 2231 { 2232 klwp_t *clwp = ttolwp(curthread); 2233 uint32_t uid; 2234 2235 struct a { 2236 long uid; 2237 } *uap = (struct a *)clwp->lwp_ap; 2238 2239 uid = (uint32_t)uap->uid; 2240 2241 au_uwrite(au_to_arg32(1, "uid", uid)); 2242 } 2243 2244 /*ARGSUSED*/ 2245 static void 2246 aus_shmsys(struct t_audit_data *tad) 2247 { 2248 klwp_t *clwp = ttolwp(curthread); 2249 uint32_t id, cmd; 2250 2251 struct b { 2252 long id; 2253 long cmd; 2254 long buf; /* struct shmid_ds * */ 2255 } *uap1 = (struct b *)&clwp->lwp_ap[1]; 2256 2257 id = (uint32_t)uap1->id; 2258 cmd = (uint32_t)uap1->cmd; 2259 2260 switch (tad->tad_event) { 2261 case AUE_SHMGET: /* shmget */ 2262 au_uwrite(au_to_arg32(1, "shm key", id)); 2263 break; 2264 case AUE_SHMCTL: /* shmctl */ 2265 case AUE_SHMCTL_RMID: /* shmctl */ 2266 case AUE_SHMCTL_STAT: /* shmctl */ 2267 case AUE_SHMCTL_SET: /* shmctl */ 2268 au_uwrite(au_to_arg32(1, "shm ID", id)); 2269 break; 2270 case AUE_SHMDT: /* shmdt */ 2271 au_uwrite(au_to_arg32(1, "shm adr", id)); 2272 break; 2273 case AUE_SHMAT: /* shmat */ 2274 au_uwrite(au_to_arg32(1, "shm ID", id)); 2275 au_uwrite(au_to_arg32(2, "shm adr", cmd)); 2276 break; 2277 } 2278 } 2279 2280 /*ARGSUSED*/ 2281 static void 2282 auf_shmsys(struct t_audit_data *tad, int error, rval_t *rval) 2283 { 2284 int id; 2285 2286 if (error != 0) 2287 return; 2288 if (tad->tad_event == AUE_SHMGET) { 2289 uint32_t scid; 2290 uint32_t sy_flags; 2291 2292 /* need to determine type of executing binary */ 2293 scid = tad->tad_scid; 2294 #ifdef _SYSCALL32_IMPL 2295 if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE) 2296 sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 2297 else 2298 sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK; 2299 #else 2300 sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 2301 #endif 2302 if (sy_flags == SE_32RVAL1) 2303 id = rval->r_val1; 2304 if (sy_flags == (SE_32RVAL2|SE_32RVAL1)) 2305 id = rval->r_val1; 2306 if (sy_flags == SE_64RVAL) 2307 id = (int)rval->r_vals; 2308 au_uwrite(au_to_ipc(AT_IPC_SHM, id)); 2309 } 2310 } 2311 2312 2313 /*ARGSUSED*/ 2314 static void 2315 aus_ioctl(struct t_audit_data *tad) 2316 { 2317 klwp_t *clwp = ttolwp(curthread); 2318 struct file *fp; 2319 struct vnode *vp; 2320 struct f_audit_data *fad; 2321 uint32_t fd, cmd; 2322 uintptr_t cmarg; 2323 2324 /* XX64 */ 2325 struct a { 2326 long fd; 2327 long cmd; 2328 long cmarg; /* caddr_t */ 2329 } *uap = (struct a *)clwp->lwp_ap; 2330 2331 fd = (uint32_t)uap->fd; 2332 cmd = (uint32_t)uap->cmd; 2333 cmarg = (uintptr_t)uap->cmarg; 2334 2335 /* 2336 * convert file pointer to file descriptor 2337 * Note: fd ref count incremented here. 2338 */ 2339 if ((fp = getf(fd)) == NULL) { 2340 au_uwrite(au_to_arg32(1, "fd", fd)); 2341 au_uwrite(au_to_arg32(2, "cmd", cmd)); 2342 #ifndef _LP64 2343 au_uwrite(au_to_arg32(3, "arg", (uint32_t)cmarg)); 2344 #else 2345 au_uwrite(au_to_arg64(3, "arg", (uint64_t)cmarg)); 2346 #endif 2347 return; 2348 } 2349 2350 /* get path from file struct here */ 2351 fad = F2A(fp); 2352 if (fad->fad_aupath != NULL) { 2353 au_uwrite(au_to_path(fad->fad_aupath)); 2354 } else { 2355 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 2356 } 2357 2358 vp = fp->f_vnode; 2359 audit_attributes(vp); 2360 2361 /* decrement file descriptor reference count */ 2362 releasef(fd); 2363 2364 au_uwrite(au_to_arg32(2, "cmd", cmd)); 2365 #ifndef _LP64 2366 au_uwrite(au_to_arg32(3, "arg", (uint32_t)cmarg)); 2367 #else 2368 au_uwrite(au_to_arg64(3, "arg", (uint64_t)cmarg)); 2369 #endif 2370 } 2371 2372 /* 2373 * null function for memcntl for now. We might want to limit memcntl() 2374 * auditing to commands: MC_LOCKAS, MC_LOCK, MC_UNLOCKAS, MC_UNLOCK which 2375 * require privileges. 2376 */ 2377 static au_event_t 2378 aui_memcntl(au_event_t e) 2379 { 2380 return (e); 2381 } 2382 2383 /*ARGSUSED*/ 2384 static au_event_t 2385 aui_privsys(au_event_t e) 2386 { 2387 klwp_t *clwp = ttolwp(curthread); 2388 2389 struct a { 2390 long opcode; 2391 } *uap = (struct a *)clwp->lwp_ap; 2392 2393 switch (uap->opcode) { 2394 case PRIVSYS_SETPPRIV: 2395 return (AUE_SETPPRIV); 2396 default: 2397 return (AUE_NULL); 2398 } 2399 } 2400 2401 /*ARGSUSED*/ 2402 static void 2403 aus_memcntl(struct t_audit_data *tad) 2404 { 2405 klwp_t *clwp = ttolwp(curthread); 2406 2407 struct a { 2408 long addr; 2409 long len; 2410 long cmd; 2411 long arg; 2412 long attr; 2413 long mask; 2414 } *uap = (struct a *)clwp->lwp_ap; 2415 2416 #ifdef _LP64 2417 au_uwrite(au_to_arg64(1, "base", (uint64_t)uap->addr)); 2418 au_uwrite(au_to_arg64(2, "len", (uint64_t)uap->len)); 2419 #else 2420 au_uwrite(au_to_arg32(1, "base", (uint32_t)uap->addr)); 2421 au_uwrite(au_to_arg32(2, "len", (uint32_t)uap->len)); 2422 #endif 2423 au_uwrite(au_to_arg32(3, "cmd", (uint_t)uap->cmd)); 2424 #ifdef _LP64 2425 au_uwrite(au_to_arg64(4, "arg", (uint64_t)uap->arg)); 2426 #else 2427 au_uwrite(au_to_arg32(4, "arg", (uint32_t)uap->arg)); 2428 #endif 2429 au_uwrite(au_to_arg32(5, "attr", (uint_t)uap->attr)); 2430 au_uwrite(au_to_arg32(6, "mask", (uint_t)uap->mask)); 2431 } 2432 2433 /*ARGSUSED*/ 2434 static void 2435 aus_mmap(struct t_audit_data *tad) 2436 { 2437 klwp_t *clwp = ttolwp(curthread); 2438 struct file *fp; 2439 struct f_audit_data *fad; 2440 struct vnode *vp; 2441 uint32_t fd; 2442 2443 struct a { 2444 long addr; 2445 long len; 2446 long prot; 2447 long flags; 2448 long fd; 2449 long pos; 2450 } *uap = (struct a *)clwp->lwp_ap; 2451 2452 fd = (uint32_t)uap->fd; 2453 2454 #ifdef _LP64 2455 au_uwrite(au_to_arg64(1, "addr", (uint64_t)uap->addr)); 2456 au_uwrite(au_to_arg64(2, "len", (uint64_t)uap->len)); 2457 #else 2458 au_uwrite(au_to_arg32(1, "addr", (uint32_t)uap->addr)); 2459 au_uwrite(au_to_arg32(2, "len", (uint32_t)uap->len)); 2460 #endif 2461 2462 if ((fp = getf(fd)) == NULL) { 2463 au_uwrite(au_to_arg32(5, "fd", (uint32_t)uap->fd)); 2464 return; 2465 } 2466 2467 /* 2468 * Mark in the tad if write access is NOT requested... if 2469 * this is later detected (in audit_attributes) to be a 2470 * public object, the mmap event may be discarded. 2471 */ 2472 if (((uap->prot) & PROT_WRITE) == 0) { 2473 tad->tad_ctrl |= TAD_PUBLIC_EV; 2474 } 2475 2476 fad = F2A(fp); 2477 if (fad->fad_aupath != NULL) { 2478 au_uwrite(au_to_path(fad->fad_aupath)); 2479 } else { 2480 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 2481 } 2482 2483 vp = (struct vnode *)fp->f_vnode; 2484 audit_attributes(vp); 2485 2486 /* mark READ/WRITE since we can't predict access */ 2487 if (uap->prot & PROT_READ) 2488 fad->fad_flags |= FAD_READ; 2489 if (uap->prot & PROT_WRITE) 2490 fad->fad_flags |= FAD_WRITE; 2491 2492 /* decrement file descriptor reference count */ 2493 releasef(fd); 2494 2495 } /* AUS_MMAP */ 2496 2497 2498 2499 2500 /*ARGSUSED*/ 2501 static void 2502 aus_munmap(struct t_audit_data *tad) 2503 { 2504 klwp_t *clwp = ttolwp(curthread); 2505 2506 struct a { 2507 long addr; 2508 long len; 2509 } *uap = (struct a *)clwp->lwp_ap; 2510 2511 #ifdef _LP64 2512 au_uwrite(au_to_arg64(1, "addr", (uint64_t)uap->addr)); 2513 au_uwrite(au_to_arg64(2, "len", (uint64_t)uap->len)); 2514 #else 2515 au_uwrite(au_to_arg32(1, "addr", (uint32_t)uap->addr)); 2516 au_uwrite(au_to_arg32(2, "len", (uint32_t)uap->len)); 2517 #endif 2518 2519 } /* AUS_MUNMAP */ 2520 2521 2522 2523 2524 2525 2526 2527 /*ARGSUSED*/ 2528 static void 2529 aus_priocntlsys(struct t_audit_data *tad) 2530 { 2531 klwp_t *clwp = ttolwp(curthread); 2532 2533 struct a { 2534 long pc_version; 2535 long psp; /* procset_t */ 2536 long cmd; 2537 long arg; 2538 } *uap = (struct a *)clwp->lwp_ap; 2539 2540 au_uwrite(au_to_arg32(1, "pc_version", (uint32_t)uap->pc_version)); 2541 au_uwrite(au_to_arg32(3, "cmd", (uint32_t)uap->cmd)); 2542 2543 } /* AUS_PRIOCNTLSYS */ 2544 2545 2546 /*ARGSUSED*/ 2547 static void 2548 aus_setegid(struct t_audit_data *tad) 2549 { 2550 klwp_t *clwp = ttolwp(curthread); 2551 uint32_t gid; 2552 2553 struct a { 2554 long gid; 2555 } *uap = (struct a *)clwp->lwp_ap; 2556 2557 gid = (uint32_t)uap->gid; 2558 2559 au_uwrite(au_to_arg32(1, "gid", gid)); 2560 } /* AUS_SETEGID */ 2561 2562 2563 2564 2565 /*ARGSUSED*/ 2566 static void 2567 aus_setgroups(struct t_audit_data *tad) 2568 { 2569 klwp_t *clwp = ttolwp(curthread); 2570 int i; 2571 int gidsetsize; 2572 uintptr_t gidset; 2573 gid_t *gidlist; 2574 2575 struct a { 2576 long gidsetsize; 2577 long gidset; 2578 } *uap = (struct a *)clwp->lwp_ap; 2579 2580 gidsetsize = (uint_t)uap->gidsetsize; 2581 gidset = (uintptr_t)uap->gidset; 2582 2583 if ((gidsetsize > NGROUPS_MAX_DEFAULT) || (gidsetsize < 0)) 2584 return; 2585 if (gidsetsize != 0) { 2586 gidlist = kmem_alloc(gidsetsize * sizeof (gid_t), 2587 KM_SLEEP); 2588 if (copyin((caddr_t)gidset, gidlist, 2589 gidsetsize * sizeof (gid_t)) == 0) 2590 for (i = 0; i < gidsetsize; i++) 2591 au_uwrite(au_to_arg32(1, "setgroups", 2592 (uint32_t)gidlist[i])); 2593 kmem_free(gidlist, gidsetsize * sizeof (gid_t)); 2594 } else 2595 au_uwrite(au_to_arg32(1, "setgroups", (uint32_t)0)); 2596 2597 } /* AUS_SETGROUPS */ 2598 2599 2600 2601 2602 2603 /*ARGSUSED*/ 2604 static void 2605 aus_seteuid(struct t_audit_data *tad) 2606 { 2607 klwp_t *clwp = ttolwp(curthread); 2608 uint32_t uid; 2609 2610 struct a { 2611 long uid; 2612 } *uap = (struct a *)clwp->lwp_ap; 2613 2614 uid = (uint32_t)uap->uid; 2615 2616 au_uwrite(au_to_arg32(1, "euid", uid)); 2617 2618 } /* AUS_SETEUID */ 2619 2620 /*ARGSUSED*/ 2621 static void 2622 aus_putmsg(struct t_audit_data *tad) 2623 { 2624 klwp_t *clwp = ttolwp(curthread); 2625 uint32_t fd, pri; 2626 struct file *fp; 2627 struct f_audit_data *fad; 2628 2629 struct a { 2630 long fdes; 2631 long ctl; /* struct strbuf * */ 2632 long data; /* struct strbuf * */ 2633 long pri; 2634 } *uap = (struct a *)clwp->lwp_ap; 2635 2636 fd = (uint32_t)uap->fdes; 2637 pri = (uint32_t)uap->pri; 2638 2639 au_uwrite(au_to_arg32(1, "fd", fd)); 2640 2641 if ((fp = getf(fd)) != NULL) { 2642 fad = F2A(fp); 2643 2644 fad->fad_flags |= FAD_WRITE; 2645 2646 /* add path name to audit record */ 2647 if (fad->fad_aupath != NULL) { 2648 au_uwrite(au_to_path(fad->fad_aupath)); 2649 } 2650 audit_attributes(fp->f_vnode); 2651 2652 releasef(fd); 2653 } 2654 2655 au_uwrite(au_to_arg32(4, "pri", pri)); 2656 } 2657 2658 /*ARGSUSED*/ 2659 static void 2660 aus_putpmsg(struct t_audit_data *tad) 2661 { 2662 klwp_t *clwp = ttolwp(curthread); 2663 uint32_t fd, pri, flags; 2664 struct file *fp; 2665 struct f_audit_data *fad; 2666 2667 struct a { 2668 long fdes; 2669 long ctl; /* struct strbuf * */ 2670 long data; /* struct strbuf * */ 2671 long pri; 2672 long flags; 2673 } *uap = (struct a *)clwp->lwp_ap; 2674 2675 fd = (uint32_t)uap->fdes; 2676 pri = (uint32_t)uap->pri; 2677 flags = (uint32_t)uap->flags; 2678 2679 au_uwrite(au_to_arg32(1, "fd", fd)); 2680 2681 if ((fp = getf(fd)) != NULL) { 2682 fad = F2A(fp); 2683 2684 fad->fad_flags |= FAD_WRITE; 2685 2686 /* add path name to audit record */ 2687 if (fad->fad_aupath != NULL) { 2688 au_uwrite(au_to_path(fad->fad_aupath)); 2689 } 2690 audit_attributes(fp->f_vnode); 2691 2692 releasef(fd); 2693 } 2694 2695 2696 au_uwrite(au_to_arg32(4, "pri", pri)); 2697 au_uwrite(au_to_arg32(5, "flags", flags)); 2698 } 2699 2700 /*ARGSUSED*/ 2701 static void 2702 aus_getmsg(struct t_audit_data *tad) 2703 { 2704 klwp_t *clwp = ttolwp(curthread); 2705 uint32_t fd, pri; 2706 struct file *fp; 2707 struct f_audit_data *fad; 2708 2709 struct a { 2710 long fdes; 2711 long ctl; /* struct strbuf * */ 2712 long data; /* struct strbuf * */ 2713 long pri; 2714 } *uap = (struct a *)clwp->lwp_ap; 2715 2716 fd = (uint32_t)uap->fdes; 2717 pri = (uint32_t)uap->pri; 2718 2719 au_uwrite(au_to_arg32(1, "fd", fd)); 2720 2721 if ((fp = getf(fd)) != NULL) { 2722 fad = F2A(fp); 2723 2724 /* 2725 * read operation on this object 2726 */ 2727 fad->fad_flags |= FAD_READ; 2728 2729 /* add path name to audit record */ 2730 if (fad->fad_aupath != NULL) { 2731 au_uwrite(au_to_path(fad->fad_aupath)); 2732 } 2733 audit_attributes(fp->f_vnode); 2734 2735 releasef(fd); 2736 } 2737 2738 au_uwrite(au_to_arg32(4, "pri", pri)); 2739 } 2740 2741 /*ARGSUSED*/ 2742 static void 2743 aus_getpmsg(struct t_audit_data *tad) 2744 { 2745 klwp_t *clwp = ttolwp(curthread); 2746 uint32_t fd; 2747 struct file *fp; 2748 struct f_audit_data *fad; 2749 2750 struct a { 2751 long fdes; 2752 long ctl; /* struct strbuf * */ 2753 long data; /* struct strbuf * */ 2754 long pri; 2755 long flags; 2756 } *uap = (struct a *)clwp->lwp_ap; 2757 2758 fd = (uint32_t)uap->fdes; 2759 2760 au_uwrite(au_to_arg32(1, "fd", fd)); 2761 2762 if ((fp = getf(fd)) != NULL) { 2763 fad = F2A(fp); 2764 2765 /* 2766 * read operation on this object 2767 */ 2768 fad->fad_flags |= FAD_READ; 2769 2770 /* add path name to audit record */ 2771 if (fad->fad_aupath != NULL) { 2772 au_uwrite(au_to_path(fad->fad_aupath)); 2773 } 2774 audit_attributes(fp->f_vnode); 2775 2776 releasef(fd); 2777 } 2778 } 2779 2780 static au_event_t 2781 aui_labelsys(au_event_t e) 2782 { 2783 klwp_t *clwp = ttolwp(curthread); 2784 uint32_t code; 2785 uint32_t cmd; 2786 2787 struct a { 2788 long code; 2789 long cmd; 2790 } *uap = (struct a *)clwp->lwp_ap; 2791 2792 code = (uint32_t)uap->code; 2793 cmd = (uint32_t)uap->cmd; 2794 2795 /* not security relevant if not changing kernel cache */ 2796 if (cmd == TNDB_GET) 2797 return (AUE_NULL); 2798 2799 switch (code) { 2800 case TSOL_TNRH: 2801 e = AUE_LABELSYS_TNRH; 2802 break; 2803 case TSOL_TNRHTP: 2804 e = AUE_LABELSYS_TNRHTP; 2805 break; 2806 case TSOL_TNMLP: 2807 e = AUE_LABELSYS_TNMLP; 2808 break; 2809 default: 2810 e = AUE_NULL; 2811 break; 2812 } 2813 2814 return (e); 2815 2816 } 2817 2818 static void 2819 aus_labelsys(struct t_audit_data *tad) 2820 { 2821 klwp_t *clwp = ttolwp(curthread); 2822 uint32_t cmd; 2823 uintptr_t a2; 2824 2825 struct a { 2826 long code; 2827 long cmd; 2828 long a2; 2829 } *uap = (struct a *)clwp->lwp_ap; 2830 2831 cmd = (uint32_t)uap->cmd; 2832 a2 = (uintptr_t)uap->a2; 2833 2834 switch (tad->tad_event) { 2835 case AUE_LABELSYS_TNRH: 2836 { 2837 tsol_rhent_t *rhent; 2838 tnaddr_t *rh_addr; 2839 2840 au_uwrite(au_to_arg32(1, "cmd", cmd)); 2841 2842 /* Remaining args don't apply for FLUSH, so skip */ 2843 if (cmd == TNDB_FLUSH) 2844 break; 2845 2846 rhent = kmem_alloc(sizeof (tsol_rhent_t), KM_SLEEP); 2847 if (copyin((caddr_t)a2, rhent, sizeof (tsol_rhent_t))) { 2848 kmem_free(rhent, sizeof (tsol_rhent_t)); 2849 return; 2850 } 2851 2852 rh_addr = &rhent->rh_address; 2853 if (rh_addr->ta_family == AF_INET) { 2854 struct in_addr *ipaddr; 2855 2856 ipaddr = &(rh_addr->ta_addr_v4); 2857 au_uwrite(au_to_in_addr(ipaddr)); 2858 } else if (rh_addr->ta_family == AF_INET6) { 2859 int32_t *ipaddr; 2860 2861 ipaddr = (int32_t *)&(rh_addr->ta_addr_v6); 2862 au_uwrite(au_to_in_addr_ex(ipaddr)); 2863 } 2864 au_uwrite(au_to_arg32(2, "prefix len", rhent->rh_prefix)); 2865 2866 kmem_free(rhent, sizeof (tsol_rhent_t)); 2867 2868 break; 2869 } 2870 case AUE_LABELSYS_TNRHTP: 2871 { 2872 tsol_tpent_t *tpent; 2873 2874 au_uwrite(au_to_arg32(1, "cmd", cmd)); 2875 2876 /* Remaining args don't apply for FLUSH, so skip */ 2877 if (cmd == TNDB_FLUSH) 2878 break; 2879 2880 tpent = kmem_alloc(sizeof (tsol_tpent_t), KM_SLEEP); 2881 if (copyin((caddr_t)a2, tpent, sizeof (tsol_tpent_t))) { 2882 kmem_free(tpent, sizeof (tsol_tpent_t)); 2883 return; 2884 } 2885 2886 /* Make sure that the template name is null-terminated. */ 2887 *(tpent->name + TNTNAMSIZ - 1) = '\0'; 2888 2889 au_uwrite(au_to_text(tpent->name)); 2890 kmem_free(tpent, sizeof (tsol_tpent_t)); 2891 2892 break; 2893 } 2894 case AUE_LABELSYS_TNMLP: 2895 { 2896 tsol_mlpent_t *mlpent; 2897 2898 au_uwrite(au_to_arg32(1, "cmd", cmd)); 2899 2900 mlpent = kmem_alloc(sizeof (tsol_mlpent_t), KM_SLEEP); 2901 if (copyin((caddr_t)a2, mlpent, sizeof (tsol_mlpent_t))) { 2902 kmem_free(mlpent, sizeof (tsol_mlpent_t)); 2903 return; 2904 } 2905 2906 if (mlpent->tsme_flags & TSOL_MEF_SHARED) { 2907 au_uwrite(au_to_text("shared")); 2908 } else { 2909 zone_t *zone; 2910 2911 zone = zone_find_by_id(mlpent->tsme_zoneid); 2912 if (zone != NULL) { 2913 au_uwrite(au_to_text(zone->zone_name)); 2914 zone_rele(zone); 2915 } 2916 } 2917 2918 /* Remaining args don't apply for FLUSH, so skip */ 2919 if (cmd == TNDB_FLUSH) { 2920 kmem_free(mlpent, sizeof (tsol_mlpent_t)); 2921 break; 2922 } 2923 2924 au_uwrite(au_to_arg32(2, "proto num", 2925 (uint32_t)mlpent->tsme_mlp.mlp_ipp)); 2926 au_uwrite(au_to_arg32(2, "mlp_port", 2927 (uint32_t)mlpent->tsme_mlp.mlp_port)); 2928 2929 if (mlpent->tsme_mlp.mlp_port_upper != 0) 2930 au_uwrite(au_to_arg32(2, "mlp_port_upper", 2931 (uint32_t)mlpent->tsme_mlp.mlp_port_upper)); 2932 2933 kmem_free(mlpent, sizeof (tsol_mlpent_t)); 2934 2935 break; 2936 } 2937 default: 2938 break; 2939 } 2940 } 2941 2942 2943 static au_event_t 2944 aui_auditsys(au_event_t e) 2945 { 2946 klwp_t *clwp = ttolwp(curthread); 2947 uint32_t code; 2948 2949 struct a { 2950 long code; 2951 long a1; 2952 long a2; 2953 long a3; 2954 long a4; 2955 long a5; 2956 long a6; 2957 long a7; 2958 } *uap = (struct a *)clwp->lwp_ap; 2959 2960 code = (uint32_t)uap->code; 2961 2962 switch (code) { 2963 2964 case BSM_GETAUID: 2965 e = AUE_GETAUID; 2966 break; 2967 case BSM_SETAUID: 2968 e = AUE_SETAUID; 2969 break; 2970 case BSM_GETAUDIT: 2971 e = AUE_GETAUDIT; 2972 break; 2973 case BSM_GETAUDIT_ADDR: 2974 e = AUE_GETAUDIT_ADDR; 2975 break; 2976 case BSM_SETAUDIT: 2977 e = AUE_SETAUDIT; 2978 break; 2979 case BSM_SETAUDIT_ADDR: 2980 e = AUE_SETAUDIT_ADDR; 2981 break; 2982 case BSM_AUDIT: 2983 e = AUE_AUDIT; 2984 break; 2985 case BSM_AUDITCTL: 2986 switch ((uint_t)uap->a1) { 2987 2988 case A_GETPOLICY: 2989 e = AUE_AUDITON_GPOLICY; 2990 break; 2991 case A_SETPOLICY: 2992 e = AUE_AUDITON_SPOLICY; 2993 break; 2994 case A_GETAMASK: 2995 e = AUE_AUDITON_GETAMASK; 2996 break; 2997 case A_SETAMASK: 2998 e = AUE_AUDITON_SETAMASK; 2999 break; 3000 case A_GETKMASK: 3001 e = AUE_AUDITON_GETKMASK; 3002 break; 3003 case A_SETKMASK: 3004 e = AUE_AUDITON_SETKMASK; 3005 break; 3006 case A_GETQCTRL: 3007 e = AUE_AUDITON_GQCTRL; 3008 break; 3009 case A_SETQCTRL: 3010 e = AUE_AUDITON_SQCTRL; 3011 break; 3012 case A_GETCWD: 3013 e = AUE_AUDITON_GETCWD; 3014 break; 3015 case A_GETCAR: 3016 e = AUE_AUDITON_GETCAR; 3017 break; 3018 case A_GETSTAT: 3019 e = AUE_AUDITON_GETSTAT; 3020 break; 3021 case A_SETSTAT: 3022 e = AUE_AUDITON_SETSTAT; 3023 break; 3024 case A_SETUMASK: 3025 e = AUE_AUDITON_SETUMASK; 3026 break; 3027 case A_SETSMASK: 3028 e = AUE_AUDITON_SETSMASK; 3029 break; 3030 case A_GETCOND: 3031 e = AUE_AUDITON_GETCOND; 3032 break; 3033 case A_SETCOND: 3034 e = AUE_AUDITON_SETCOND; 3035 break; 3036 case A_GETCLASS: 3037 e = AUE_AUDITON_GETCLASS; 3038 break; 3039 case A_SETCLASS: 3040 e = AUE_AUDITON_SETCLASS; 3041 break; 3042 default: 3043 e = AUE_NULL; 3044 break; 3045 } 3046 break; 3047 default: 3048 e = AUE_NULL; 3049 break; 3050 } 3051 3052 return (e); 3053 3054 } /* AUI_AUDITSYS */ 3055 3056 3057 static void 3058 aus_auditsys(struct t_audit_data *tad) 3059 { 3060 klwp_t *clwp = ttolwp(curthread); 3061 uintptr_t a1, a2; 3062 STRUCT_DECL(auditinfo, ainfo); 3063 STRUCT_DECL(auditinfo_addr, ainfo_addr); 3064 au_evclass_map_t event; 3065 au_mask_t mask; 3066 int auditstate, policy; 3067 au_id_t auid; 3068 3069 3070 struct a { 3071 long code; 3072 long a1; 3073 long a2; 3074 long a3; 3075 long a4; 3076 long a5; 3077 long a6; 3078 long a7; 3079 } *uap = (struct a *)clwp->lwp_ap; 3080 3081 a1 = (uintptr_t)uap->a1; 3082 a2 = (uintptr_t)uap->a2; 3083 3084 switch (tad->tad_event) { 3085 case AUE_SETAUID: 3086 if (copyin((caddr_t)a1, &auid, sizeof (au_id_t))) 3087 return; 3088 au_uwrite(au_to_arg32(2, "setauid", auid)); 3089 break; 3090 case AUE_SETAUDIT: 3091 STRUCT_INIT(ainfo, get_udatamodel()); 3092 if (copyin((caddr_t)a1, STRUCT_BUF(ainfo), 3093 STRUCT_SIZE(ainfo))) { 3094 return; 3095 } 3096 au_uwrite(au_to_arg32((char)1, "setaudit:auid", 3097 (uint32_t)STRUCT_FGET(ainfo, ai_auid))); 3098 #ifdef _LP64 3099 au_uwrite(au_to_arg64((char)1, "setaudit:port", 3100 (uint64_t)STRUCT_FGET(ainfo, ai_termid.port))); 3101 #else 3102 au_uwrite(au_to_arg32((char)1, "setaudit:port", 3103 (uint32_t)STRUCT_FGET(ainfo, ai_termid.port))); 3104 #endif 3105 au_uwrite(au_to_arg32((char)1, "setaudit:machine", 3106 (uint32_t)STRUCT_FGET(ainfo, ai_termid.machine))); 3107 au_uwrite(au_to_arg32((char)1, "setaudit:as_success", 3108 (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_success))); 3109 au_uwrite(au_to_arg32((char)1, "setaudit:as_failure", 3110 (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_failure))); 3111 au_uwrite(au_to_arg32((char)1, "setaudit:asid", 3112 (uint32_t)STRUCT_FGET(ainfo, ai_asid))); 3113 break; 3114 case AUE_SETAUDIT_ADDR: 3115 STRUCT_INIT(ainfo_addr, get_udatamodel()); 3116 if (copyin((caddr_t)a1, STRUCT_BUF(ainfo_addr), 3117 STRUCT_SIZE(ainfo_addr))) { 3118 return; 3119 } 3120 au_uwrite(au_to_arg32((char)1, "auid", 3121 (uint32_t)STRUCT_FGET(ainfo_addr, ai_auid))); 3122 #ifdef _LP64 3123 au_uwrite(au_to_arg64((char)1, "port", 3124 (uint64_t)STRUCT_FGET(ainfo_addr, ai_termid.at_port))); 3125 #else 3126 au_uwrite(au_to_arg32((char)1, "port", 3127 (uint32_t)STRUCT_FGET(ainfo_addr, ai_termid.at_port))); 3128 #endif 3129 au_uwrite(au_to_arg32((char)1, "type", 3130 (uint32_t)STRUCT_FGET(ainfo_addr, ai_termid.at_type))); 3131 if ((uint32_t)STRUCT_FGET(ainfo_addr, ai_termid.at_type) == 3132 AU_IPv4) { 3133 au_uwrite(au_to_in_addr( 3134 (struct in_addr *)STRUCT_FGETP(ainfo_addr, 3135 ai_termid.at_addr))); 3136 } else { 3137 au_uwrite(au_to_in_addr_ex( 3138 (int32_t *)STRUCT_FGETP(ainfo_addr, 3139 ai_termid.at_addr))); 3140 } 3141 au_uwrite(au_to_arg32((char)1, "as_success", 3142 (uint32_t)STRUCT_FGET(ainfo_addr, ai_mask.as_success))); 3143 au_uwrite(au_to_arg32((char)1, "as_failure", 3144 (uint32_t)STRUCT_FGET(ainfo_addr, ai_mask.as_failure))); 3145 au_uwrite(au_to_arg32((char)1, "asid", 3146 (uint32_t)STRUCT_FGET(ainfo_addr, ai_asid))); 3147 break; 3148 case AUE_AUDITON_SETAMASK: 3149 if (copyin((caddr_t)a2, &mask, sizeof (au_mask_t))) 3150 return; 3151 au_uwrite(au_to_arg32( 3152 2, "setamask:as_success", (uint32_t)mask.as_success)); 3153 au_uwrite(au_to_arg32( 3154 2, "setamask:as_failure", (uint32_t)mask.as_failure)); 3155 break; 3156 case AUE_AUDITON_SETKMASK: 3157 if (copyin((caddr_t)a2, &mask, sizeof (au_mask_t))) 3158 return; 3159 au_uwrite(au_to_arg32( 3160 2, "setkmask:as_success", (uint32_t)mask.as_success)); 3161 au_uwrite(au_to_arg32( 3162 2, "setkmask:as_failure", (uint32_t)mask.as_failure)); 3163 break; 3164 case AUE_AUDITON_SPOLICY: 3165 if (copyin((caddr_t)a2, &policy, sizeof (int))) 3166 return; 3167 au_uwrite(au_to_arg32(3, "setpolicy", (uint32_t)policy)); 3168 break; 3169 case AUE_AUDITON_SQCTRL: { 3170 STRUCT_DECL(au_qctrl, qctrl); 3171 model_t model; 3172 3173 model = get_udatamodel(); 3174 STRUCT_INIT(qctrl, model); 3175 if (copyin((caddr_t)a2, STRUCT_BUF(qctrl), STRUCT_SIZE(qctrl))) 3176 return; 3177 if (model == DATAMODEL_ILP32) { 3178 au_uwrite(au_to_arg32( 3179 3, "setqctrl:aq_hiwater", 3180 (uint32_t)STRUCT_FGET(qctrl, aq_hiwater))); 3181 au_uwrite(au_to_arg32( 3182 3, "setqctrl:aq_lowater", 3183 (uint32_t)STRUCT_FGET(qctrl, aq_lowater))); 3184 au_uwrite(au_to_arg32( 3185 3, "setqctrl:aq_bufsz", 3186 (uint32_t)STRUCT_FGET(qctrl, aq_bufsz))); 3187 au_uwrite(au_to_arg32( 3188 3, "setqctrl:aq_delay", 3189 (uint32_t)STRUCT_FGET(qctrl, aq_delay))); 3190 } else { 3191 au_uwrite(au_to_arg64( 3192 3, "setqctrl:aq_hiwater", 3193 (uint64_t)STRUCT_FGET(qctrl, aq_hiwater))); 3194 au_uwrite(au_to_arg64( 3195 3, "setqctrl:aq_lowater", 3196 (uint64_t)STRUCT_FGET(qctrl, aq_lowater))); 3197 au_uwrite(au_to_arg64( 3198 3, "setqctrl:aq_bufsz", 3199 (uint64_t)STRUCT_FGET(qctrl, aq_bufsz))); 3200 au_uwrite(au_to_arg64( 3201 3, "setqctrl:aq_delay", 3202 (uint64_t)STRUCT_FGET(qctrl, aq_delay))); 3203 } 3204 break; 3205 } 3206 case AUE_AUDITON_SETUMASK: 3207 STRUCT_INIT(ainfo, get_udatamodel()); 3208 if (copyin((caddr_t)uap->a2, STRUCT_BUF(ainfo), 3209 STRUCT_SIZE(ainfo))) { 3210 return; 3211 } 3212 au_uwrite(au_to_arg32(3, "setumask:as_success", 3213 (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_success))); 3214 au_uwrite(au_to_arg32(3, "setumask:as_failure", 3215 (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_failure))); 3216 break; 3217 case AUE_AUDITON_SETSMASK: 3218 STRUCT_INIT(ainfo, get_udatamodel()); 3219 if (copyin((caddr_t)uap->a2, STRUCT_BUF(ainfo), 3220 STRUCT_SIZE(ainfo))) { 3221 return; 3222 } 3223 au_uwrite(au_to_arg32(3, "setsmask:as_success", 3224 (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_success))); 3225 au_uwrite(au_to_arg32(3, "setsmask:as_failure", 3226 (uint32_t)STRUCT_FGET(ainfo, ai_mask.as_failure))); 3227 break; 3228 case AUE_AUDITON_SETCOND: 3229 if (copyin((caddr_t)a2, &auditstate, sizeof (int))) 3230 return; 3231 au_uwrite(au_to_arg32(3, "setcond", (uint32_t)auditstate)); 3232 break; 3233 case AUE_AUDITON_SETCLASS: 3234 if (copyin((caddr_t)a2, &event, sizeof (au_evclass_map_t))) 3235 return; 3236 au_uwrite(au_to_arg32( 3237 2, "setclass:ec_event", (uint32_t)event.ec_number)); 3238 au_uwrite(au_to_arg32( 3239 3, "setclass:ec_class", (uint32_t)event.ec_class)); 3240 break; 3241 case AUE_GETAUID: 3242 case AUE_GETAUDIT: 3243 case AUE_GETAUDIT_ADDR: 3244 case AUE_AUDIT: 3245 case AUE_AUDITON_GPOLICY: 3246 case AUE_AUDITON_GQCTRL: 3247 case AUE_AUDITON_GETAMASK: 3248 case AUE_AUDITON_GETKMASK: 3249 case AUE_AUDITON_GETCWD: 3250 case AUE_AUDITON_GETCAR: 3251 case AUE_AUDITON_GETSTAT: 3252 case AUE_AUDITON_SETSTAT: 3253 case AUE_AUDITON_GETCOND: 3254 case AUE_AUDITON_GETCLASS: 3255 break; 3256 default: 3257 break; 3258 } 3259 3260 } /* AUS_AUDITSYS */ 3261 3262 3263 /* only audit privileged operations for systeminfo(2) system call */ 3264 static au_event_t 3265 aui_sysinfo(au_event_t e) 3266 { 3267 klwp_t *clwp = ttolwp(curthread); 3268 uint32_t command; 3269 3270 struct a { 3271 long command; 3272 long buf; /* char * */ 3273 long count; 3274 } *uap = (struct a *)clwp->lwp_ap; 3275 3276 command = (uint32_t)uap->command; 3277 3278 switch (command) { 3279 case SI_SET_HOSTNAME: 3280 case SI_SET_SRPC_DOMAIN: 3281 e = (au_event_t)AUE_SYSINFO; 3282 break; 3283 default: 3284 e = (au_event_t)AUE_NULL; 3285 break; 3286 } 3287 return (e); 3288 } 3289 3290 /*ARGSUSED*/ 3291 static void 3292 aus_sysinfo(struct t_audit_data *tad) 3293 { 3294 klwp_t *clwp = ttolwp(curthread); 3295 uint32_t command; 3296 size_t len, maxlen; 3297 char *name; 3298 uintptr_t buf; 3299 3300 struct a { 3301 long command; 3302 long buf; /* char * */ 3303 long count; 3304 } *uap = (struct a *)clwp->lwp_ap; 3305 3306 command = (uint32_t)uap->command; 3307 buf = (uintptr_t)uap->buf; 3308 3309 au_uwrite(au_to_arg32(1, "cmd", command)); 3310 3311 switch (command) { 3312 case SI_SET_HOSTNAME: 3313 { 3314 if (secpolicy_sys_config(CRED(), B_TRUE) != 0) 3315 return; 3316 3317 maxlen = SYS_NMLN; 3318 name = kmem_alloc(maxlen, KM_SLEEP); 3319 if (copyinstr((caddr_t)buf, name, SYS_NMLN, &len)) 3320 break; 3321 3322 /* 3323 * Must be non-NULL string and string 3324 * must be less than SYS_NMLN chars. 3325 */ 3326 if (len < 2 || (len == SYS_NMLN && name[SYS_NMLN - 1] != '\0')) 3327 break; 3328 3329 au_uwrite(au_to_text(name)); 3330 break; 3331 } 3332 3333 case SI_SET_SRPC_DOMAIN: 3334 { 3335 if (secpolicy_sys_config(CRED(), B_TRUE) != 0) 3336 return; 3337 3338 maxlen = SYS_NMLN; 3339 name = kmem_alloc(maxlen, KM_SLEEP); 3340 if (copyinstr((caddr_t)buf, name, SYS_NMLN, &len)) 3341 break; 3342 3343 /* 3344 * If string passed in is longer than length 3345 * allowed for domain name, fail. 3346 */ 3347 if (len == SYS_NMLN && name[SYS_NMLN - 1] != '\0') 3348 break; 3349 3350 au_uwrite(au_to_text(name)); 3351 break; 3352 } 3353 3354 default: 3355 return; 3356 } 3357 3358 kmem_free(name, maxlen); 3359 } 3360 3361 static au_event_t 3362 aui_modctl(au_event_t e) 3363 { 3364 klwp_t *clwp = ttolwp(curthread); 3365 uint_t cmd; 3366 3367 struct a { 3368 long cmd; 3369 } *uap = (struct a *)clwp->lwp_ap; 3370 3371 cmd = (uint_t)uap->cmd; 3372 3373 switch (cmd) { 3374 case MODLOAD: 3375 e = AUE_MODLOAD; 3376 break; 3377 case MODUNLOAD: 3378 e = AUE_MODUNLOAD; 3379 break; 3380 case MODADDMAJBIND: 3381 e = AUE_MODADDMAJ; 3382 break; 3383 case MODSETDEVPOLICY: 3384 e = AUE_MODDEVPLCY; 3385 break; 3386 case MODALLOCPRIV: 3387 e = AUE_MODADDPRIV; 3388 break; 3389 default: 3390 e = AUE_NULL; 3391 break; 3392 } 3393 return (e); 3394 } 3395 3396 3397 /*ARGSUSED*/ 3398 static void 3399 aus_modctl(struct t_audit_data *tad) 3400 { 3401 klwp_t *clwp = ttolwp(curthread); 3402 void *a = clwp->lwp_ap; 3403 uint_t use_path; 3404 3405 switch (tad->tad_event) { 3406 case AUE_MODLOAD: { 3407 typedef struct { 3408 long cmd; 3409 long use_path; 3410 long filename; /* char * */ 3411 } modloada_t; 3412 3413 char *filenamep; 3414 uintptr_t fname; 3415 extern char *default_path; 3416 3417 fname = (uintptr_t)((modloada_t *)a)->filename; 3418 use_path = (uint_t)((modloada_t *)a)->use_path; 3419 3420 /* space to hold path */ 3421 filenamep = kmem_alloc(MOD_MAXPATH, KM_SLEEP); 3422 /* get string */ 3423 if (copyinstr((caddr_t)fname, filenamep, MOD_MAXPATH, 0)) { 3424 /* free allocated path */ 3425 kmem_free(filenamep, MOD_MAXPATH); 3426 return; 3427 } 3428 /* ensure it's null terminated */ 3429 filenamep[MOD_MAXPATH - 1] = 0; 3430 3431 if (use_path) 3432 au_uwrite(au_to_text(default_path)); 3433 au_uwrite(au_to_text(filenamep)); 3434 3435 /* release temporary memory */ 3436 kmem_free(filenamep, MOD_MAXPATH); 3437 break; 3438 } 3439 case AUE_MODUNLOAD: { 3440 typedef struct { 3441 long cmd; 3442 long id; 3443 } modunloada_t; 3444 3445 uint32_t id = (uint32_t)((modunloada_t *)a)->id; 3446 3447 au_uwrite(au_to_arg32(1, "id", id)); 3448 break; 3449 } 3450 case AUE_MODADDMAJ: { 3451 STRUCT_DECL(modconfig, mc); 3452 typedef struct { 3453 long cmd; 3454 long subcmd; 3455 long data; /* int * */ 3456 } modconfiga_t; 3457 3458 STRUCT_DECL(aliases, alias); 3459 caddr_t ap; 3460 int i, num_aliases; 3461 char *drvname, *mc_drvname; 3462 char *name; 3463 extern char *ddi_major_to_name(major_t); 3464 model_t model; 3465 3466 uintptr_t data = (uintptr_t)((modconfiga_t *)a)->data; 3467 3468 model = get_udatamodel(); 3469 STRUCT_INIT(mc, model); 3470 /* sanitize buffer */ 3471 bzero((caddr_t)STRUCT_BUF(mc), STRUCT_SIZE(mc)); 3472 /* get user arguments */ 3473 if (copyin((caddr_t)data, (caddr_t)STRUCT_BUF(mc), 3474 STRUCT_SIZE(mc)) != 0) 3475 return; 3476 3477 mc_drvname = STRUCT_FGET(mc, drvname); 3478 if ((drvname = ddi_major_to_name( 3479 (major_t)STRUCT_FGET(mc, major))) != NULL && 3480 strncmp(drvname, mc_drvname, MAXMODCONFNAME) != 0) { 3481 /* safety */ 3482 if (mc_drvname[0] != '\0') { 3483 mc_drvname[MAXMODCONFNAME-1] = '\0'; 3484 au_uwrite(au_to_text(mc_drvname)); 3485 } 3486 /* drvname != NULL from test above */ 3487 au_uwrite(au_to_text(drvname)); 3488 return; 3489 } 3490 3491 if (mc_drvname[0] != '\0') { 3492 /* safety */ 3493 mc_drvname[MAXMODCONFNAME-1] = '\0'; 3494 au_uwrite(au_to_text(mc_drvname)); 3495 } else 3496 au_uwrite(au_to_text("no drvname")); 3497 3498 num_aliases = STRUCT_FGET(mc, num_aliases); 3499 au_uwrite(au_to_arg32(5, "", (uint32_t)num_aliases)); 3500 ap = (caddr_t)STRUCT_FGETP(mc, ap); 3501 name = kmem_alloc(MAXMODCONFNAME, KM_SLEEP); 3502 STRUCT_INIT(alias, model); 3503 for (i = 0; i < num_aliases; i++) { 3504 bzero((caddr_t)STRUCT_BUF(alias), 3505 STRUCT_SIZE(alias)); 3506 if (copyin((caddr_t)ap, (caddr_t)STRUCT_BUF(alias), 3507 STRUCT_SIZE(alias)) != 0) 3508 break; 3509 if (copyinstr(STRUCT_FGETP(alias, a_name), name, 3510 MAXMODCONFNAME, NULL) != 0) { 3511 break; 3512 } 3513 3514 au_uwrite(au_to_text(name)); 3515 ap = (caddr_t)STRUCT_FGETP(alias, a_next); 3516 } 3517 kmem_free(name, MAXMODCONFNAME); 3518 break; 3519 } 3520 default: 3521 break; 3522 } 3523 } 3524 3525 3526 /*ARGSUSED*/ 3527 static void 3528 auf_accept( 3529 struct t_audit_data *tad, 3530 int error, 3531 rval_t *rval) 3532 { 3533 uint32_t scid; 3534 uint32_t sy_flags; 3535 int fd; 3536 struct sonode *so; 3537 char so_laddr[sizeof (struct sockaddr_in6)]; 3538 char so_faddr[sizeof (struct sockaddr_in6)]; 3539 int err; 3540 short so_family, so_type; 3541 int add_sock_token = 0; 3542 3543 /* need to determine type of executing binary */ 3544 scid = tad->tad_scid; 3545 #ifdef _SYSCALL32_IMPL 3546 if (lwp_getdatamodel(ttolwp(curthread)) == DATAMODEL_NATIVE) 3547 sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 3548 else 3549 sy_flags = sysent32[scid].sy_flags & SE_RVAL_MASK; 3550 #else 3551 sy_flags = sysent[scid].sy_flags & SE_RVAL_MASK; 3552 #endif 3553 switch (sy_flags) { 3554 case SE_32RVAL1: 3555 /* FALLTHRU */ 3556 case SE_32RVAL2|SE_32RVAL1: 3557 fd = rval->r_val1; 3558 break; 3559 case SE_64RVAL: 3560 fd = (int)rval->r_vals; 3561 break; 3562 default: 3563 /* 3564 * should never happen, seems to be an internal error 3565 * in sysent => no fd, nothing to audit here, returning 3566 */ 3567 return; 3568 } 3569 3570 if (error) { 3571 /* can't trust socket contents. Just return */ 3572 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 3573 return; 3574 } 3575 3576 if ((so = getsonode(fd, &err, NULL)) == NULL) { 3577 /* 3578 * not security relevant if doing a accept from non socket 3579 * so no extra tokens. Should probably turn off audit record 3580 * generation here. 3581 */ 3582 return; 3583 } 3584 3585 so_family = so->so_family; 3586 so_type = so->so_type; 3587 3588 switch (so_family) { 3589 case AF_INET: 3590 case AF_INET6: 3591 /* 3592 * XXX - what about other socket types for AF_INET (e.g. DGRAM) 3593 */ 3594 if (so->so_type == SOCK_STREAM) { 3595 socklen_t len; 3596 3597 bzero((void *)so_laddr, sizeof (so_laddr)); 3598 bzero((void *)so_faddr, sizeof (so_faddr)); 3599 3600 len = sizeof (so_laddr); 3601 (void) socket_getsockname(so, 3602 (struct sockaddr *)so_laddr, &len, CRED()); 3603 len = sizeof (so_faddr); 3604 (void) socket_getpeername(so, 3605 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 3606 3607 add_sock_token = 1; 3608 } 3609 break; 3610 3611 default: 3612 /* AF_UNIX, AF_ROUTE, AF_KEY do not support accept */ 3613 break; 3614 } 3615 3616 releasef(fd); 3617 3618 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 3619 3620 if (add_sock_token == 0) { 3621 au_uwrite(au_to_arg32(0, "family", (uint32_t)(so_family))); 3622 au_uwrite(au_to_arg32(0, "type", (uint32_t)(so_type))); 3623 return; 3624 } 3625 3626 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 3627 3628 } 3629 3630 /*ARGSUSED*/ 3631 static void 3632 auf_bind(struct t_audit_data *tad, int error, rval_t *rvp) 3633 { 3634 struct a { 3635 long fd; 3636 long addr; 3637 long len; 3638 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 3639 3640 struct sonode *so; 3641 char so_laddr[sizeof (struct sockaddr_in6)]; 3642 char so_faddr[sizeof (struct sockaddr_in6)]; 3643 int err, fd; 3644 socklen_t len; 3645 short so_family, so_type; 3646 int add_sock_token = 0; 3647 3648 fd = (int)uap->fd; 3649 3650 /* 3651 * bind failed, then nothing extra to add to audit record. 3652 */ 3653 if (error) { 3654 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 3655 /* XXX may want to add failed address some day */ 3656 return; 3657 } 3658 3659 if ((so = getsonode(fd, &err, NULL)) == NULL) { 3660 /* 3661 * not security relevant if doing a bind from non socket 3662 * so no extra tokens. Should probably turn off audit record 3663 * generation here. 3664 */ 3665 return; 3666 } 3667 3668 so_family = so->so_family; 3669 so_type = so->so_type; 3670 3671 switch (so_family) { 3672 case AF_INET: 3673 case AF_INET6: 3674 3675 bzero(so_faddr, sizeof (so_faddr)); 3676 len = sizeof (so_faddr); 3677 3678 (void) socket_getpeername(so, 3679 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 3680 add_sock_token = 1; 3681 3682 break; 3683 3684 case AF_UNIX: 3685 /* token added by lookup */ 3686 break; 3687 default: 3688 /* AF_ROUTE, AF_KEY do not support accept */ 3689 break; 3690 } 3691 3692 releasef(fd); 3693 3694 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 3695 3696 if (add_sock_token == 0) { 3697 au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family))); 3698 au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type))); 3699 return; 3700 } 3701 3702 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 3703 3704 } 3705 3706 /*ARGSUSED*/ 3707 static void 3708 auf_connect(struct t_audit_data *tad, int error, rval_t *rval) 3709 { 3710 struct a { 3711 long fd; 3712 long addr; 3713 long len; 3714 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 3715 3716 struct sonode *so; 3717 char so_laddr[sizeof (struct sockaddr_in6)]; 3718 char so_faddr[sizeof (struct sockaddr_in6)]; 3719 int err, fd; 3720 socklen_t len; 3721 short so_family, so_type; 3722 int add_sock_token = 0; 3723 3724 fd = (int)uap->fd; 3725 3726 3727 if ((so = getsonode(fd, &err, NULL)) == NULL) { 3728 /* 3729 * not security relevant if doing a connect from non socket 3730 * so no extra tokens. Should probably turn off audit record 3731 * generation here. 3732 */ 3733 return; 3734 } 3735 3736 so_family = so->so_family; 3737 so_type = so->so_type; 3738 3739 switch (so_family) { 3740 case AF_INET: 3741 case AF_INET6: 3742 3743 bzero(so_laddr, sizeof (so_laddr)); 3744 bzero(so_faddr, sizeof (so_faddr)); 3745 3746 len = sizeof (so_laddr); 3747 (void) socket_getsockname(so, (struct sockaddr *)so_laddr, 3748 &len, CRED()); 3749 if (error) { 3750 if (uap->addr == NULL) 3751 break; 3752 if (uap->len <= 0) 3753 break; 3754 len = min(uap->len, sizeof (so_faddr)); 3755 if (copyin((caddr_t)(uap->addr), so_faddr, len) != 0) 3756 break; 3757 #ifdef NOTYET 3758 au_uwrite(au_to_data(AUP_HEX, AUR_CHAR, len, so_faddr)); 3759 #endif 3760 } else { 3761 /* sanity check on length */ 3762 len = sizeof (so_faddr); 3763 (void) socket_getpeername(so, 3764 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 3765 } 3766 3767 add_sock_token = 1; 3768 3769 break; 3770 3771 case AF_UNIX: 3772 /* does a lookup on name */ 3773 break; 3774 3775 default: 3776 /* AF_ROUTE, AF_KEY do not support accept */ 3777 break; 3778 } 3779 3780 releasef(fd); 3781 3782 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 3783 3784 if (add_sock_token == 0) { 3785 au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family))); 3786 au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type))); 3787 return; 3788 } 3789 3790 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 3791 3792 } 3793 3794 /*ARGSUSED*/ 3795 static void 3796 aus_shutdown(struct t_audit_data *tad) 3797 { 3798 struct a { 3799 long fd; 3800 long how; 3801 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 3802 3803 struct sonode *so; 3804 char so_laddr[sizeof (struct sockaddr_in6)]; 3805 char so_faddr[sizeof (struct sockaddr_in6)]; 3806 int err, fd; 3807 socklen_t len; 3808 short so_family, so_type; 3809 int add_sock_token = 0; 3810 file_t *fp; /* unix domain sockets */ 3811 struct f_audit_data *fad; /* unix domain sockets */ 3812 3813 fd = (int)uap->fd; 3814 3815 if ((so = getsonode(fd, &err, &fp)) == NULL) { 3816 /* 3817 * not security relevant if doing a shutdown using non socket 3818 * so no extra tokens. Should probably turn off audit record 3819 * generation here. 3820 */ 3821 return; 3822 } 3823 3824 so_family = so->so_family; 3825 so_type = so->so_type; 3826 3827 switch (so_family) { 3828 case AF_INET: 3829 case AF_INET6: 3830 3831 bzero(so_laddr, sizeof (so_laddr)); 3832 bzero(so_faddr, sizeof (so_faddr)); 3833 3834 len = sizeof (so_laddr); 3835 (void) socket_getsockname(so, 3836 (struct sockaddr *)so_laddr, &len, CRED()); 3837 len = sizeof (so_faddr); 3838 (void) socket_getpeername(so, 3839 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 3840 3841 add_sock_token = 1; 3842 3843 break; 3844 3845 case AF_UNIX: 3846 3847 /* get path from file struct here */ 3848 fad = F2A(fp); 3849 ASSERT(fad); 3850 3851 if (fad->fad_aupath != NULL) { 3852 au_uwrite(au_to_path(fad->fad_aupath)); 3853 } else { 3854 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 3855 } 3856 3857 audit_attributes(fp->f_vnode); 3858 3859 break; 3860 3861 default: 3862 /* 3863 * AF_KEY and AF_ROUTE support shutdown. No socket token 3864 * added. 3865 */ 3866 break; 3867 } 3868 3869 releasef(fd); 3870 3871 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 3872 3873 if (add_sock_token == 0) { 3874 au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family))); 3875 au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type))); 3876 au_uwrite(au_to_arg32(2, "how", (uint32_t)(uap->how))); 3877 return; 3878 } 3879 3880 au_uwrite(au_to_arg32(2, "how", (uint32_t)(uap->how))); 3881 3882 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 3883 3884 } 3885 3886 /*ARGSUSED*/ 3887 static void 3888 auf_setsockopt(struct t_audit_data *tad, int error, rval_t *rval) 3889 { 3890 struct a { 3891 long fd; 3892 long level; 3893 long optname; 3894 long *optval; 3895 long optlen; 3896 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 3897 3898 struct sonode *so; 3899 char so_laddr[sizeof (struct sockaddr_in6)]; 3900 char so_faddr[sizeof (struct sockaddr_in6)]; 3901 char val[AU_BUFSIZE]; 3902 int err, fd; 3903 socklen_t len; 3904 short so_family, so_type; 3905 int add_sock_token = 0; 3906 file_t *fp; /* unix domain sockets */ 3907 struct f_audit_data *fad; /* unix domain sockets */ 3908 3909 fd = (int)uap->fd; 3910 3911 if (error) { 3912 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 3913 au_uwrite(au_to_arg32(2, "level", (uint32_t)uap->level)); 3914 /* XXX may want to include other arguments */ 3915 return; 3916 } 3917 3918 if ((so = getsonode(fd, &err, &fp)) == NULL) { 3919 /* 3920 * not security relevant if doing a setsockopt from non socket 3921 * so no extra tokens. Should probably turn off audit record 3922 * generation here. 3923 */ 3924 return; 3925 } 3926 3927 so_family = so->so_family; 3928 so_type = so->so_type; 3929 3930 switch (so_family) { 3931 case AF_INET: 3932 case AF_INET6: 3933 bzero((void *)so_laddr, sizeof (so_laddr)); 3934 bzero((void *)so_faddr, sizeof (so_faddr)); 3935 3936 /* get local and foreign addresses */ 3937 len = sizeof (so_laddr); 3938 (void) socket_getsockname(so, (struct sockaddr *)so_laddr, 3939 &len, CRED()); 3940 len = sizeof (so_faddr); 3941 (void) socket_getpeername(so, (struct sockaddr *)so_faddr, 3942 &len, B_FALSE, CRED()); 3943 3944 add_sock_token = 1; 3945 3946 break; 3947 3948 case AF_UNIX: 3949 3950 /* get path from file struct here */ 3951 fad = F2A(fp); 3952 ASSERT(fad); 3953 3954 if (fad->fad_aupath != NULL) { 3955 au_uwrite(au_to_path(fad->fad_aupath)); 3956 } else { 3957 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 3958 } 3959 3960 audit_attributes(fp->f_vnode); 3961 3962 break; 3963 3964 default: 3965 /* 3966 * AF_KEY and AF_ROUTE support setsockopt. No socket token 3967 * added. 3968 */ 3969 break; 3970 } 3971 3972 releasef(fd); 3973 3974 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 3975 3976 if (add_sock_token == 0) { 3977 au_uwrite(au_to_arg32(1, "family", (uint32_t)(so_family))); 3978 au_uwrite(au_to_arg32(1, "type", (uint32_t)(so_type))); 3979 } 3980 au_uwrite(au_to_arg32(2, "level", (uint32_t)(uap->level))); 3981 au_uwrite(au_to_arg32(3, "optname", (uint32_t)(uap->optname))); 3982 3983 bzero(val, sizeof (val)); 3984 len = min(uap->optlen, sizeof (val)); 3985 if ((len > 0) && 3986 (copyin((caddr_t)(uap->optval), (caddr_t)val, len) == 0)) { 3987 au_uwrite(au_to_arg32(5, "optlen", (uint32_t)(uap->optlen))); 3988 au_uwrite(au_to_data(AUP_HEX, AUR_BYTE, len, val)); 3989 } 3990 3991 if (add_sock_token == 0) 3992 return; 3993 3994 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 3995 3996 } 3997 3998 /*ARGSUSED*/ 3999 static void 4000 aus_sockconfig(tad) 4001 struct t_audit_data *tad; 4002 { 4003 struct a { 4004 long cmd; 4005 long arg1; 4006 long arg2; 4007 long arg3; 4008 long arg4; 4009 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 4010 4011 char *buf; 4012 int buflen; 4013 size_t size; 4014 4015 au_uwrite(au_to_arg32(1, "cmd", (uint_t)uap->cmd)); 4016 switch (uap->cmd) { 4017 case SOCKCONFIG_ADD_SOCK: 4018 case SOCKCONFIG_REMOVE_SOCK: 4019 au_uwrite(au_to_arg32(2, "domain", (uint32_t)uap->arg1)); 4020 au_uwrite(au_to_arg32(3, "type", (uint32_t)uap->arg2)); 4021 au_uwrite(au_to_arg32(4, "protocol", (uint32_t)uap->arg3)); 4022 4023 if (uap->arg4 == 0) { 4024 au_uwrite(au_to_arg32(5, "devpath", (uint32_t)0)); 4025 } else { 4026 buflen = MAXPATHLEN + 1; 4027 buf = kmem_alloc(buflen, KM_SLEEP); 4028 if (copyinstr((caddr_t)uap->arg4, buf, buflen, 4029 &size)) { 4030 kmem_free(buf, buflen); 4031 return; 4032 } 4033 4034 if (size > MAXPATHLEN) { 4035 kmem_free(buf, buflen); 4036 return; 4037 } 4038 4039 au_uwrite(au_to_text(buf)); 4040 kmem_free(buf, buflen); 4041 } 4042 break; 4043 case SOCKCONFIG_ADD_FILTER: 4044 case SOCKCONFIG_REMOVE_FILTER: 4045 buflen = FILNAME_MAX; 4046 buf = kmem_alloc(buflen, KM_SLEEP); 4047 4048 if (copyinstr((caddr_t)uap->arg1, buf, buflen, &size)) { 4049 kmem_free(buf, buflen); 4050 return; 4051 } 4052 4053 au_uwrite(au_to_text(buf)); 4054 kmem_free(buf, buflen); 4055 break; 4056 default: 4057 break; 4058 } 4059 } 4060 4061 /* 4062 * only audit recvmsg when the system call represents the creation of a new 4063 * circuit. This effectively occurs for all UDP packets and may occur for 4064 * special TCP situations where the local host has not set a local address 4065 * in the socket structure. 4066 */ 4067 /*ARGSUSED*/ 4068 static void 4069 auf_recvmsg( 4070 struct t_audit_data *tad, 4071 int error, 4072 rval_t *rvp) 4073 { 4074 struct a { 4075 long fd; 4076 long msg; /* struct msghdr */ 4077 long flags; 4078 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 4079 4080 struct sonode *so; 4081 STRUCT_DECL(msghdr, msg); 4082 caddr_t msg_name; 4083 socklen_t msg_namelen; 4084 int fd; 4085 int err; 4086 char so_laddr[sizeof (struct sockaddr_in6)]; 4087 char so_faddr[sizeof (struct sockaddr_in6)]; 4088 socklen_t len; 4089 file_t *fp; /* unix domain sockets */ 4090 struct f_audit_data *fad; /* unix domain sockets */ 4091 short so_family, so_type; 4092 int add_sock_token = 0; 4093 au_kcontext_t *kctx = GET_KCTX_PZ; 4094 4095 fd = (int)uap->fd; 4096 4097 /* bail if an error */ 4098 if (error) { 4099 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 4100 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4101 return; 4102 } 4103 4104 if ((so = getsonode(fd, &err, &fp)) == NULL) { 4105 /* 4106 * not security relevant if doing a recvmsg from non socket 4107 * so no extra tokens. Should probably turn off audit record 4108 * generation here. 4109 */ 4110 return; 4111 } 4112 4113 so_family = so->so_family; 4114 so_type = so->so_type; 4115 4116 /* 4117 * only putout SOCKET_EX token if INET/INET6 family. 4118 * XXX - what do we do about other families? 4119 */ 4120 4121 switch (so_family) { 4122 case AF_INET: 4123 case AF_INET6: 4124 4125 /* 4126 * if datagram type socket, then just use what is in 4127 * socket structure for local address. 4128 * XXX - what do we do for other types? 4129 */ 4130 if ((so->so_type == SOCK_DGRAM) || 4131 (so->so_type == SOCK_RAW)) { 4132 add_sock_token = 1; 4133 4134 bzero((void *)so_laddr, sizeof (so_laddr)); 4135 bzero((void *)so_faddr, sizeof (so_faddr)); 4136 4137 /* get local address */ 4138 len = sizeof (so_laddr); 4139 (void) socket_getsockname(so, 4140 (struct sockaddr *)so_laddr, &len, CRED()); 4141 4142 /* get peer address */ 4143 STRUCT_INIT(msg, get_udatamodel()); 4144 4145 if (copyin((caddr_t)(uap->msg), 4146 (caddr_t)STRUCT_BUF(msg), STRUCT_SIZE(msg)) != 0) { 4147 break; 4148 } 4149 msg_name = (caddr_t)STRUCT_FGETP(msg, msg_name); 4150 if (msg_name == NULL) { 4151 break; 4152 } 4153 4154 /* length is value from recvmsg - sanity check */ 4155 msg_namelen = (socklen_t)STRUCT_FGET(msg, msg_namelen); 4156 if (msg_namelen == 0) { 4157 break; 4158 } 4159 if (copyin(msg_name, so_faddr, 4160 sizeof (so_faddr)) != 0) { 4161 break; 4162 } 4163 4164 } else if (so->so_type == SOCK_STREAM) { 4165 4166 /* get path from file struct here */ 4167 fad = F2A(fp); 4168 ASSERT(fad); 4169 4170 /* 4171 * already processed this file for read attempt 4172 */ 4173 if (fad->fad_flags & FAD_READ) { 4174 /* don't want to audit every recvmsg attempt */ 4175 tad->tad_flag = 0; 4176 /* free any residual audit data */ 4177 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 4178 releasef(fd); 4179 return; 4180 } 4181 /* 4182 * mark things so we know what happened and don't 4183 * repeat things 4184 */ 4185 fad->fad_flags |= FAD_READ; 4186 4187 bzero((void *)so_laddr, sizeof (so_laddr)); 4188 bzero((void *)so_faddr, sizeof (so_faddr)); 4189 4190 /* get local and foreign addresses */ 4191 len = sizeof (so_laddr); 4192 (void) socket_getsockname(so, 4193 (struct sockaddr *)so_laddr, &len, CRED()); 4194 len = sizeof (so_faddr); 4195 (void) socket_getpeername(so, 4196 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 4197 4198 add_sock_token = 1; 4199 } 4200 4201 /* XXX - what about SOCK_RDM/SOCK_SEQPACKET ??? */ 4202 4203 break; 4204 4205 case AF_UNIX: 4206 /* 4207 * first check if this is first time through. Too much 4208 * duplicate code to put this in an aui_ routine. 4209 */ 4210 4211 /* get path from file struct here */ 4212 fad = F2A(fp); 4213 ASSERT(fad); 4214 4215 /* 4216 * already processed this file for read attempt 4217 */ 4218 if (fad->fad_flags & FAD_READ) { 4219 releasef(fd); 4220 /* don't want to audit every recvmsg attempt */ 4221 tad->tad_flag = 0; 4222 /* free any residual audit data */ 4223 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 4224 return; 4225 } 4226 /* 4227 * mark things so we know what happened and don't 4228 * repeat things 4229 */ 4230 fad->fad_flags |= FAD_READ; 4231 4232 if (fad->fad_aupath != NULL) { 4233 au_uwrite(au_to_path(fad->fad_aupath)); 4234 } else { 4235 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 4236 } 4237 4238 audit_attributes(fp->f_vnode); 4239 4240 releasef(fd); 4241 4242 return; 4243 4244 default: 4245 break; 4246 4247 } 4248 4249 releasef(fd); 4250 4251 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 4252 4253 if (add_sock_token == 0) { 4254 au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family)); 4255 au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type)); 4256 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4257 return; 4258 } 4259 4260 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4261 4262 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 4263 4264 } 4265 4266 /*ARGSUSED*/ 4267 static void 4268 auf_recvfrom( 4269 struct t_audit_data *tad, 4270 int error, 4271 rval_t *rvp) 4272 { 4273 4274 struct a { 4275 long fd; 4276 long msg; /* char */ 4277 long len; 4278 long flags; 4279 long from; /* struct sockaddr */ 4280 long fromlen; 4281 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 4282 4283 socklen_t fromlen; 4284 struct sonode *so; 4285 char so_laddr[sizeof (struct sockaddr_in6)]; 4286 char so_faddr[sizeof (struct sockaddr_in6)]; 4287 int fd; 4288 short so_family, so_type; 4289 int add_sock_token = 0; 4290 socklen_t len; 4291 int err; 4292 struct file *fp; 4293 struct f_audit_data *fad; /* unix domain sockets */ 4294 au_kcontext_t *kctx = GET_KCTX_PZ; 4295 4296 fd = (int)uap->fd; 4297 4298 /* bail if an error */ 4299 if (error) { 4300 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 4301 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4302 return; 4303 } 4304 4305 if ((so = getsonode(fd, &err, &fp)) == NULL) { 4306 /* 4307 * not security relevant if doing a recvmsg from non socket 4308 * so no extra tokens. Should probably turn off audit record 4309 * generation here. 4310 */ 4311 return; 4312 } 4313 4314 so_family = so->so_family; 4315 so_type = so->so_type; 4316 4317 /* 4318 * only putout SOCKET_EX token if INET/INET6 family. 4319 * XXX - what do we do about other families? 4320 */ 4321 4322 switch (so_family) { 4323 case AF_INET: 4324 case AF_INET6: 4325 4326 /* 4327 * if datagram type socket, then just use what is in 4328 * socket structure for local address. 4329 * XXX - what do we do for other types? 4330 */ 4331 if ((so->so_type == SOCK_DGRAM) || 4332 (so->so_type == SOCK_RAW)) { 4333 add_sock_token = 1; 4334 4335 /* get local address */ 4336 len = sizeof (so_laddr); 4337 (void) socket_getsockname(so, 4338 (struct sockaddr *)so_laddr, &len, CRED()); 4339 4340 /* get peer address */ 4341 bzero((void *)so_faddr, sizeof (so_faddr)); 4342 4343 /* sanity check */ 4344 if (uap->from == NULL) 4345 break; 4346 4347 /* sanity checks */ 4348 if (uap->fromlen == 0) 4349 break; 4350 4351 if (copyin((caddr_t)(uap->fromlen), (caddr_t)&fromlen, 4352 sizeof (fromlen)) != 0) 4353 break; 4354 4355 if (fromlen == 0) 4356 break; 4357 4358 /* enforce maximum size */ 4359 if (fromlen > sizeof (so_faddr)) 4360 fromlen = sizeof (so_faddr); 4361 4362 if (copyin((caddr_t)(uap->from), so_faddr, 4363 fromlen) != 0) 4364 break; 4365 4366 } else if (so->so_type == SOCK_STREAM) { 4367 4368 /* get path from file struct here */ 4369 fad = F2A(fp); 4370 ASSERT(fad); 4371 4372 /* 4373 * already processed this file for read attempt 4374 */ 4375 if (fad->fad_flags & FAD_READ) { 4376 /* don't want to audit every recvfrom attempt */ 4377 tad->tad_flag = 0; 4378 /* free any residual audit data */ 4379 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 4380 releasef(fd); 4381 return; 4382 } 4383 /* 4384 * mark things so we know what happened and don't 4385 * repeat things 4386 */ 4387 fad->fad_flags |= FAD_READ; 4388 4389 bzero((void *)so_laddr, sizeof (so_laddr)); 4390 bzero((void *)so_faddr, sizeof (so_faddr)); 4391 4392 /* get local and foreign addresses */ 4393 len = sizeof (so_laddr); 4394 (void) socket_getsockname(so, 4395 (struct sockaddr *)so_laddr, &len, CRED()); 4396 len = sizeof (so_faddr); 4397 (void) socket_getpeername(so, 4398 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 4399 4400 add_sock_token = 1; 4401 } 4402 4403 /* XXX - what about SOCK_RDM/SOCK_SEQPACKET ??? */ 4404 4405 break; 4406 4407 case AF_UNIX: 4408 /* 4409 * first check if this is first time through. Too much 4410 * duplicate code to put this in an aui_ routine. 4411 */ 4412 4413 /* get path from file struct here */ 4414 fad = F2A(fp); 4415 ASSERT(fad); 4416 4417 /* 4418 * already processed this file for read attempt 4419 */ 4420 if (fad->fad_flags & FAD_READ) { 4421 /* don't want to audit every recvfrom attempt */ 4422 tad->tad_flag = 0; 4423 /* free any residual audit data */ 4424 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 4425 releasef(fd); 4426 return; 4427 } 4428 /* 4429 * mark things so we know what happened and don't 4430 * repeat things 4431 */ 4432 fad->fad_flags |= FAD_READ; 4433 4434 if (fad->fad_aupath != NULL) { 4435 au_uwrite(au_to_path(fad->fad_aupath)); 4436 } else { 4437 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 4438 } 4439 4440 audit_attributes(fp->f_vnode); 4441 4442 releasef(fd); 4443 4444 return; 4445 4446 default: 4447 break; 4448 4449 } 4450 4451 releasef(fd); 4452 4453 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 4454 4455 if (add_sock_token == 0) { 4456 au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family)); 4457 au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type)); 4458 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4459 return; 4460 } 4461 4462 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4463 4464 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 4465 } 4466 4467 /*ARGSUSED*/ 4468 static void 4469 auf_sendmsg(struct t_audit_data *tad, int error, rval_t *rval) 4470 { 4471 struct a { 4472 long fd; 4473 long msg; /* struct msghdr */ 4474 long flags; 4475 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 4476 4477 struct sonode *so; 4478 char so_laddr[sizeof (struct sockaddr_in6)]; 4479 char so_faddr[sizeof (struct sockaddr_in6)]; 4480 int err; 4481 int fd; 4482 short so_family, so_type; 4483 int add_sock_token = 0; 4484 socklen_t len; 4485 struct file *fp; 4486 struct f_audit_data *fad; 4487 caddr_t msg_name; 4488 socklen_t msg_namelen; 4489 STRUCT_DECL(msghdr, msg); 4490 au_kcontext_t *kctx = GET_KCTX_PZ; 4491 4492 fd = (int)uap->fd; 4493 4494 /* bail if an error */ 4495 if (error) { 4496 /* XXX include destination address from system call arguments */ 4497 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 4498 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4499 return; 4500 } 4501 4502 if ((so = getsonode(fd, &err, &fp)) == NULL) { 4503 /* 4504 * not security relevant if doing a sendmsg from non socket 4505 * so no extra tokens. Should probably turn off audit record 4506 * generation here. 4507 */ 4508 return; 4509 } 4510 4511 so_family = so->so_family; 4512 so_type = so->so_type; 4513 4514 switch (so_family) { 4515 case AF_INET: 4516 case AF_INET6: 4517 /* 4518 * if datagram type socket, then just use what is in 4519 * socket structure for local address. 4520 * XXX - what do we do for other types? 4521 */ 4522 if ((so->so_type == SOCK_DGRAM) || 4523 (so->so_type == SOCK_RAW)) { 4524 4525 bzero((void *)so_laddr, sizeof (so_laddr)); 4526 bzero((void *)so_faddr, sizeof (so_faddr)); 4527 4528 /* get local address */ 4529 len = sizeof (so_laddr); 4530 (void) socket_getsockname(so, 4531 (struct sockaddr *)so_laddr, &len, CRED()); 4532 4533 /* get peer address */ 4534 STRUCT_INIT(msg, get_udatamodel()); 4535 4536 if (copyin((caddr_t)(uap->msg), 4537 (caddr_t)STRUCT_BUF(msg), STRUCT_SIZE(msg)) != 0) { 4538 break; 4539 } 4540 msg_name = (caddr_t)STRUCT_FGETP(msg, msg_name); 4541 if (msg_name == NULL) 4542 break; 4543 4544 msg_namelen = (socklen_t)STRUCT_FGET(msg, msg_namelen); 4545 /* length is value from recvmsg - sanity check */ 4546 if (msg_namelen == 0) 4547 break; 4548 4549 if (copyin(msg_name, so_faddr, 4550 sizeof (so_faddr)) != 0) 4551 break; 4552 4553 add_sock_token = 1; 4554 4555 } else if (so->so_type == SOCK_STREAM) { 4556 4557 /* get path from file struct here */ 4558 fad = F2A(fp); 4559 ASSERT(fad); 4560 4561 /* 4562 * already processed this file for write attempt 4563 */ 4564 if (fad->fad_flags & FAD_WRITE) { 4565 releasef(fd); 4566 /* don't want to audit every sendmsg attempt */ 4567 tad->tad_flag = 0; 4568 /* free any residual audit data */ 4569 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 4570 return; 4571 } 4572 4573 /* 4574 * mark things so we know what happened and don't 4575 * repeat things 4576 */ 4577 fad->fad_flags |= FAD_WRITE; 4578 4579 bzero((void *)so_laddr, sizeof (so_laddr)); 4580 bzero((void *)so_faddr, sizeof (so_faddr)); 4581 4582 /* get local and foreign addresses */ 4583 len = sizeof (so_laddr); 4584 (void) socket_getsockname(so, 4585 (struct sockaddr *)so_laddr, &len, CRED()); 4586 len = sizeof (so_faddr); 4587 (void) socket_getpeername(so, 4588 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 4589 4590 add_sock_token = 1; 4591 } 4592 4593 /* XXX - what about SOCK_RAW/SOCK_RDM/SOCK_SEQPACKET ??? */ 4594 4595 break; 4596 4597 case AF_UNIX: 4598 /* 4599 * first check if this is first time through. Too much 4600 * duplicate code to put this in an aui_ routine. 4601 */ 4602 4603 /* get path from file struct here */ 4604 fad = F2A(fp); 4605 ASSERT(fad); 4606 4607 /* 4608 * already processed this file for write attempt 4609 */ 4610 if (fad->fad_flags & FAD_WRITE) { 4611 releasef(fd); 4612 /* don't want to audit every sendmsg attempt */ 4613 tad->tad_flag = 0; 4614 /* free any residual audit data */ 4615 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 4616 return; 4617 } 4618 /* 4619 * mark things so we know what happened and don't 4620 * repeat things 4621 */ 4622 fad->fad_flags |= FAD_WRITE; 4623 4624 if (fad->fad_aupath != NULL) { 4625 au_uwrite(au_to_path(fad->fad_aupath)); 4626 } else { 4627 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 4628 } 4629 4630 audit_attributes(fp->f_vnode); 4631 4632 releasef(fd); 4633 4634 return; 4635 4636 default: 4637 break; 4638 } 4639 4640 releasef(fd); 4641 4642 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 4643 4644 if (add_sock_token == 0) { 4645 au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family)); 4646 au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type)); 4647 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4648 return; 4649 } 4650 4651 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4652 4653 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 4654 } 4655 4656 /*ARGSUSED*/ 4657 static void 4658 auf_sendto(struct t_audit_data *tad, int error, rval_t *rval) 4659 { 4660 struct a { 4661 long fd; 4662 long msg; /* char */ 4663 long len; 4664 long flags; 4665 long to; /* struct sockaddr */ 4666 long tolen; 4667 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 4668 4669 struct sonode *so; 4670 char so_laddr[sizeof (struct sockaddr_in6)]; 4671 char so_faddr[sizeof (struct sockaddr_in6)]; 4672 socklen_t tolen; 4673 int err; 4674 int fd; 4675 socklen_t len; 4676 short so_family, so_type; 4677 int add_sock_token = 0; 4678 struct file *fp; 4679 struct f_audit_data *fad; 4680 au_kcontext_t *kctx = GET_KCTX_PZ; 4681 4682 fd = (int)uap->fd; 4683 4684 /* bail if an error */ 4685 if (error) { 4686 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 4687 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4688 /* XXX include destination address from system call arguments */ 4689 return; 4690 } 4691 4692 if ((so = getsonode(fd, &err, &fp)) == NULL) { 4693 /* 4694 * not security relevant if doing a sendto using non socket 4695 * so no extra tokens. Should probably turn off audit record 4696 * generation here. 4697 */ 4698 return; 4699 } 4700 4701 so_family = so->so_family; 4702 so_type = so->so_type; 4703 4704 /* 4705 * only putout SOCKET_EX token if INET/INET6 family. 4706 * XXX - what do we do about other families? 4707 */ 4708 4709 switch (so_family) { 4710 case AF_INET: 4711 case AF_INET6: 4712 4713 /* 4714 * if datagram type socket, then just use what is in 4715 * socket structure for local address. 4716 * XXX - what do we do for other types? 4717 */ 4718 if ((so->so_type == SOCK_DGRAM) || 4719 (so->so_type == SOCK_RAW)) { 4720 4721 bzero((void *)so_laddr, sizeof (so_laddr)); 4722 bzero((void *)so_faddr, sizeof (so_faddr)); 4723 4724 /* get local address */ 4725 len = sizeof (so_laddr); 4726 (void) socket_getsockname(so, 4727 (struct sockaddr *)so_laddr, &len, CRED()); 4728 4729 /* get peer address */ 4730 4731 /* sanity check */ 4732 if (uap->to == NULL) 4733 break; 4734 4735 /* sanity checks */ 4736 if (uap->tolen == 0) 4737 break; 4738 4739 tolen = (socklen_t)uap->tolen; 4740 4741 /* enforce maximum size */ 4742 if (tolen > sizeof (so_faddr)) 4743 tolen = sizeof (so_faddr); 4744 4745 if (copyin((caddr_t)(uap->to), so_faddr, tolen) != 0) 4746 break; 4747 4748 add_sock_token = 1; 4749 } else { 4750 /* 4751 * check if this is first time through. 4752 */ 4753 4754 /* get path from file struct here */ 4755 fad = F2A(fp); 4756 ASSERT(fad); 4757 4758 /* 4759 * already processed this file for write attempt 4760 */ 4761 if (fad->fad_flags & FAD_WRITE) { 4762 /* don't want to audit every sendto attempt */ 4763 tad->tad_flag = 0; 4764 /* free any residual audit data */ 4765 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 4766 releasef(fd); 4767 return; 4768 } 4769 /* 4770 * mark things so we know what happened and don't 4771 * repeat things 4772 */ 4773 fad->fad_flags |= FAD_WRITE; 4774 4775 bzero((void *)so_laddr, sizeof (so_laddr)); 4776 bzero((void *)so_faddr, sizeof (so_faddr)); 4777 4778 /* get local and foreign addresses */ 4779 len = sizeof (so_laddr); 4780 (void) socket_getsockname(so, 4781 (struct sockaddr *)so_laddr, &len, CRED()); 4782 len = sizeof (so_faddr); 4783 (void) socket_getpeername(so, 4784 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 4785 4786 add_sock_token = 1; 4787 } 4788 4789 /* XXX - what about SOCK_RDM/SOCK_SEQPACKET ??? */ 4790 4791 break; 4792 4793 case AF_UNIX: 4794 /* 4795 * first check if this is first time through. Too much 4796 * duplicate code to put this in an aui_ routine. 4797 */ 4798 4799 /* get path from file struct here */ 4800 fad = F2A(fp); 4801 ASSERT(fad); 4802 4803 /* 4804 * already processed this file for write attempt 4805 */ 4806 if (fad->fad_flags & FAD_WRITE) { 4807 /* don't want to audit every sendto attempt */ 4808 tad->tad_flag = 0; 4809 /* free any residual audit data */ 4810 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 4811 releasef(fd); 4812 return; 4813 } 4814 /* 4815 * mark things so we know what happened and don't 4816 * repeat things 4817 */ 4818 fad->fad_flags |= FAD_WRITE; 4819 4820 if (fad->fad_aupath != NULL) { 4821 au_uwrite(au_to_path(fad->fad_aupath)); 4822 } else { 4823 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 4824 } 4825 4826 audit_attributes(fp->f_vnode); 4827 4828 releasef(fd); 4829 4830 return; 4831 4832 default: 4833 break; 4834 4835 } 4836 4837 releasef(fd); 4838 4839 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 4840 4841 if (add_sock_token == 0) { 4842 au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family)); 4843 au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type)); 4844 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4845 return; 4846 } 4847 4848 au_uwrite(au_to_arg32(3, "flags", (uint32_t)(uap->flags))); 4849 4850 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 4851 4852 } 4853 4854 /* 4855 * XXX socket(2) may be equivalent to open(2) on a unix domain 4856 * socket. This needs investigation. 4857 */ 4858 4859 /*ARGSUSED*/ 4860 static void 4861 aus_socket(struct t_audit_data *tad) 4862 { 4863 struct a { 4864 long domain; 4865 long type; 4866 long protocol; 4867 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 4868 4869 au_uwrite(au_to_arg32(1, "domain", (uint32_t)uap->domain)); 4870 au_uwrite(au_to_arg32(2, "type", (uint32_t)uap->type)); 4871 au_uwrite(au_to_arg32(3, "protocol", (uint32_t)uap->protocol)); 4872 } 4873 4874 /*ARGSUSED*/ 4875 static void 4876 aus_sigqueue(struct t_audit_data *tad) 4877 { 4878 struct a { 4879 long pid; 4880 long signo; 4881 long *val; 4882 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 4883 struct proc *p; 4884 uid_t uid, ruid; 4885 gid_t gid, rgid; 4886 pid_t pid; 4887 const auditinfo_addr_t *ainfo; 4888 cred_t *cr; 4889 4890 pid = (pid_t)uap->pid; 4891 4892 au_uwrite(au_to_arg32(2, "signal", (uint32_t)uap->signo)); 4893 if (pid > 0) { 4894 mutex_enter(&pidlock); 4895 if ((p = prfind(pid)) == (struct proc *)0) { 4896 mutex_exit(&pidlock); 4897 return; 4898 } 4899 mutex_enter(&p->p_lock); /* so process doesn't go away */ 4900 mutex_exit(&pidlock); 4901 4902 mutex_enter(&p->p_crlock); 4903 crhold(cr = p->p_cred); 4904 mutex_exit(&p->p_crlock); 4905 mutex_exit(&p->p_lock); 4906 4907 ainfo = crgetauinfo(cr); 4908 if (ainfo == NULL) { 4909 crfree(cr); 4910 return; 4911 } 4912 4913 uid = crgetuid(cr); 4914 gid = crgetgid(cr); 4915 ruid = crgetruid(cr); 4916 rgid = crgetrgid(cr); 4917 au_uwrite(au_to_process(uid, gid, ruid, rgid, pid, 4918 ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid)); 4919 crfree(cr); 4920 } 4921 else 4922 au_uwrite(au_to_arg32(1, "process ID", (uint32_t)pid)); 4923 } 4924 4925 /*ARGSUSED*/ 4926 static void 4927 aus_inst_sync(struct t_audit_data *tad) 4928 { 4929 struct a { 4930 long name; /* char */ 4931 long flags; 4932 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 4933 4934 au_uwrite(au_to_arg32(2, "flags", (uint32_t)uap->flags)); 4935 } 4936 4937 /*ARGSUSED*/ 4938 static void 4939 aus_brandsys(struct t_audit_data *tad) 4940 { 4941 klwp_t *clwp = ttolwp(curthread); 4942 4943 struct a { 4944 long cmd; 4945 long arg1; 4946 long arg2; 4947 long arg3; 4948 long arg4; 4949 long arg5; 4950 long arg6; 4951 } *uap = (struct a *)clwp->lwp_ap; 4952 4953 au_uwrite(au_to_arg32(1, "cmd", (uint_t)uap->cmd)); 4954 #ifdef _LP64 4955 au_uwrite(au_to_arg64(2, "arg1", (uint64_t)uap->arg1)); 4956 au_uwrite(au_to_arg64(3, "arg2", (uint64_t)uap->arg2)); 4957 au_uwrite(au_to_arg64(4, "arg3", (uint64_t)uap->arg3)); 4958 au_uwrite(au_to_arg64(5, "arg4", (uint64_t)uap->arg4)); 4959 au_uwrite(au_to_arg64(6, "arg5", (uint64_t)uap->arg5)); 4960 au_uwrite(au_to_arg64(7, "arg6", (uint64_t)uap->arg6)); 4961 #else 4962 au_uwrite(au_to_arg32(2, "arg1", (uint32_t)uap->arg1)); 4963 au_uwrite(au_to_arg32(3, "arg2", (uint32_t)uap->arg2)); 4964 au_uwrite(au_to_arg32(4, "arg3", (uint32_t)uap->arg3)); 4965 au_uwrite(au_to_arg32(5, "arg4", (uint32_t)uap->arg4)); 4966 au_uwrite(au_to_arg32(6, "arg5", (uint32_t)uap->arg5)); 4967 au_uwrite(au_to_arg32(7, "arg6", (uint32_t)uap->arg6)); 4968 #endif 4969 } 4970 4971 /*ARGSUSED*/ 4972 static void 4973 aus_p_online(struct t_audit_data *tad) 4974 { 4975 struct a { 4976 long processor_id; 4977 long flag; 4978 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 4979 4980 struct flags { 4981 int flag; 4982 char *cflag; 4983 } aflags[6] = { 4984 { P_ONLINE, "P_ONLINE"}, 4985 { P_OFFLINE, "P_OFFLINE"}, 4986 { P_NOINTR, "P_NOINTR"}, 4987 { P_SPARE, "P_SPARE"}, 4988 { P_FAULTED, "P_FAULTED"}, 4989 { P_STATUS, "P_STATUS"} 4990 }; 4991 int i; 4992 char *cflag; 4993 4994 au_uwrite(au_to_arg32(1, "processor ID", (uint32_t)uap->processor_id)); 4995 au_uwrite(au_to_arg32(2, "flag", (uint32_t)uap->flag)); 4996 4997 for (i = 0; i < 6; i++) { 4998 if (aflags[i].flag == uap->flag) 4999 break; 5000 } 5001 cflag = (i == 6) ? "bad flag":aflags[i].cflag; 5002 5003 au_uwrite(au_to_text(cflag)); 5004 } 5005 5006 /*ARGSUSED*/ 5007 static void 5008 aus_processor_bind(struct t_audit_data *tad) 5009 { 5010 struct a { 5011 long id_type; 5012 long id; 5013 long processor_id; 5014 long obind; 5015 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5016 5017 struct proc *p; 5018 int lwpcnt; 5019 uid_t uid, ruid; 5020 gid_t gid, rgid; 5021 pid_t pid; 5022 const auditinfo_addr_t *ainfo; 5023 cred_t *cr; 5024 5025 au_uwrite(au_to_arg32(1, "ID type", (uint32_t)uap->id_type)); 5026 au_uwrite(au_to_arg32(2, "ID", (uint32_t)uap->id)); 5027 if (uap->processor_id == PBIND_NONE) 5028 au_uwrite(au_to_text("PBIND_NONE")); 5029 else 5030 au_uwrite(au_to_arg32(3, "processor_id", 5031 (uint32_t)uap->processor_id)); 5032 5033 switch (uap->id_type) { 5034 case P_MYID: 5035 case P_LWPID: 5036 mutex_enter(&pidlock); 5037 p = ttoproc(curthread); 5038 if (p == NULL || p->p_as == &kas) { 5039 mutex_exit(&pidlock); 5040 return; 5041 } 5042 mutex_enter(&p->p_lock); 5043 mutex_exit(&pidlock); 5044 lwpcnt = p->p_lwpcnt; 5045 pid = p->p_pid; 5046 5047 mutex_enter(&p->p_crlock); 5048 crhold(cr = p->p_cred); 5049 mutex_exit(&p->p_crlock); 5050 mutex_exit(&p->p_lock); 5051 5052 ainfo = crgetauinfo(cr); 5053 if (ainfo == NULL) { 5054 crfree(cr); 5055 return; 5056 } 5057 5058 uid = crgetuid(cr); 5059 gid = crgetgid(cr); 5060 ruid = crgetruid(cr); 5061 rgid = crgetrgid(cr); 5062 au_uwrite(au_to_process(uid, gid, ruid, rgid, pid, 5063 ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid)); 5064 crfree(cr); 5065 break; 5066 case P_PID: 5067 mutex_enter(&pidlock); 5068 p = prfind(uap->id); 5069 if (p == NULL || p->p_as == &kas) { 5070 mutex_exit(&pidlock); 5071 return; 5072 } 5073 mutex_enter(&p->p_lock); 5074 mutex_exit(&pidlock); 5075 lwpcnt = p->p_lwpcnt; 5076 pid = p->p_pid; 5077 5078 mutex_enter(&p->p_crlock); 5079 crhold(cr = p->p_cred); 5080 mutex_exit(&p->p_crlock); 5081 mutex_exit(&p->p_lock); 5082 5083 ainfo = crgetauinfo(cr); 5084 if (ainfo == NULL) { 5085 crfree(cr); 5086 return; 5087 } 5088 5089 uid = crgetuid(cr); 5090 gid = crgetgid(cr); 5091 ruid = crgetruid(cr); 5092 rgid = crgetrgid(cr); 5093 au_uwrite(au_to_process(uid, gid, ruid, rgid, pid, 5094 ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid)); 5095 crfree(cr); 5096 5097 break; 5098 default: 5099 return; 5100 } 5101 5102 if (uap->processor_id == PBIND_NONE && 5103 (!(uap->id_type == P_LWPID && lwpcnt > 1))) 5104 au_uwrite(au_to_text("PBIND_NONE for process")); 5105 else 5106 au_uwrite(au_to_arg32(3, "processor_id", 5107 (uint32_t)uap->processor_id)); 5108 } 5109 5110 /*ARGSUSED*/ 5111 static au_event_t 5112 aui_doorfs(au_event_t e) 5113 { 5114 uint32_t code; 5115 5116 struct a { /* doorfs */ 5117 long a1; 5118 long a2; 5119 long a3; 5120 long a4; 5121 long a5; 5122 long code; 5123 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5124 5125 /* 5126 * audit formats for several of the 5127 * door calls have not yet been determined 5128 */ 5129 code = (uint32_t)uap->code; 5130 switch (code) { 5131 case DOOR_CALL: 5132 e = AUE_DOORFS_DOOR_CALL; 5133 break; 5134 case DOOR_RETURN: 5135 e = AUE_NULL; 5136 break; 5137 case DOOR_CREATE: 5138 e = AUE_DOORFS_DOOR_CREATE; 5139 break; 5140 case DOOR_REVOKE: 5141 e = AUE_DOORFS_DOOR_REVOKE; 5142 break; 5143 case DOOR_INFO: 5144 e = AUE_NULL; 5145 break; 5146 case DOOR_UCRED: 5147 e = AUE_NULL; 5148 break; 5149 case DOOR_BIND: 5150 e = AUE_NULL; 5151 break; 5152 case DOOR_UNBIND: 5153 e = AUE_NULL; 5154 break; 5155 case DOOR_GETPARAM: 5156 e = AUE_NULL; 5157 break; 5158 case DOOR_SETPARAM: 5159 e = AUE_NULL; 5160 break; 5161 default: /* illegal system call */ 5162 e = AUE_NULL; 5163 break; 5164 } 5165 5166 return (e); 5167 } 5168 5169 static door_node_t * 5170 au_door_lookup(int did) 5171 { 5172 vnode_t *vp; 5173 file_t *fp; 5174 5175 if ((fp = getf(did)) == NULL) 5176 return (NULL); 5177 /* 5178 * Use the underlying vnode (we may be namefs mounted) 5179 */ 5180 if (VOP_REALVP(fp->f_vnode, &vp, NULL)) 5181 vp = fp->f_vnode; 5182 5183 if (vp == NULL || vp->v_type != VDOOR) { 5184 releasef(did); 5185 return (NULL); 5186 } 5187 5188 return (VTOD(vp)); 5189 } 5190 5191 /*ARGSUSED*/ 5192 static void 5193 aus_doorfs(struct t_audit_data *tad) 5194 { 5195 5196 struct a { /* doorfs */ 5197 long a1; 5198 long a2; 5199 long a3; 5200 long a4; 5201 long a5; 5202 long code; 5203 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5204 5205 door_node_t *dp; 5206 struct proc *p; 5207 uint32_t did; 5208 uid_t uid, ruid; 5209 gid_t gid, rgid; 5210 pid_t pid; 5211 const auditinfo_addr_t *ainfo; 5212 cred_t *cr; 5213 5214 did = (uint32_t)uap->a1; 5215 5216 switch (tad->tad_event) { 5217 case AUE_DOORFS_DOOR_CALL: 5218 au_uwrite(au_to_arg32(1, "door ID", (uint32_t)did)); 5219 if ((dp = au_door_lookup(did)) == NULL) 5220 break; 5221 5222 if (DOOR_INVALID(dp)) { 5223 releasef(did); 5224 break; 5225 } 5226 5227 if ((p = dp->door_target) == NULL) { 5228 releasef(did); 5229 break; 5230 } 5231 mutex_enter(&p->p_lock); 5232 releasef(did); 5233 5234 pid = p->p_pid; 5235 5236 mutex_enter(&p->p_crlock); 5237 crhold(cr = p->p_cred); 5238 mutex_exit(&p->p_crlock); 5239 mutex_exit(&p->p_lock); 5240 5241 ainfo = crgetauinfo(cr); 5242 if (ainfo == NULL) { 5243 crfree(cr); 5244 return; 5245 } 5246 uid = crgetuid(cr); 5247 gid = crgetgid(cr); 5248 ruid = crgetruid(cr); 5249 rgid = crgetrgid(cr); 5250 au_uwrite(au_to_process(uid, gid, ruid, rgid, pid, 5251 ainfo->ai_auid, ainfo->ai_asid, &ainfo->ai_termid)); 5252 crfree(cr); 5253 break; 5254 case AUE_DOORFS_DOOR_RETURN: 5255 /* 5256 * We may want to write information about 5257 * all doors (if any) which will be copied 5258 * by this call to the user space 5259 */ 5260 break; 5261 case AUE_DOORFS_DOOR_CREATE: 5262 au_uwrite(au_to_arg32(3, "door attr", (uint32_t)uap->a3)); 5263 break; 5264 case AUE_DOORFS_DOOR_REVOKE: 5265 au_uwrite(au_to_arg32(1, "door ID", (uint32_t)did)); 5266 break; 5267 case AUE_DOORFS_DOOR_INFO: 5268 break; 5269 case AUE_DOORFS_DOOR_CRED: 5270 break; 5271 case AUE_DOORFS_DOOR_BIND: 5272 break; 5273 case AUE_DOORFS_DOOR_UNBIND: { 5274 break; 5275 } 5276 default: /* illegal system call */ 5277 break; 5278 } 5279 } 5280 5281 /*ARGSUSED*/ 5282 static au_event_t 5283 aui_acl(au_event_t e) 5284 { 5285 struct a { 5286 union { 5287 long name; /* char */ 5288 long fd; 5289 } obj; 5290 5291 long cmd; 5292 long nentries; 5293 long arg; /* aclent_t */ 5294 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5295 5296 switch (uap->cmd) { 5297 case SETACL: 5298 case ACE_SETACL: 5299 /* 5300 * acl(SETACL/ACE_SETACL, ...) and facl(SETACL/ACE_SETACL, ...) 5301 * are expected. 5302 */ 5303 break; 5304 case GETACL: 5305 case GETACLCNT: 5306 case ACE_GETACL: 5307 case ACE_GETACLCNT: 5308 /* do nothing for these four values. */ 5309 e = AUE_NULL; 5310 break; 5311 default: 5312 /* illegal system call */ 5313 break; 5314 } 5315 5316 return (e); 5317 } 5318 5319 static void 5320 au_acl(int cmd, int nentries, caddr_t bufp) 5321 { 5322 size_t a_size; 5323 aclent_t *aclbufp; 5324 ace_t *acebufp; 5325 int i; 5326 5327 switch (cmd) { 5328 case GETACL: 5329 case GETACLCNT: 5330 break; 5331 case SETACL: 5332 if (nentries < 3) 5333 break; 5334 5335 a_size = nentries * sizeof (aclent_t); 5336 5337 if ((aclbufp = kmem_alloc(a_size, KM_SLEEP)) == NULL) 5338 break; 5339 if (copyin(bufp, aclbufp, a_size)) { 5340 kmem_free(aclbufp, a_size); 5341 break; 5342 } 5343 for (i = 0; i < nentries; i++) { 5344 au_uwrite(au_to_acl(aclbufp + i)); 5345 } 5346 kmem_free(aclbufp, a_size); 5347 break; 5348 5349 case ACE_SETACL: 5350 if (nentries < 1 || nentries > MAX_ACL_ENTRIES) 5351 break; 5352 5353 a_size = nentries * sizeof (ace_t); 5354 if ((acebufp = kmem_alloc(a_size, KM_SLEEP)) == NULL) 5355 break; 5356 if (copyin(bufp, acebufp, a_size)) { 5357 kmem_free(acebufp, a_size); 5358 break; 5359 } 5360 for (i = 0; i < nentries; i++) { 5361 au_uwrite(au_to_ace(acebufp + i)); 5362 } 5363 kmem_free(acebufp, a_size); 5364 break; 5365 default: 5366 break; 5367 } 5368 } 5369 5370 /*ARGSUSED*/ 5371 static void 5372 aus_acl(struct t_audit_data *tad) 5373 { 5374 struct a { 5375 long fname; 5376 long cmd; 5377 long nentries; 5378 long aclbufp; 5379 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5380 5381 au_uwrite(au_to_arg32(2, "cmd", (uint32_t)uap->cmd)); 5382 au_uwrite(au_to_arg32(3, "nentries", (uint32_t)uap->nentries)); 5383 5384 au_acl(uap->cmd, uap->nentries, (caddr_t)uap->aclbufp); 5385 } 5386 5387 /*ARGSUSED*/ 5388 static void 5389 aus_facl(struct t_audit_data *tad) 5390 { 5391 struct a { 5392 long fd; 5393 long cmd; 5394 long nentries; 5395 long aclbufp; 5396 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5397 struct file *fp; 5398 struct vnode *vp; 5399 struct f_audit_data *fad; 5400 int fd; 5401 5402 au_uwrite(au_to_arg32(2, "cmd", (uint32_t)uap->cmd)); 5403 au_uwrite(au_to_arg32(3, "nentries", (uint32_t)uap->nentries)); 5404 5405 fd = (int)uap->fd; 5406 5407 if ((fp = getf(fd)) == NULL) 5408 return; 5409 5410 /* get path from file struct here */ 5411 fad = F2A(fp); 5412 if (fad->fad_aupath != NULL) { 5413 au_uwrite(au_to_path(fad->fad_aupath)); 5414 } else { 5415 au_uwrite(au_to_arg32(1, "no path: fd", (uint32_t)fd)); 5416 } 5417 5418 vp = fp->f_vnode; 5419 audit_attributes(vp); 5420 5421 /* decrement file descriptor reference count */ 5422 releasef(fd); 5423 5424 au_acl(uap->cmd, uap->nentries, (caddr_t)uap->aclbufp); 5425 } 5426 5427 /*ARGSUSED*/ 5428 static void 5429 auf_read(tad, error, rval) 5430 struct t_audit_data *tad; 5431 int error; 5432 rval_t *rval; 5433 { 5434 struct file *fp; 5435 struct f_audit_data *fad; 5436 int fd; 5437 register struct a { 5438 long fd; 5439 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5440 au_kcontext_t *kctx = GET_KCTX_PZ; 5441 5442 fd = (int)uap->fd; 5443 5444 /* 5445 * convert file pointer to file descriptor 5446 * Note: fd ref count incremented here. 5447 */ 5448 if ((fp = getf(fd)) == NULL) 5449 return; 5450 5451 /* get path from file struct here */ 5452 fad = F2A(fp); 5453 ASSERT(fad); 5454 5455 /* 5456 * already processed this file for read attempt 5457 * 5458 * XXX might be better to turn off auditing in a aui_read() routine. 5459 */ 5460 if (fad->fad_flags & FAD_READ) { 5461 /* don't really want to audit every read attempt */ 5462 tad->tad_flag = 0; 5463 /* free any residual audit data */ 5464 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5465 releasef(fd); 5466 return; 5467 } 5468 /* mark things so we know what happened and don't repeat things */ 5469 fad->fad_flags |= FAD_READ; 5470 5471 if (fad->fad_aupath != NULL) { 5472 au_uwrite(au_to_path(fad->fad_aupath)); 5473 } else { 5474 au_uwrite(au_to_arg32(1, "no path: fd", (uint32_t)fd)); 5475 } 5476 5477 /* include attributes */ 5478 audit_attributes(fp->f_vnode); 5479 5480 /* decrement file descriptor reference count */ 5481 releasef(fd); 5482 } 5483 5484 /*ARGSUSED*/ 5485 static void 5486 auf_write(tad, error, rval) 5487 struct t_audit_data *tad; 5488 int error; 5489 rval_t *rval; 5490 { 5491 struct file *fp; 5492 struct f_audit_data *fad; 5493 int fd; 5494 register struct a { 5495 long fd; 5496 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5497 au_kcontext_t *kctx = GET_KCTX_PZ; 5498 5499 fd = (int)uap->fd; 5500 5501 /* 5502 * convert file pointer to file descriptor 5503 * Note: fd ref count incremented here. 5504 */ 5505 if ((fp = getf(fd)) == NULL) 5506 return; 5507 5508 /* get path from file struct here */ 5509 fad = F2A(fp); 5510 ASSERT(fad); 5511 5512 /* 5513 * already processed this file for write attempt 5514 * 5515 * XXX might be better to turn off auditing in a aus_write() routine. 5516 */ 5517 if (fad->fad_flags & FAD_WRITE) { 5518 /* don't really want to audit every write attempt */ 5519 tad->tad_flag = 0; 5520 /* free any residual audit data */ 5521 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5522 releasef(fd); 5523 return; 5524 } 5525 /* mark things so we know what happened and don't repeat things */ 5526 fad->fad_flags |= FAD_WRITE; 5527 5528 if (fad->fad_aupath != NULL) { 5529 au_uwrite(au_to_path(fad->fad_aupath)); 5530 } else { 5531 au_uwrite(au_to_arg32(1, "no path: fd", (uint32_t)fd)); 5532 } 5533 5534 /* include attributes */ 5535 audit_attributes(fp->f_vnode); 5536 5537 /* decrement file descriptor reference count */ 5538 releasef(fd); 5539 } 5540 5541 /*ARGSUSED*/ 5542 static void 5543 auf_recv(tad, error, rval) 5544 struct t_audit_data *tad; 5545 int error; 5546 rval_t *rval; 5547 { 5548 struct sonode *so; 5549 char so_laddr[sizeof (struct sockaddr_in6)]; 5550 char so_faddr[sizeof (struct sockaddr_in6)]; 5551 struct file *fp; 5552 struct f_audit_data *fad; 5553 int fd; 5554 int err; 5555 socklen_t len; 5556 short so_family, so_type; 5557 register struct a { 5558 long fd; 5559 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5560 au_kcontext_t *kctx = GET_KCTX_PZ; 5561 5562 /* 5563 * If there was an error, then nothing to do. Only generate 5564 * audit record on first successful recv. 5565 */ 5566 if (error) { 5567 /* Turn off audit record generation here. */ 5568 tad->tad_flag = 0; 5569 /* free any residual audit data */ 5570 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5571 return; 5572 } 5573 5574 fd = (int)uap->fd; 5575 5576 if ((so = getsonode(fd, &err, &fp)) == NULL) { 5577 /* Turn off audit record generation here. */ 5578 tad->tad_flag = 0; 5579 /* free any residual audit data */ 5580 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5581 return; 5582 } 5583 5584 /* get path from file struct here */ 5585 fad = F2A(fp); 5586 ASSERT(fad); 5587 5588 /* 5589 * already processed this file for read attempt 5590 */ 5591 if (fad->fad_flags & FAD_READ) { 5592 releasef(fd); 5593 /* don't really want to audit every recv call */ 5594 tad->tad_flag = 0; 5595 /* free any residual audit data */ 5596 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5597 return; 5598 } 5599 5600 /* mark things so we know what happened and don't repeat things */ 5601 fad->fad_flags |= FAD_READ; 5602 5603 so_family = so->so_family; 5604 so_type = so->so_type; 5605 5606 switch (so_family) { 5607 case AF_INET: 5608 case AF_INET6: 5609 /* 5610 * Only for connections. 5611 * XXX - do we need to worry about SOCK_DGRAM or other types??? 5612 */ 5613 if (so->so_state & SS_ISBOUND) { 5614 5615 bzero((void *)so_laddr, sizeof (so_laddr)); 5616 bzero((void *)so_faddr, sizeof (so_faddr)); 5617 5618 /* get local and foreign addresses */ 5619 len = sizeof (so_laddr); 5620 (void) socket_getsockname(so, 5621 (struct sockaddr *)so_laddr, &len, CRED()); 5622 len = sizeof (so_faddr); 5623 (void) socket_getpeername(so, 5624 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 5625 5626 /* 5627 * only way to drop out of switch. Note that we 5628 * we release fd below. 5629 */ 5630 5631 break; 5632 } 5633 5634 releasef(fd); 5635 5636 /* don't really want to audit every recv call */ 5637 tad->tad_flag = 0; 5638 /* free any residual audit data */ 5639 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5640 5641 return; 5642 5643 case AF_UNIX: 5644 5645 if (fad->fad_aupath != NULL) { 5646 au_uwrite(au_to_path(fad->fad_aupath)); 5647 } else { 5648 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 5649 } 5650 5651 audit_attributes(fp->f_vnode); 5652 5653 releasef(fd); 5654 5655 return; 5656 5657 default: 5658 releasef(fd); 5659 5660 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 5661 au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family)); 5662 au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type)); 5663 5664 return; 5665 } 5666 5667 releasef(fd); 5668 5669 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 5670 5671 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 5672 5673 } 5674 5675 /*ARGSUSED*/ 5676 static void 5677 auf_send(tad, error, rval) 5678 struct t_audit_data *tad; 5679 int error; 5680 rval_t *rval; 5681 { 5682 struct sonode *so; 5683 char so_laddr[sizeof (struct sockaddr_in6)]; 5684 char so_faddr[sizeof (struct sockaddr_in6)]; 5685 struct file *fp; 5686 struct f_audit_data *fad; 5687 int fd; 5688 int err; 5689 socklen_t len; 5690 short so_family, so_type; 5691 register struct a { 5692 long fd; 5693 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5694 au_kcontext_t *kctx = GET_KCTX_PZ; 5695 5696 fd = (int)uap->fd; 5697 5698 /* 5699 * If there was an error, then nothing to do. Only generate 5700 * audit record on first successful send. 5701 */ 5702 if (error != 0) { 5703 /* Turn off audit record generation here. */ 5704 tad->tad_flag = 0; 5705 /* free any residual audit data */ 5706 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5707 return; 5708 } 5709 5710 fd = (int)uap->fd; 5711 5712 if ((so = getsonode(fd, &err, &fp)) == NULL) { 5713 /* Turn off audit record generation here. */ 5714 tad->tad_flag = 0; 5715 /* free any residual audit data */ 5716 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5717 return; 5718 } 5719 5720 /* get path from file struct here */ 5721 fad = F2A(fp); 5722 ASSERT(fad); 5723 5724 /* 5725 * already processed this file for write attempt 5726 */ 5727 if (fad->fad_flags & FAD_WRITE) { 5728 releasef(fd); 5729 /* don't really want to audit every send call */ 5730 tad->tad_flag = 0; 5731 /* free any residual audit data */ 5732 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5733 return; 5734 } 5735 5736 /* mark things so we know what happened and don't repeat things */ 5737 fad->fad_flags |= FAD_WRITE; 5738 5739 so_family = so->so_family; 5740 so_type = so->so_type; 5741 5742 switch (so_family) { 5743 case AF_INET: 5744 case AF_INET6: 5745 /* 5746 * Only for connections. 5747 * XXX - do we need to worry about SOCK_DGRAM or other types??? 5748 */ 5749 if (so->so_state & SS_ISBOUND) { 5750 5751 bzero((void *)so_laddr, sizeof (so_laddr)); 5752 bzero((void *)so_faddr, sizeof (so_faddr)); 5753 5754 /* get local and foreign addresses */ 5755 len = sizeof (so_laddr); 5756 (void) socket_getsockname(so, 5757 (struct sockaddr *)so_laddr, &len, CRED()); 5758 len = sizeof (so_faddr); 5759 (void) socket_getpeername(so, 5760 (struct sockaddr *)so_faddr, &len, B_FALSE, CRED()); 5761 5762 /* 5763 * only way to drop out of switch. Note that we 5764 * we release fd below. 5765 */ 5766 5767 break; 5768 } 5769 5770 releasef(fd); 5771 /* don't really want to audit every send call */ 5772 tad->tad_flag = 0; 5773 /* free any residual audit data */ 5774 au_close(kctx, &(u_ad), 0, 0, 0, NULL); 5775 5776 return; 5777 5778 case AF_UNIX: 5779 5780 if (fad->fad_aupath != NULL) { 5781 au_uwrite(au_to_path(fad->fad_aupath)); 5782 } else { 5783 au_uwrite(au_to_arg32(1, "no path: fd", fd)); 5784 } 5785 5786 audit_attributes(fp->f_vnode); 5787 5788 releasef(fd); 5789 5790 return; 5791 5792 default: 5793 releasef(fd); 5794 5795 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 5796 au_uwrite(au_to_arg32(1, "family", (uint32_t)so_family)); 5797 au_uwrite(au_to_arg32(1, "type", (uint32_t)so_type)); 5798 5799 return; 5800 } 5801 5802 releasef(fd); 5803 5804 au_uwrite(au_to_arg32(1, "so", (uint32_t)fd)); 5805 5806 au_uwrite(au_to_socket_ex(so_family, so_type, so_laddr, so_faddr)); 5807 } 5808 5809 static au_event_t 5810 aui_forksys(au_event_t e) 5811 { 5812 struct a { 5813 long subcode; 5814 long flags; 5815 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5816 5817 switch ((uint_t)uap->subcode) { 5818 case 0: 5819 e = AUE_FORK1; 5820 break; 5821 case 1: 5822 e = AUE_FORKALL; 5823 break; 5824 case 2: 5825 e = AUE_VFORK; 5826 break; 5827 default: 5828 e = AUE_NULL; 5829 break; 5830 } 5831 5832 return (e); 5833 } 5834 5835 /*ARGSUSED*/ 5836 static au_event_t 5837 aui_portfs(au_event_t e) 5838 { 5839 struct a { /* portfs */ 5840 long a1; 5841 long a2; 5842 long a3; 5843 } *uap = (struct a *)ttolwp(curthread)->lwp_ap; 5844 5845 /* 5846 * check opcode 5847 */ 5848 switch (((uint_t)uap->a1) & PORT_CODE_MASK) { 5849 case PORT_ASSOCIATE: 5850 /* check source */ 5851 if (((uint_t)uap->a3 == PORT_SOURCE_FILE) || 5852 ((uint_t)uap->a3 == PORT_SOURCE_FD)) { 5853 e = AUE_PORTFS_ASSOCIATE; 5854 } else { 5855 e = AUE_NULL; 5856 } 5857 break; 5858 case PORT_DISSOCIATE: 5859 /* check source */ 5860 if (((uint_t)uap->a3 == PORT_SOURCE_FILE) || 5861 ((uint_t)uap->a3 == PORT_SOURCE_FD)) { 5862 e = AUE_PORTFS_DISSOCIATE; 5863 } else { 5864 e = AUE_NULL; 5865 } 5866 break; 5867 default: 5868 e = AUE_NULL; 5869 } 5870 return (e); 5871 }