Home | History | Annotate | Line # | Download | only in suser
secmodel_suser.c revision 1.37
      1 /* $NetBSD: secmodel_suser.c,v 1.37 2012/01/13 16:05:15 cegger Exp $ */
      2 /*-
      3  * Copyright (c) 2006 Elad Efrat <elad (at) NetBSD.org>
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  * 3. The name of the author may not be used to endorse or promote products
     15  *    derived from this software without specific prior written permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 /*
     30  * This file contains kauth(9) listeners needed to implement the traditional
     31  * NetBSD superuser access restrictions.
     32  *
     33  * There are two main resources a request can be issued to: user-owned and
     34  * system owned. For the first, traditional Unix access checks are done, as
     35  * well as superuser checks. If needed, the request context is examined before
     36  * a decision is made. For the latter, usually only superuser checks are done
     37  * as normal users are not allowed to access system resources.
     38  */
     39 
     40 #include <sys/cdefs.h>
     41 __KERNEL_RCSID(0, "$NetBSD: secmodel_suser.c,v 1.37 2012/01/13 16:05:15 cegger Exp $");
     42 
     43 #include <sys/types.h>
     44 #include <sys/param.h>
     45 #include <sys/kauth.h>
     46 
     47 #include <sys/mutex.h>
     48 #include <sys/mount.h>
     49 #include <sys/socketvar.h>
     50 #include <sys/sysctl.h>
     51 #include <sys/vnode.h>
     52 #include <sys/proc.h>
     53 #include <sys/module.h>
     54 
     55 #include <secmodel/secmodel.h>
     56 #include <secmodel/suser/suser.h>
     57 
     58 MODULE(MODULE_CLASS_SECMODEL, suser, NULL);
     59 
     60 static kauth_listener_t l_generic, l_system, l_process, l_network, l_machdep,
     61     l_device, l_vnode;
     62 
     63 static secmodel_t suser_sm;
     64 static struct sysctllog *suser_sysctl_log;
     65 
     66 void
     67 sysctl_security_suser_setup(struct sysctllog **clog)
     68 {
     69 	const struct sysctlnode *rnode;
     70 
     71 	sysctl_createv(clog, 0, NULL, &rnode,
     72 		       CTLFLAG_PERMANENT,
     73 		       CTLTYPE_NODE, "security", NULL,
     74 		       NULL, 0, NULL, 0,
     75 		       CTL_SECURITY, CTL_EOL);
     76 
     77 	sysctl_createv(clog, 0, &rnode, &rnode,
     78 		       CTLFLAG_PERMANENT,
     79 		       CTLTYPE_NODE, "models", NULL,
     80 		       NULL, 0, NULL, 0,
     81 		       CTL_CREATE, CTL_EOL);
     82 
     83 	sysctl_createv(clog, 0, &rnode, &rnode,
     84 		       CTLFLAG_PERMANENT,
     85 		       CTLTYPE_NODE, "suser", NULL,
     86 		       NULL, 0, NULL, 0,
     87 		       CTL_CREATE, CTL_EOL);
     88 
     89 	sysctl_createv(clog, 0, &rnode, NULL,
     90 		       CTLFLAG_PERMANENT,
     91 		       CTLTYPE_STRING, "name", NULL,
     92 		       NULL, 0, __UNCONST(SECMODEL_SUSER_NAME), 0,
     93 		       CTL_CREATE, CTL_EOL);
     94 }
     95 
     96 void
     97 secmodel_suser_init(void)
     98 {
     99 
    100 }
    101 
    102 void
    103 secmodel_suser_start(void)
    104 {
    105 	l_generic = kauth_listen_scope(KAUTH_SCOPE_GENERIC,
    106 	    secmodel_suser_generic_cb, NULL);
    107 	l_system = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
    108 	    secmodel_suser_system_cb, NULL);
    109 	l_process = kauth_listen_scope(KAUTH_SCOPE_PROCESS,
    110 	    secmodel_suser_process_cb, NULL);
    111 	l_network = kauth_listen_scope(KAUTH_SCOPE_NETWORK,
    112 	    secmodel_suser_network_cb, NULL);
    113 	l_machdep = kauth_listen_scope(KAUTH_SCOPE_MACHDEP,
    114 	    secmodel_suser_machdep_cb, NULL);
    115 	l_device = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
    116 	    secmodel_suser_device_cb, NULL);
    117 	l_vnode = kauth_listen_scope(KAUTH_SCOPE_VNODE,
    118 	    secmodel_suser_vnode_cb, NULL);
    119 }
    120 
    121 void
    122 secmodel_suser_stop(void)
    123 {
    124 	kauth_unlisten_scope(l_generic);
    125 	kauth_unlisten_scope(l_system);
    126 	kauth_unlisten_scope(l_process);
    127 	kauth_unlisten_scope(l_network);
    128 	kauth_unlisten_scope(l_machdep);
    129 	kauth_unlisten_scope(l_device);
    130 	kauth_unlisten_scope(l_vnode);
    131 }
    132 
    133 static bool
    134 suser_isroot(kauth_cred_t cred)
    135 {
    136 	return kauth_cred_geteuid(cred) == 0;
    137 }
    138 
    139 static int
    140 suser_eval(const char *what, void *arg, void *ret)
    141 {
    142 	int error = 0;
    143 
    144 	if (strcasecmp(what, "is-root") == 0) {
    145 		kauth_cred_t cred = arg;
    146 		bool *bp = ret;
    147 
    148 		*bp = suser_isroot(cred);
    149 	} else {
    150 		error = ENOENT;
    151 	}
    152 
    153 	return error;
    154 }
    155 
    156 static int
    157 suser_modcmd(modcmd_t cmd, void *arg)
    158 {
    159 	int error = 0;
    160 
    161 	switch (cmd) {
    162 	case MODULE_CMD_INIT:
    163 		error = secmodel_register(&suser_sm,
    164 		    SECMODEL_SUSER_ID, SECMODEL_SUSER_NAME,
    165 		    NULL, suser_eval, NULL);
    166 		if (error != 0)
    167 			printf("suser_modcmd::init: secmodel_register "
    168 			    "returned %d\n", error);
    169 
    170 		secmodel_suser_init();
    171 		secmodel_suser_start();
    172 		sysctl_security_suser_setup(&suser_sysctl_log);
    173 		break;
    174 
    175 	case MODULE_CMD_FINI:
    176 		sysctl_teardown(&suser_sysctl_log);
    177 		secmodel_suser_stop();
    178 
    179 		error = secmodel_deregister(suser_sm);
    180 		if (error != 0)
    181 			printf("suser_modcmd::fini: secmodel_deregister "
    182 			    "returned %d\n", error);
    183 
    184 		break;
    185 
    186 	case MODULE_CMD_AUTOUNLOAD:
    187 		error = EPERM;
    188 		break;
    189 
    190 	default:
    191 		error = ENOTTY;
    192 		break;
    193 	}
    194 
    195 	return (error);
    196 }
    197 
    198 /*
    199  * kauth(9) listener
    200  *
    201  * Security model: Traditional NetBSD
    202  * Scope: Generic
    203  * Responsibility: Superuser access
    204  */
    205 int
    206 secmodel_suser_generic_cb(kauth_cred_t cred, kauth_action_t action,
    207     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    208 {
    209 	bool isroot;
    210 	int result;
    211 
    212 	isroot = suser_isroot(cred);
    213 	result = KAUTH_RESULT_DEFER;
    214 
    215 	switch (action) {
    216 	case KAUTH_GENERIC_ISSUSER:
    217 		if (isroot)
    218 			result = KAUTH_RESULT_ALLOW;
    219 		break;
    220 
    221 	default:
    222 		break;
    223 	}
    224 
    225 	return (result);
    226 }
    227 
    228 /*
    229  * kauth(9) listener
    230  *
    231  * Security model: Traditional NetBSD
    232  * Scope: System
    233  * Responsibility: Superuser access
    234  */
    235 int
    236 secmodel_suser_system_cb(kauth_cred_t cred, kauth_action_t action,
    237     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    238 {
    239 	bool isroot;
    240 	int result;
    241 	enum kauth_system_req req;
    242 
    243 	isroot = suser_isroot(cred);
    244 	result = KAUTH_RESULT_DEFER;
    245 	req = (enum kauth_system_req)arg0;
    246 
    247 	switch (action) {
    248 	case KAUTH_SYSTEM_CPU:
    249 		switch (req) {
    250 		case KAUTH_REQ_SYSTEM_CPU_SETSTATE:
    251 		case KAUTH_REQ_SYSTEM_CPU_UCODE_APPLY:
    252 			if (isroot)
    253 				result = KAUTH_RESULT_ALLOW;
    254 
    255 			break;
    256 
    257 		default:
    258 			break;
    259 		}
    260 
    261 		break;
    262 
    263 	case KAUTH_SYSTEM_FS_QUOTA:
    264 		switch (req) {
    265 		case KAUTH_REQ_SYSTEM_FS_QUOTA_GET:
    266 		case KAUTH_REQ_SYSTEM_FS_QUOTA_ONOFF:
    267 		case KAUTH_REQ_SYSTEM_FS_QUOTA_MANAGE:
    268 		case KAUTH_REQ_SYSTEM_FS_QUOTA_NOLIMIT:
    269 			if (isroot)
    270 				result = KAUTH_RESULT_ALLOW;
    271 			break;
    272 
    273 		default:
    274 			break;
    275 		}
    276 
    277 		break;
    278 
    279 	case KAUTH_SYSTEM_MOUNT:
    280 		switch (req) {
    281 		case KAUTH_REQ_SYSTEM_MOUNT_GET:
    282 			if (isroot) {
    283 				result = KAUTH_RESULT_ALLOW;
    284 				break;
    285 			}
    286 
    287 			break;
    288 
    289 		case KAUTH_REQ_SYSTEM_MOUNT_NEW:
    290 		case KAUTH_REQ_SYSTEM_MOUNT_UNMOUNT:
    291 		case KAUTH_REQ_SYSTEM_MOUNT_UPDATE:
    292 			if (isroot) {
    293 				result = KAUTH_RESULT_ALLOW;
    294 				break;
    295 			}
    296 
    297 			break;
    298 
    299 		default:
    300 			break;
    301 		}
    302 
    303 		break;
    304 
    305 	case KAUTH_SYSTEM_PSET:
    306 		switch (req) {
    307 		case KAUTH_REQ_SYSTEM_PSET_ASSIGN:
    308 		case KAUTH_REQ_SYSTEM_PSET_BIND:
    309 		case KAUTH_REQ_SYSTEM_PSET_CREATE:
    310 		case KAUTH_REQ_SYSTEM_PSET_DESTROY:
    311 			if (isroot)
    312 				result = KAUTH_RESULT_ALLOW;
    313 
    314 			break;
    315 
    316 		default:
    317 			break;
    318 		}
    319 
    320 		break;
    321 
    322 	case KAUTH_SYSTEM_TIME:
    323 		switch (req) {
    324 		case KAUTH_REQ_SYSTEM_TIME_ADJTIME:
    325 		case KAUTH_REQ_SYSTEM_TIME_NTPADJTIME:
    326 		case KAUTH_REQ_SYSTEM_TIME_TIMECOUNTERS:
    327 		case KAUTH_REQ_SYSTEM_TIME_SYSTEM:
    328 		case KAUTH_REQ_SYSTEM_TIME_RTCOFFSET:
    329 			if (isroot)
    330 				result = KAUTH_RESULT_ALLOW;
    331 			break;
    332 
    333 		default:
    334 			break;
    335 		}
    336 		break;
    337 
    338 	case KAUTH_SYSTEM_SYSCTL:
    339 		switch (req) {
    340 		case KAUTH_REQ_SYSTEM_SYSCTL_ADD:
    341 		case KAUTH_REQ_SYSTEM_SYSCTL_DELETE:
    342 		case KAUTH_REQ_SYSTEM_SYSCTL_DESC:
    343 		case KAUTH_REQ_SYSTEM_SYSCTL_MODIFY:
    344 		case KAUTH_REQ_SYSTEM_SYSCTL_PRVT:
    345 			if (isroot)
    346 				result = KAUTH_RESULT_ALLOW;
    347 			break;
    348 
    349 		default:
    350 			break;
    351 		}
    352 
    353 		break;
    354 
    355 	case KAUTH_SYSTEM_SWAPCTL:
    356 	case KAUTH_SYSTEM_ACCOUNTING:
    357 	case KAUTH_SYSTEM_REBOOT:
    358 	case KAUTH_SYSTEM_CHROOT:
    359 	case KAUTH_SYSTEM_FILEHANDLE:
    360 	case KAUTH_SYSTEM_MKNOD:
    361 	case KAUTH_SYSTEM_SETIDCORE:
    362 	case KAUTH_SYSTEM_MODULE:
    363 	case KAUTH_SYSTEM_FS_RESERVEDSPACE:
    364 		if (isroot)
    365 			result = KAUTH_RESULT_ALLOW;
    366 		break;
    367 
    368 	case KAUTH_SYSTEM_DEBUG:
    369 		switch (req) {
    370 		case KAUTH_REQ_SYSTEM_DEBUG_IPKDB:
    371 			if (isroot)
    372 				result = KAUTH_RESULT_ALLOW;
    373 
    374 			break;
    375 
    376 		default:
    377 			break;
    378 		}
    379 
    380 		break;
    381 
    382 	case KAUTH_SYSTEM_CHSYSFLAGS:
    383 		/*
    384 		 * Needs to be checked in conjunction with the immutable and
    385 		 * append-only flags (usually). Should be handled differently.
    386 		 * Infects ufs, ext2fs, tmpfs, and rump.
    387 		 */
    388 		if (isroot)
    389 			result = KAUTH_RESULT_ALLOW;
    390 
    391 		break;
    392 
    393 	default:
    394 		break;
    395 	}
    396 
    397 	return (result);
    398 }
    399 
    400 /*
    401  * kauth(9) listener
    402  *
    403  * Security model: Traditional NetBSD
    404  * Scope: Process
    405  * Responsibility: Superuser access
    406  */
    407 int
    408 secmodel_suser_process_cb(kauth_cred_t cred, kauth_action_t action,
    409     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    410 {
    411 	struct proc *p;
    412 	bool isroot;
    413 	int result;
    414 
    415 	isroot = suser_isroot(cred);
    416 	result = KAUTH_RESULT_DEFER;
    417 	p = arg0;
    418 
    419 	switch (action) {
    420 	case KAUTH_PROCESS_SIGNAL:
    421 	case KAUTH_PROCESS_KTRACE:
    422 	case KAUTH_PROCESS_PROCFS:
    423 	case KAUTH_PROCESS_PTRACE:
    424 	case KAUTH_PROCESS_SCHEDULER_GETPARAM:
    425 	case KAUTH_PROCESS_SCHEDULER_SETPARAM:
    426 	case KAUTH_PROCESS_SCHEDULER_GETAFFINITY:
    427 	case KAUTH_PROCESS_SCHEDULER_SETAFFINITY:
    428 	case KAUTH_PROCESS_SETID:
    429 	case KAUTH_PROCESS_KEVENT_FILTER:
    430 	case KAUTH_PROCESS_NICE:
    431 	case KAUTH_PROCESS_FORK:
    432 	case KAUTH_PROCESS_CORENAME:
    433 	case KAUTH_PROCESS_STOPFLAG:
    434 		if (isroot)
    435 			result = KAUTH_RESULT_ALLOW;
    436 
    437 		break;
    438 
    439 	case KAUTH_PROCESS_CANSEE: {
    440 		unsigned long req;
    441 
    442 		req = (unsigned long)arg1;
    443 
    444 		switch (req) {
    445 		case KAUTH_REQ_PROCESS_CANSEE_ARGS:
    446 		case KAUTH_REQ_PROCESS_CANSEE_ENTRY:
    447 		case KAUTH_REQ_PROCESS_CANSEE_OPENFILES:
    448 			if (isroot) {
    449 				result = KAUTH_RESULT_ALLOW;
    450 				break;
    451 			}
    452 
    453 			break;
    454 
    455 		case KAUTH_REQ_PROCESS_CANSEE_ENV:
    456 			if (isroot)
    457 				result = KAUTH_RESULT_ALLOW;
    458 
    459 			break;
    460 
    461 		default:
    462 			break;
    463 		}
    464 
    465 		break;
    466 		}
    467 
    468 	case KAUTH_PROCESS_RLIMIT: {
    469 		enum kauth_process_req req;
    470 
    471 		req = (enum kauth_process_req)(unsigned long)arg1;
    472 
    473 		switch (req) {
    474 		case KAUTH_REQ_PROCESS_RLIMIT_SET:
    475 		case KAUTH_REQ_PROCESS_RLIMIT_GET:
    476 			if (isroot)
    477 				result = KAUTH_RESULT_ALLOW;
    478 
    479 			break;
    480 
    481 		default:
    482 			break;
    483 		}
    484 
    485 		break;
    486 		}
    487 
    488 	default:
    489 		break;
    490 	}
    491 
    492 	return (result);
    493 }
    494 
    495 /*
    496  * kauth(9) listener
    497  *
    498  * Security model: Traditional NetBSD
    499  * Scope: Network
    500  * Responsibility: Superuser access
    501  */
    502 int
    503 secmodel_suser_network_cb(kauth_cred_t cred, kauth_action_t action,
    504     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    505 {
    506 	bool isroot;
    507 	int result;
    508 	enum kauth_network_req req;
    509 
    510 	isroot = suser_isroot(cred);
    511 	result = KAUTH_RESULT_DEFER;
    512 	req = (enum kauth_network_req)arg0;
    513 
    514 	switch (action) {
    515 	case KAUTH_NETWORK_ALTQ:
    516 		switch (req) {
    517 		case KAUTH_REQ_NETWORK_ALTQ_AFMAP:
    518 		case KAUTH_REQ_NETWORK_ALTQ_BLUE:
    519 		case KAUTH_REQ_NETWORK_ALTQ_CBQ:
    520 		case KAUTH_REQ_NETWORK_ALTQ_CDNR:
    521 		case KAUTH_REQ_NETWORK_ALTQ_CONF:
    522 		case KAUTH_REQ_NETWORK_ALTQ_FIFOQ:
    523 		case KAUTH_REQ_NETWORK_ALTQ_HFSC:
    524 		case KAUTH_REQ_NETWORK_ALTQ_JOBS:
    525 		case KAUTH_REQ_NETWORK_ALTQ_PRIQ:
    526 		case KAUTH_REQ_NETWORK_ALTQ_RED:
    527 		case KAUTH_REQ_NETWORK_ALTQ_RIO:
    528 		case KAUTH_REQ_NETWORK_ALTQ_WFQ:
    529 			if (isroot)
    530 				result = KAUTH_RESULT_ALLOW;
    531 			break;
    532 
    533 		default:
    534 			break;
    535 		}
    536 
    537 		break;
    538 
    539 	case KAUTH_NETWORK_BIND:
    540 		switch (req) {
    541 		case KAUTH_REQ_NETWORK_BIND_PORT:
    542 		case KAUTH_REQ_NETWORK_BIND_PRIVPORT:
    543 			if (isroot)
    544 				result = KAUTH_RESULT_ALLOW;
    545 			break;
    546 
    547 		default:
    548 			break;
    549 		}
    550 		break;
    551 
    552 	case KAUTH_NETWORK_FIREWALL:
    553 		switch (req) {
    554 		case KAUTH_REQ_NETWORK_FIREWALL_FW:
    555 		case KAUTH_REQ_NETWORK_FIREWALL_NAT:
    556 			if (isroot)
    557 				result = KAUTH_RESULT_ALLOW;
    558 
    559 			break;
    560 
    561 		default:
    562 			break;
    563 		}
    564 		break;
    565 
    566 	case KAUTH_NETWORK_FORWSRCRT:
    567 	case KAUTH_NETWORK_ROUTE:
    568 		if (isroot)
    569 			result = KAUTH_RESULT_ALLOW;
    570 
    571 		break;
    572 
    573 	case KAUTH_NETWORK_INTERFACE:
    574 		switch (req) {
    575 		case KAUTH_REQ_NETWORK_INTERFACE_GET:
    576 		case KAUTH_REQ_NETWORK_INTERFACE_SET:
    577 		case KAUTH_REQ_NETWORK_INTERFACE_GETPRIV:
    578 		case KAUTH_REQ_NETWORK_INTERFACE_SETPRIV:
    579 			if (isroot)
    580 				result = KAUTH_RESULT_ALLOW;
    581 			break;
    582 
    583 		default:
    584 			break;
    585 		}
    586 		break;
    587 
    588 	case KAUTH_NETWORK_INTERFACE_PPP:
    589 		switch (req) {
    590 		case KAUTH_REQ_NETWORK_INTERFACE_PPP_ADD:
    591 			if (isroot)
    592 				result = KAUTH_RESULT_ALLOW;
    593 			break;
    594 
    595 		default:
    596 			break;
    597 		}
    598 
    599 		break;
    600 
    601 	case KAUTH_NETWORK_INTERFACE_SLIP:
    602 		switch (req) {
    603 		case KAUTH_REQ_NETWORK_INTERFACE_SLIP_ADD:
    604 			if (isroot)
    605 				result = KAUTH_RESULT_ALLOW;
    606 			break;
    607 
    608 		default:
    609 			break;
    610 		}
    611 
    612 		break;
    613 
    614 	case KAUTH_NETWORK_INTERFACE_STRIP:
    615 		switch (req) {
    616 		case KAUTH_REQ_NETWORK_INTERFACE_STRIP_ADD:
    617 			if (isroot)
    618 				result = KAUTH_RESULT_ALLOW;
    619 			break;
    620 
    621 		default:
    622 			break;
    623 		}
    624 
    625 		break;
    626 
    627 	case KAUTH_NETWORK_INTERFACE_TUN:
    628 		switch (req) {
    629 		case KAUTH_REQ_NETWORK_INTERFACE_TUN_ADD:
    630 			if (isroot)
    631 				result = KAUTH_RESULT_ALLOW;
    632 			break;
    633 
    634 		default:
    635 			break;
    636 		}
    637 
    638 		break;
    639 
    640 	case KAUTH_NETWORK_NFS:
    641 		switch (req) {
    642 		case KAUTH_REQ_NETWORK_NFS_EXPORT:
    643 		case KAUTH_REQ_NETWORK_NFS_SVC:
    644 			if (isroot)
    645 				result = KAUTH_RESULT_ALLOW;
    646 
    647 			break;
    648 
    649 		default:
    650 			break;
    651 		}
    652 		break;
    653 
    654 	case KAUTH_NETWORK_SOCKET:
    655 		switch (req) {
    656 		case KAUTH_REQ_NETWORK_SOCKET_DROP:
    657 		case KAUTH_REQ_NETWORK_SOCKET_OPEN:
    658 		case KAUTH_REQ_NETWORK_SOCKET_RAWSOCK:
    659 		case KAUTH_REQ_NETWORK_SOCKET_SETPRIV:
    660 			if (isroot)
    661 				result = KAUTH_RESULT_ALLOW;
    662 			break;
    663 
    664 		case KAUTH_REQ_NETWORK_SOCKET_CANSEE:
    665 			if (isroot) {
    666 				result = KAUTH_RESULT_ALLOW;
    667 				break;
    668 			}
    669 
    670 			break;
    671 
    672 		default:
    673 			break;
    674 		}
    675 
    676 		break;
    677 
    678 
    679 	default:
    680 		break;
    681 	}
    682 
    683 	return (result);
    684 }
    685 
    686 /*
    687  * kauth(9) listener
    688  *
    689  * Security model: Traditional NetBSD
    690  * Scope: Machdep
    691  * Responsibility: Superuser access
    692  */
    693 int
    694 secmodel_suser_machdep_cb(kauth_cred_t cred, kauth_action_t action,
    695     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    696 {
    697         bool isroot;
    698         int result;
    699 
    700         isroot = suser_isroot(cred);
    701         result = KAUTH_RESULT_DEFER;
    702 
    703         switch (action) {
    704 	case KAUTH_MACHDEP_IOPERM_GET:
    705 	case KAUTH_MACHDEP_LDT_GET:
    706 	case KAUTH_MACHDEP_LDT_SET:
    707 	case KAUTH_MACHDEP_MTRR_GET:
    708 	case KAUTH_MACHDEP_CACHEFLUSH:
    709 	case KAUTH_MACHDEP_IOPERM_SET:
    710 	case KAUTH_MACHDEP_IOPL:
    711 	case KAUTH_MACHDEP_MTRR_SET:
    712 	case KAUTH_MACHDEP_NVRAM:
    713 	case KAUTH_MACHDEP_UNMANAGEDMEM:
    714 		if (isroot)
    715 			result = KAUTH_RESULT_ALLOW;
    716 		break;
    717 
    718 	default:
    719 		break;
    720 	}
    721 
    722 	return (result);
    723 }
    724 
    725 /*
    726  * kauth(9) listener
    727  *
    728  * Security model: Traditional NetBSD
    729  * Scope: Device
    730  * Responsibility: Superuser access
    731  */
    732 int
    733 secmodel_suser_device_cb(kauth_cred_t cred, kauth_action_t action,
    734     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    735 {
    736         bool isroot;
    737         int result;
    738 
    739         isroot = suser_isroot(cred);
    740         result = KAUTH_RESULT_DEFER;
    741 
    742 	switch (action) {
    743 	case KAUTH_DEVICE_BLUETOOTH_SETPRIV:
    744 	case KAUTH_DEVICE_BLUETOOTH_SEND:
    745 	case KAUTH_DEVICE_BLUETOOTH_RECV:
    746 	case KAUTH_DEVICE_TTY_OPEN:
    747 	case KAUTH_DEVICE_TTY_PRIVSET:
    748 	case KAUTH_DEVICE_TTY_STI:
    749 	case KAUTH_DEVICE_RND_ADDDATA:
    750 	case KAUTH_DEVICE_RND_ADDDATA_ESTIMATE:
    751 	case KAUTH_DEVICE_RND_GETPRIV:
    752 	case KAUTH_DEVICE_RND_SETPRIV:
    753 		if (isroot)
    754 			result = KAUTH_RESULT_ALLOW;
    755 		break;
    756 
    757 	case KAUTH_DEVICE_BLUETOOTH_BCSP:
    758 	case KAUTH_DEVICE_BLUETOOTH_BTUART: {
    759 		enum kauth_device_req req;
    760 
    761 		req = (enum kauth_device_req)arg0;
    762 		switch (req) {
    763 		case KAUTH_REQ_DEVICE_BLUETOOTH_BCSP_ADD:
    764 		case KAUTH_REQ_DEVICE_BLUETOOTH_BTUART_ADD:
    765 			if (isroot)
    766 				result = KAUTH_RESULT_ALLOW;
    767 			break;
    768 
    769 		default:
    770 			break;
    771 		}
    772 
    773 		break;
    774 		}
    775 
    776 	case KAUTH_DEVICE_GPIO_PINSET:
    777 		/*
    778 		 * root can access gpio pins, secmodel_securlevel can veto
    779 		 * this decision.
    780 		 */
    781 		if (isroot)
    782 			result = KAUTH_RESULT_ALLOW;
    783 		break;
    784 
    785 	default:
    786 		break;
    787 	}
    788 
    789 	return (result);
    790 }
    791 
    792 int
    793 secmodel_suser_vnode_cb(kauth_cred_t cred, kauth_action_t action,
    794     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    795 {
    796 	bool isroot;
    797 	int result;
    798 
    799 	isroot = suser_isroot(cred);
    800 	result = KAUTH_RESULT_DEFER;
    801 
    802 	if (isroot)
    803 		result = KAUTH_RESULT_ALLOW;
    804 
    805 	return (result);
    806 }
    807 
    808