Home | History | Annotate | Line # | Download | only in suser
secmodel_suser.c revision 1.35.2.2
      1 /* $NetBSD: secmodel_suser.c,v 1.35.2.2 2012/04/05 21:33:50 mrg 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.35.2.2 2012/04/05 21:33:50 mrg 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 			if (isroot)
    252 				result = KAUTH_RESULT_ALLOW;
    253 
    254 			break;
    255 
    256 		default:
    257 			break;
    258 		}
    259 
    260 		break;
    261 
    262 	case KAUTH_SYSTEM_DEVMAPPER:
    263 		if (isroot)
    264 			result = KAUTH_RESULT_ALLOW;
    265 
    266 		break;
    267 
    268 	case KAUTH_SYSTEM_FS_QUOTA:
    269 		switch (req) {
    270 		case KAUTH_REQ_SYSTEM_FS_QUOTA_GET:
    271 		case KAUTH_REQ_SYSTEM_FS_QUOTA_ONOFF:
    272 		case KAUTH_REQ_SYSTEM_FS_QUOTA_MANAGE:
    273 		case KAUTH_REQ_SYSTEM_FS_QUOTA_NOLIMIT:
    274 			if (isroot)
    275 				result = KAUTH_RESULT_ALLOW;
    276 			break;
    277 
    278 		default:
    279 			break;
    280 		}
    281 
    282 		break;
    283 
    284 	case KAUTH_SYSTEM_SYSVIPC:
    285 		switch (req) {
    286 		case KAUTH_REQ_SYSTEM_SYSVIPC_BYPASS:
    287 		case KAUTH_REQ_SYSTEM_SYSVIPC_SHM_LOCK:
    288 		case KAUTH_REQ_SYSTEM_SYSVIPC_SHM_UNLOCK:
    289 		case KAUTH_REQ_SYSTEM_SYSVIPC_MSGQ_OVERSIZE:
    290 			if (isroot)
    291 				result = KAUTH_RESULT_ALLOW;
    292 
    293 			break;
    294 
    295 		default:
    296 			break;
    297 		}
    298 
    299 		break;
    300 
    301 	case KAUTH_SYSTEM_MOUNT:
    302 		switch (req) {
    303 		case KAUTH_REQ_SYSTEM_MOUNT_DEVICE:
    304 		case KAUTH_REQ_SYSTEM_MOUNT_GET:
    305 		case KAUTH_REQ_SYSTEM_MOUNT_NEW:
    306 		case KAUTH_REQ_SYSTEM_MOUNT_UNMOUNT:
    307 		case KAUTH_REQ_SYSTEM_MOUNT_UPDATE:
    308 		case KAUTH_REQ_SYSTEM_MOUNT_UMAP:
    309 			if (isroot) {
    310 				result = KAUTH_RESULT_ALLOW;
    311 				break;
    312 			}
    313 
    314 			break;
    315 
    316 		default:
    317 			break;
    318 		}
    319 
    320 		break;
    321 
    322 	case KAUTH_SYSTEM_MQUEUE:
    323 		if (isroot)
    324 			result = KAUTH_RESULT_ALLOW;
    325 
    326 		break;
    327 
    328 	case KAUTH_SYSTEM_PSET:
    329 		switch (req) {
    330 		case KAUTH_REQ_SYSTEM_PSET_ASSIGN:
    331 		case KAUTH_REQ_SYSTEM_PSET_BIND:
    332 		case KAUTH_REQ_SYSTEM_PSET_CREATE:
    333 		case KAUTH_REQ_SYSTEM_PSET_DESTROY:
    334 			if (isroot)
    335 				result = KAUTH_RESULT_ALLOW;
    336 
    337 			break;
    338 
    339 		default:
    340 			break;
    341 		}
    342 
    343 		break;
    344 
    345 	case KAUTH_SYSTEM_TIME:
    346 		switch (req) {
    347 		case KAUTH_REQ_SYSTEM_TIME_ADJTIME:
    348 		case KAUTH_REQ_SYSTEM_TIME_NTPADJTIME:
    349 		case KAUTH_REQ_SYSTEM_TIME_TIMECOUNTERS:
    350 		case KAUTH_REQ_SYSTEM_TIME_SYSTEM:
    351 		case KAUTH_REQ_SYSTEM_TIME_RTCOFFSET:
    352 			if (isroot)
    353 				result = KAUTH_RESULT_ALLOW;
    354 			break;
    355 
    356 		default:
    357 			break;
    358 		}
    359 		break;
    360 
    361 	case KAUTH_SYSTEM_SEMAPHORE:
    362 		if (isroot)
    363 			result = KAUTH_RESULT_ALLOW;
    364 
    365 		break;
    366 
    367 	case KAUTH_SYSTEM_SYSCTL:
    368 		switch (req) {
    369 		case KAUTH_REQ_SYSTEM_SYSCTL_ADD:
    370 		case KAUTH_REQ_SYSTEM_SYSCTL_DELETE:
    371 		case KAUTH_REQ_SYSTEM_SYSCTL_DESC:
    372 		case KAUTH_REQ_SYSTEM_SYSCTL_MODIFY:
    373 		case KAUTH_REQ_SYSTEM_SYSCTL_PRVT:
    374 			if (isroot)
    375 				result = KAUTH_RESULT_ALLOW;
    376 			break;
    377 
    378 		default:
    379 			break;
    380 		}
    381 
    382 		break;
    383 
    384 	case KAUTH_SYSTEM_SWAPCTL:
    385 	case KAUTH_SYSTEM_ACCOUNTING:
    386 	case KAUTH_SYSTEM_REBOOT:
    387 	case KAUTH_SYSTEM_CHROOT:
    388 	case KAUTH_SYSTEM_FILEHANDLE:
    389 	case KAUTH_SYSTEM_MKNOD:
    390 	case KAUTH_SYSTEM_SETIDCORE:
    391 	case KAUTH_SYSTEM_MODULE:
    392 	case KAUTH_SYSTEM_FS_RESERVEDSPACE:
    393 	case KAUTH_SYSTEM_MAP_VA_ZERO:
    394 	case KAUTH_SYSTEM_FS_EXTATTR:
    395 	case KAUTH_SYSTEM_FS_SNAPSHOT:
    396 		if (isroot)
    397 			result = KAUTH_RESULT_ALLOW;
    398 		break;
    399 
    400 	case KAUTH_SYSTEM_DEBUG:
    401 		switch (req) {
    402 		case KAUTH_REQ_SYSTEM_DEBUG_IPKDB:
    403 			if (isroot)
    404 				result = KAUTH_RESULT_ALLOW;
    405 
    406 			break;
    407 
    408 		default:
    409 			break;
    410 		}
    411 
    412 		break;
    413 
    414 	case KAUTH_SYSTEM_CHSYSFLAGS:
    415 		/* Deprecated. */
    416 		if (isroot)
    417 			result = KAUTH_RESULT_ALLOW;
    418 
    419 		break;
    420 
    421 	case KAUTH_SYSTEM_VERIEXEC:
    422 		switch (req) {
    423 		case KAUTH_REQ_SYSTEM_VERIEXEC_ACCESS:
    424 		case KAUTH_REQ_SYSTEM_VERIEXEC_MODIFY:
    425 			if (isroot)
    426 				result = KAUTH_RESULT_ALLOW;
    427 
    428 			break;
    429 
    430 		default:
    431 			break;
    432 		}
    433 
    434 		break;
    435 
    436 	case KAUTH_SYSTEM_LFS:
    437 		switch (req) {
    438 		case KAUTH_REQ_SYSTEM_LFS_MARKV:
    439 		case KAUTH_REQ_SYSTEM_LFS_BMAPV:
    440 		case KAUTH_REQ_SYSTEM_LFS_SEGCLEAN:
    441 		case KAUTH_REQ_SYSTEM_LFS_SEGWAIT:
    442 		case KAUTH_REQ_SYSTEM_LFS_FCNTL:
    443 			if (isroot)
    444 				result = KAUTH_RESULT_ALLOW;
    445 
    446 		default:
    447 			break;
    448 		}
    449 
    450 		break;
    451 
    452 	default:
    453 		break;
    454 	}
    455 
    456 	return (result);
    457 }
    458 
    459 /*
    460  * kauth(9) listener
    461  *
    462  * Security model: Traditional NetBSD
    463  * Scope: Process
    464  * Responsibility: Superuser access
    465  */
    466 int
    467 secmodel_suser_process_cb(kauth_cred_t cred, kauth_action_t action,
    468     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    469 {
    470 	struct proc *p;
    471 	bool isroot;
    472 	int result;
    473 
    474 	isroot = suser_isroot(cred);
    475 	result = KAUTH_RESULT_DEFER;
    476 	p = arg0;
    477 
    478 	switch (action) {
    479 	case KAUTH_PROCESS_SIGNAL:
    480 	case KAUTH_PROCESS_KTRACE:
    481 	case KAUTH_PROCESS_PROCFS:
    482 	case KAUTH_PROCESS_PTRACE:
    483 	case KAUTH_PROCESS_SCHEDULER_GETPARAM:
    484 	case KAUTH_PROCESS_SCHEDULER_SETPARAM:
    485 	case KAUTH_PROCESS_SCHEDULER_GETAFFINITY:
    486 	case KAUTH_PROCESS_SCHEDULER_SETAFFINITY:
    487 	case KAUTH_PROCESS_SETID:
    488 	case KAUTH_PROCESS_KEVENT_FILTER:
    489 	case KAUTH_PROCESS_NICE:
    490 	case KAUTH_PROCESS_FORK:
    491 	case KAUTH_PROCESS_CORENAME:
    492 	case KAUTH_PROCESS_STOPFLAG:
    493 		if (isroot)
    494 			result = KAUTH_RESULT_ALLOW;
    495 
    496 		break;
    497 
    498 	case KAUTH_PROCESS_CANSEE: {
    499 		unsigned long req;
    500 
    501 		req = (unsigned long)arg1;
    502 
    503 		switch (req) {
    504 		case KAUTH_REQ_PROCESS_CANSEE_ARGS:
    505 		case KAUTH_REQ_PROCESS_CANSEE_ENTRY:
    506 		case KAUTH_REQ_PROCESS_CANSEE_OPENFILES:
    507 			if (isroot) {
    508 				result = KAUTH_RESULT_ALLOW;
    509 				break;
    510 			}
    511 
    512 			break;
    513 
    514 		case KAUTH_REQ_PROCESS_CANSEE_ENV:
    515 			if (isroot)
    516 				result = KAUTH_RESULT_ALLOW;
    517 
    518 			break;
    519 
    520 		default:
    521 			break;
    522 		}
    523 
    524 		break;
    525 		}
    526 
    527 	case KAUTH_PROCESS_RLIMIT: {
    528 		enum kauth_process_req req;
    529 
    530 		req = (enum kauth_process_req)(unsigned long)arg1;
    531 
    532 		switch (req) {
    533 		case KAUTH_REQ_PROCESS_RLIMIT_SET:
    534 		case KAUTH_REQ_PROCESS_RLIMIT_GET:
    535 		case KAUTH_REQ_PROCESS_RLIMIT_BYPASS:
    536 			if (isroot)
    537 				result = KAUTH_RESULT_ALLOW;
    538 
    539 			break;
    540 
    541 		default:
    542 			break;
    543 		}
    544 
    545 		break;
    546 		}
    547 
    548 	default:
    549 		break;
    550 	}
    551 
    552 	return (result);
    553 }
    554 
    555 /*
    556  * kauth(9) listener
    557  *
    558  * Security model: Traditional NetBSD
    559  * Scope: Network
    560  * Responsibility: Superuser access
    561  */
    562 int
    563 secmodel_suser_network_cb(kauth_cred_t cred, kauth_action_t action,
    564     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    565 {
    566 	bool isroot;
    567 	int result;
    568 	enum kauth_network_req req;
    569 
    570 	isroot = suser_isroot(cred);
    571 	result = KAUTH_RESULT_DEFER;
    572 	req = (enum kauth_network_req)arg0;
    573 
    574 	switch (action) {
    575 	case KAUTH_NETWORK_ALTQ:
    576 		switch (req) {
    577 		case KAUTH_REQ_NETWORK_ALTQ_AFMAP:
    578 		case KAUTH_REQ_NETWORK_ALTQ_BLUE:
    579 		case KAUTH_REQ_NETWORK_ALTQ_CBQ:
    580 		case KAUTH_REQ_NETWORK_ALTQ_CDNR:
    581 		case KAUTH_REQ_NETWORK_ALTQ_CONF:
    582 		case KAUTH_REQ_NETWORK_ALTQ_FIFOQ:
    583 		case KAUTH_REQ_NETWORK_ALTQ_HFSC:
    584 		case KAUTH_REQ_NETWORK_ALTQ_JOBS:
    585 		case KAUTH_REQ_NETWORK_ALTQ_PRIQ:
    586 		case KAUTH_REQ_NETWORK_ALTQ_RED:
    587 		case KAUTH_REQ_NETWORK_ALTQ_RIO:
    588 		case KAUTH_REQ_NETWORK_ALTQ_WFQ:
    589 			if (isroot)
    590 				result = KAUTH_RESULT_ALLOW;
    591 			break;
    592 
    593 		default:
    594 			break;
    595 		}
    596 
    597 		break;
    598 
    599 	case KAUTH_NETWORK_BIND:
    600 		switch (req) {
    601 		case KAUTH_REQ_NETWORK_BIND_PORT:
    602 		case KAUTH_REQ_NETWORK_BIND_PRIVPORT:
    603 			if (isroot)
    604 				result = KAUTH_RESULT_ALLOW;
    605 			break;
    606 
    607 		default:
    608 			break;
    609 		}
    610 		break;
    611 
    612 	case KAUTH_NETWORK_FIREWALL:
    613 		switch (req) {
    614 		case KAUTH_REQ_NETWORK_FIREWALL_FW:
    615 		case KAUTH_REQ_NETWORK_FIREWALL_NAT:
    616 			if (isroot)
    617 				result = KAUTH_RESULT_ALLOW;
    618 
    619 			break;
    620 
    621 		default:
    622 			break;
    623 		}
    624 		break;
    625 
    626 	case KAUTH_NETWORK_FORWSRCRT:
    627 	case KAUTH_NETWORK_ROUTE:
    628 		if (isroot)
    629 			result = KAUTH_RESULT_ALLOW;
    630 
    631 		break;
    632 
    633 	case KAUTH_NETWORK_INTERFACE:
    634 		switch (req) {
    635 		case KAUTH_REQ_NETWORK_INTERFACE_GET:
    636 		case KAUTH_REQ_NETWORK_INTERFACE_SET:
    637 		case KAUTH_REQ_NETWORK_INTERFACE_GETPRIV:
    638 		case KAUTH_REQ_NETWORK_INTERFACE_SETPRIV:
    639 		case KAUTH_REQ_NETWORK_INTERFACE_FIRMWARE:
    640 			if (isroot)
    641 				result = KAUTH_RESULT_ALLOW;
    642 			break;
    643 
    644 		default:
    645 			break;
    646 		}
    647 		break;
    648 
    649 	case KAUTH_NETWORK_INTERFACE_BRIDGE:
    650 		switch (req) {
    651 		case KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_GETPRIV:
    652 		case KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_SETPRIV:
    653 			if (isroot)
    654 				result = KAUTH_RESULT_ALLOW;
    655 			break;
    656 
    657 		default:
    658 			break;
    659 		}
    660 
    661 		break;
    662 
    663 	case KAUTH_NETWORK_INTERFACE_PPP:
    664 		switch (req) {
    665 		case KAUTH_REQ_NETWORK_INTERFACE_PPP_ADD:
    666 			if (isroot)
    667 				result = KAUTH_RESULT_ALLOW;
    668 			break;
    669 
    670 		default:
    671 			break;
    672 		}
    673 
    674 		break;
    675 
    676 	case KAUTH_NETWORK_INTERFACE_PVC:
    677 		switch (req) {
    678 		case KAUTH_REQ_NETWORK_INTERFACE_PVC_ADD:
    679 			if (isroot)
    680 				result = KAUTH_RESULT_ALLOW;
    681 
    682 			break;
    683 
    684 		default:
    685 			break;
    686 		}
    687 
    688 		break;
    689 
    690 	case KAUTH_NETWORK_INTERFACE_SLIP:
    691 		switch (req) {
    692 		case KAUTH_REQ_NETWORK_INTERFACE_SLIP_ADD:
    693 			if (isroot)
    694 				result = KAUTH_RESULT_ALLOW;
    695 			break;
    696 
    697 		default:
    698 			break;
    699 		}
    700 
    701 		break;
    702 
    703 	case KAUTH_NETWORK_INTERFACE_STRIP:
    704 		switch (req) {
    705 		case KAUTH_REQ_NETWORK_INTERFACE_STRIP_ADD:
    706 			if (isroot)
    707 				result = KAUTH_RESULT_ALLOW;
    708 			break;
    709 
    710 		default:
    711 			break;
    712 		}
    713 
    714 		break;
    715 
    716 	case KAUTH_NETWORK_INTERFACE_TUN:
    717 		switch (req) {
    718 		case KAUTH_REQ_NETWORK_INTERFACE_TUN_ADD:
    719 			if (isroot)
    720 				result = KAUTH_RESULT_ALLOW;
    721 			break;
    722 
    723 		default:
    724 			break;
    725 		}
    726 
    727 		break;
    728 
    729 	case KAUTH_NETWORK_IPV6:
    730 		switch (req) {
    731 		case KAUTH_REQ_NETWORK_IPV6_HOPBYHOP:
    732 		case KAUTH_REQ_NETWORK_IPV6_JOIN_MULTICAST:
    733 			if (isroot)
    734 				result = KAUTH_RESULT_ALLOW;
    735 
    736 			break;
    737 
    738 		default:
    739 			break;
    740 		}
    741 
    742 		break;
    743 
    744 	case KAUTH_NETWORK_NFS:
    745 		switch (req) {
    746 		case KAUTH_REQ_NETWORK_NFS_EXPORT:
    747 		case KAUTH_REQ_NETWORK_NFS_SVC:
    748 			if (isroot)
    749 				result = KAUTH_RESULT_ALLOW;
    750 
    751 			break;
    752 
    753 		default:
    754 			break;
    755 		}
    756 		break;
    757 
    758 	case KAUTH_NETWORK_SMB:
    759 		switch (req) {
    760 		case KAUTH_REQ_NETWORK_SMB_SHARE_ACCESS:
    761 		case KAUTH_REQ_NETWORK_SMB_SHARE_CREATE:
    762 		case KAUTH_REQ_NETWORK_SMB_VC_ACCESS:
    763 		case KAUTH_REQ_NETWORK_SMB_VC_CREATE:
    764 			if (isroot)
    765 				result = KAUTH_RESULT_ALLOW;
    766 
    767 			break;
    768 
    769 		default:
    770 			break;
    771 		}
    772 
    773 		break;
    774 
    775 	case KAUTH_NETWORK_SOCKET:
    776 		switch (req) {
    777 		case KAUTH_REQ_NETWORK_SOCKET_DROP:
    778 		case KAUTH_REQ_NETWORK_SOCKET_OPEN:
    779 		case KAUTH_REQ_NETWORK_SOCKET_RAWSOCK:
    780 		case KAUTH_REQ_NETWORK_SOCKET_SETPRIV:
    781 			if (isroot)
    782 				result = KAUTH_RESULT_ALLOW;
    783 			break;
    784 
    785 		case KAUTH_REQ_NETWORK_SOCKET_CANSEE:
    786 			if (isroot) {
    787 				result = KAUTH_RESULT_ALLOW;
    788 				break;
    789 			}
    790 
    791 			break;
    792 
    793 		default:
    794 			break;
    795 		}
    796 
    797 		break;
    798 
    799 	case KAUTH_NETWORK_IPSEC:
    800 		switch (req) {
    801 		case KAUTH_REQ_NETWORK_IPSEC_BYPASS:
    802 			if (isroot)
    803 				result = KAUTH_RESULT_ALLOW;
    804 
    805 			break;
    806 
    807 		default:
    808 			break;
    809 		}
    810 
    811 		break;
    812 
    813 	default:
    814 		break;
    815 	}
    816 
    817 	return (result);
    818 }
    819 
    820 /*
    821  * kauth(9) listener
    822  *
    823  * Security model: Traditional NetBSD
    824  * Scope: Machdep
    825  * Responsibility: Superuser access
    826  */
    827 int
    828 secmodel_suser_machdep_cb(kauth_cred_t cred, kauth_action_t action,
    829     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    830 {
    831         bool isroot;
    832         int result;
    833 
    834         isroot = suser_isroot(cred);
    835         result = KAUTH_RESULT_DEFER;
    836 
    837         switch (action) {
    838 	case KAUTH_MACHDEP_CPU_UCODE_APPLY:
    839 	case KAUTH_MACHDEP_IOPERM_GET:
    840 	case KAUTH_MACHDEP_LDT_GET:
    841 	case KAUTH_MACHDEP_LDT_SET:
    842 	case KAUTH_MACHDEP_MTRR_GET:
    843 	case KAUTH_MACHDEP_CACHEFLUSH:
    844 	case KAUTH_MACHDEP_IOPERM_SET:
    845 	case KAUTH_MACHDEP_IOPL:
    846 	case KAUTH_MACHDEP_MTRR_SET:
    847 	case KAUTH_MACHDEP_NVRAM:
    848 	case KAUTH_MACHDEP_UNMANAGEDMEM:
    849 	case KAUTH_MACHDEP_PXG:
    850 		if (isroot)
    851 			result = KAUTH_RESULT_ALLOW;
    852 		break;
    853 
    854 	default:
    855 		break;
    856 	}
    857 
    858 	return (result);
    859 }
    860 
    861 /*
    862  * kauth(9) listener
    863  *
    864  * Security model: Traditional NetBSD
    865  * Scope: Device
    866  * Responsibility: Superuser access
    867  */
    868 int
    869 secmodel_suser_device_cb(kauth_cred_t cred, kauth_action_t action,
    870     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    871 {
    872         bool isroot;
    873         int result;
    874 
    875         isroot = suser_isroot(cred);
    876         result = KAUTH_RESULT_DEFER;
    877 
    878 	switch (action) {
    879 	case KAUTH_DEVICE_BLUETOOTH_SETPRIV:
    880 	case KAUTH_DEVICE_BLUETOOTH_SEND:
    881 	case KAUTH_DEVICE_BLUETOOTH_RECV:
    882 	case KAUTH_DEVICE_TTY_OPEN:
    883 	case KAUTH_DEVICE_TTY_PRIVSET:
    884 	case KAUTH_DEVICE_TTY_STI:
    885 	case KAUTH_DEVICE_TTY_VIRTUAL:
    886 	case KAUTH_DEVICE_RND_ADDDATA:
    887 	case KAUTH_DEVICE_RND_ADDDATA_ESTIMATE:
    888 	case KAUTH_DEVICE_RND_GETPRIV:
    889 	case KAUTH_DEVICE_RND_SETPRIV:
    890 	case KAUTH_DEVICE_WSCONS_KEYBOARD_BELL:
    891 	case KAUTH_DEVICE_WSCONS_KEYBOARD_KEYREPEAT:
    892 		if (isroot)
    893 			result = KAUTH_RESULT_ALLOW;
    894 		break;
    895 
    896 	case KAUTH_DEVICE_BLUETOOTH_BCSP:
    897 	case KAUTH_DEVICE_BLUETOOTH_BTUART: {
    898 		enum kauth_device_req req;
    899 
    900 		req = (enum kauth_device_req)arg0;
    901 		switch (req) {
    902 		case KAUTH_REQ_DEVICE_BLUETOOTH_BCSP_ADD:
    903 		case KAUTH_REQ_DEVICE_BLUETOOTH_BTUART_ADD:
    904 			if (isroot)
    905 				result = KAUTH_RESULT_ALLOW;
    906 			break;
    907 
    908 		default:
    909 			break;
    910 		}
    911 
    912 		break;
    913 		}
    914 
    915 	case KAUTH_DEVICE_GPIO_PINSET:
    916 		/*
    917 		 * root can access gpio pins, secmodel_securlevel can veto
    918 		 * this decision.
    919 		 */
    920 		if (isroot)
    921 			result = KAUTH_RESULT_ALLOW;
    922 		break;
    923 
    924 	default:
    925 		break;
    926 	}
    927 
    928 	return (result);
    929 }
    930 
    931 int
    932 secmodel_suser_vnode_cb(kauth_cred_t cred, kauth_action_t action,
    933     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    934 {
    935 	bool isroot;
    936 	int result;
    937 
    938 	isroot = suser_isroot(cred);
    939 	result = KAUTH_RESULT_DEFER;
    940 
    941 	if (isroot) {
    942 		/* Superuser can execute only if the file's executable. */
    943 		if ((action & KAUTH_VNODE_EXECUTE) == 0 ||
    944 		    (action & KAUTH_VNODE_IS_EXEC))
    945 			result = KAUTH_RESULT_ALLOW;
    946 	}
    947 
    948 	return (result);
    949 }
    950 
    951