Home | History | Annotate | Line # | Download | only in suser
secmodel_suser.c revision 1.44.2.1
      1 /* $NetBSD: secmodel_suser.c,v 1.44.2.1 2019/06/10 22:09:56 christos 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.44.2.1 2019/06/10 22:09:56 christos 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, "models", NULL,
     74 		       NULL, 0, NULL, 0,
     75 		       CTL_SECURITY, CTL_CREATE, CTL_EOL);
     76 
     77 	sysctl_createv(clog, 0, &rnode, &rnode,
     78 		       CTLFLAG_PERMANENT,
     79 		       CTLTYPE_NODE, "suser", NULL,
     80 		       NULL, 0, NULL, 0,
     81 		       CTL_CREATE, CTL_EOL);
     82 
     83 	sysctl_createv(clog, 0, &rnode, NULL,
     84 		       CTLFLAG_PERMANENT,
     85 		       CTLTYPE_STRING, "name", NULL,
     86 		       NULL, 0, __UNCONST(SECMODEL_SUSER_NAME), 0,
     87 		       CTL_CREATE, CTL_EOL);
     88 }
     89 
     90 void
     91 secmodel_suser_init(void)
     92 {
     93 
     94 }
     95 
     96 void
     97 secmodel_suser_start(void)
     98 {
     99 	l_generic = kauth_listen_scope(KAUTH_SCOPE_GENERIC,
    100 	    secmodel_suser_generic_cb, NULL);
    101 	l_system = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
    102 	    secmodel_suser_system_cb, NULL);
    103 	l_process = kauth_listen_scope(KAUTH_SCOPE_PROCESS,
    104 	    secmodel_suser_process_cb, NULL);
    105 	l_network = kauth_listen_scope(KAUTH_SCOPE_NETWORK,
    106 	    secmodel_suser_network_cb, NULL);
    107 	l_machdep = kauth_listen_scope(KAUTH_SCOPE_MACHDEP,
    108 	    secmodel_suser_machdep_cb, NULL);
    109 	l_device = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
    110 	    secmodel_suser_device_cb, NULL);
    111 	l_vnode = kauth_listen_scope(KAUTH_SCOPE_VNODE,
    112 	    secmodel_suser_vnode_cb, NULL);
    113 }
    114 
    115 void
    116 secmodel_suser_stop(void)
    117 {
    118 	kauth_unlisten_scope(l_generic);
    119 	kauth_unlisten_scope(l_system);
    120 	kauth_unlisten_scope(l_process);
    121 	kauth_unlisten_scope(l_network);
    122 	kauth_unlisten_scope(l_machdep);
    123 	kauth_unlisten_scope(l_device);
    124 	kauth_unlisten_scope(l_vnode);
    125 }
    126 
    127 static bool
    128 suser_isroot(kauth_cred_t cred)
    129 {
    130 	return kauth_cred_geteuid(cred) == 0;
    131 }
    132 
    133 static int
    134 suser_eval(const char *what, void *arg, void *ret)
    135 {
    136 	int error = 0;
    137 
    138 	if (strcasecmp(what, "is-root") == 0) {
    139 		kauth_cred_t cred = arg;
    140 		bool *bp = ret;
    141 
    142 		*bp = suser_isroot(cred);
    143 	} else {
    144 		error = ENOENT;
    145 	}
    146 
    147 	return error;
    148 }
    149 
    150 static int
    151 suser_modcmd(modcmd_t cmd, void *arg)
    152 {
    153 	int error = 0;
    154 
    155 	switch (cmd) {
    156 	case MODULE_CMD_INIT:
    157 		error = secmodel_register(&suser_sm,
    158 		    SECMODEL_SUSER_ID, SECMODEL_SUSER_NAME,
    159 		    NULL, suser_eval, NULL);
    160 		if (error != 0)
    161 			printf("suser_modcmd::init: secmodel_register "
    162 			    "returned %d\n", error);
    163 
    164 		secmodel_suser_init();
    165 		secmodel_suser_start();
    166 		sysctl_security_suser_setup(&suser_sysctl_log);
    167 		break;
    168 
    169 	case MODULE_CMD_FINI:
    170 		sysctl_teardown(&suser_sysctl_log);
    171 		secmodel_suser_stop();
    172 
    173 		error = secmodel_deregister(suser_sm);
    174 		if (error != 0)
    175 			printf("suser_modcmd::fini: secmodel_deregister "
    176 			    "returned %d\n", error);
    177 
    178 		break;
    179 
    180 	case MODULE_CMD_AUTOUNLOAD:
    181 		error = EPERM;
    182 		break;
    183 
    184 	default:
    185 		error = ENOTTY;
    186 		break;
    187 	}
    188 
    189 	return (error);
    190 }
    191 
    192 /*
    193  * kauth(9) listener
    194  *
    195  * Security model: Traditional NetBSD
    196  * Scope: Generic
    197  * Responsibility: Superuser access
    198  */
    199 int
    200 secmodel_suser_generic_cb(kauth_cred_t cred, kauth_action_t action,
    201     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    202 {
    203 	bool isroot;
    204 	int result;
    205 
    206 	isroot = suser_isroot(cred);
    207 	result = KAUTH_RESULT_DEFER;
    208 
    209 	switch (action) {
    210 	case KAUTH_GENERIC_ISSUSER:
    211 		if (isroot)
    212 			result = KAUTH_RESULT_ALLOW;
    213 		break;
    214 
    215 	default:
    216 		break;
    217 	}
    218 
    219 	return (result);
    220 }
    221 
    222 /*
    223  * kauth(9) listener
    224  *
    225  * Security model: Traditional NetBSD
    226  * Scope: System
    227  * Responsibility: Superuser access
    228  */
    229 int
    230 secmodel_suser_system_cb(kauth_cred_t cred, kauth_action_t action,
    231     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    232 {
    233 	bool isroot;
    234 	int result;
    235 	enum kauth_system_req req;
    236 
    237 	isroot = suser_isroot(cred);
    238 	result = KAUTH_RESULT_DEFER;
    239 	req = (enum kauth_system_req)arg0;
    240 
    241 	switch (action) {
    242 	case KAUTH_SYSTEM_CPU:
    243 		switch (req) {
    244 		case KAUTH_REQ_SYSTEM_CPU_SETSTATE:
    245 			if (isroot)
    246 				result = KAUTH_RESULT_ALLOW;
    247 
    248 			break;
    249 
    250 		default:
    251 			break;
    252 		}
    253 
    254 		break;
    255 
    256 	case KAUTH_SYSTEM_DEVMAPPER:
    257 		if (isroot)
    258 			result = KAUTH_RESULT_ALLOW;
    259 
    260 		break;
    261 
    262 	case KAUTH_SYSTEM_FS_QUOTA:
    263 		switch (req) {
    264 		case KAUTH_REQ_SYSTEM_FS_QUOTA_GET:
    265 		case KAUTH_REQ_SYSTEM_FS_QUOTA_ONOFF:
    266 		case KAUTH_REQ_SYSTEM_FS_QUOTA_MANAGE:
    267 		case KAUTH_REQ_SYSTEM_FS_QUOTA_NOLIMIT:
    268 			if (isroot)
    269 				result = KAUTH_RESULT_ALLOW;
    270 			break;
    271 
    272 		default:
    273 			break;
    274 		}
    275 
    276 		break;
    277 
    278 	case KAUTH_SYSTEM_SYSVIPC:
    279 		switch (req) {
    280 		case KAUTH_REQ_SYSTEM_SYSVIPC_BYPASS:
    281 		case KAUTH_REQ_SYSTEM_SYSVIPC_SHM_LOCK:
    282 		case KAUTH_REQ_SYSTEM_SYSVIPC_SHM_UNLOCK:
    283 		case KAUTH_REQ_SYSTEM_SYSVIPC_MSGQ_OVERSIZE:
    284 			if (isroot)
    285 				result = KAUTH_RESULT_ALLOW;
    286 
    287 			break;
    288 
    289 		default:
    290 			break;
    291 		}
    292 
    293 		break;
    294 
    295 	case KAUTH_SYSTEM_MOUNT:
    296 		switch (req) {
    297 		case KAUTH_REQ_SYSTEM_MOUNT_DEVICE:
    298 		case KAUTH_REQ_SYSTEM_MOUNT_GET:
    299 		case KAUTH_REQ_SYSTEM_MOUNT_NEW:
    300 		case KAUTH_REQ_SYSTEM_MOUNT_UNMOUNT:
    301 		case KAUTH_REQ_SYSTEM_MOUNT_UPDATE:
    302 		case KAUTH_REQ_SYSTEM_MOUNT_UMAP:
    303 			if (isroot) {
    304 				result = KAUTH_RESULT_ALLOW;
    305 				break;
    306 			}
    307 
    308 			break;
    309 
    310 		default:
    311 			break;
    312 		}
    313 
    314 		break;
    315 
    316 	case KAUTH_SYSTEM_MQUEUE:
    317 		if (isroot)
    318 			result = KAUTH_RESULT_ALLOW;
    319 
    320 		break;
    321 
    322 	case KAUTH_SYSTEM_PSET:
    323 		switch (req) {
    324 		case KAUTH_REQ_SYSTEM_PSET_ASSIGN:
    325 		case KAUTH_REQ_SYSTEM_PSET_BIND:
    326 		case KAUTH_REQ_SYSTEM_PSET_CREATE:
    327 		case KAUTH_REQ_SYSTEM_PSET_DESTROY:
    328 			if (isroot)
    329 				result = KAUTH_RESULT_ALLOW;
    330 
    331 			break;
    332 
    333 		default:
    334 			break;
    335 		}
    336 
    337 		break;
    338 
    339 	case KAUTH_SYSTEM_TIME:
    340 		switch (req) {
    341 		case KAUTH_REQ_SYSTEM_TIME_ADJTIME:
    342 		case KAUTH_REQ_SYSTEM_TIME_NTPADJTIME:
    343 		case KAUTH_REQ_SYSTEM_TIME_TIMECOUNTERS:
    344 		case KAUTH_REQ_SYSTEM_TIME_SYSTEM:
    345 		case KAUTH_REQ_SYSTEM_TIME_RTCOFFSET:
    346 			if (isroot)
    347 				result = KAUTH_RESULT_ALLOW;
    348 			break;
    349 
    350 		default:
    351 			break;
    352 		}
    353 		break;
    354 
    355 	case KAUTH_SYSTEM_SEMAPHORE:
    356 		if (isroot)
    357 			result = KAUTH_RESULT_ALLOW;
    358 
    359 		break;
    360 
    361 	case KAUTH_SYSTEM_SYSCTL:
    362 		switch (req) {
    363 		case KAUTH_REQ_SYSTEM_SYSCTL_ADD:
    364 		case KAUTH_REQ_SYSTEM_SYSCTL_DELETE:
    365 		case KAUTH_REQ_SYSTEM_SYSCTL_DESC:
    366 		case KAUTH_REQ_SYSTEM_SYSCTL_MODIFY:
    367 		case KAUTH_REQ_SYSTEM_SYSCTL_PRVT:
    368 			if (isroot)
    369 				result = KAUTH_RESULT_ALLOW;
    370 			break;
    371 
    372 		default:
    373 			break;
    374 		}
    375 
    376 		break;
    377 
    378 	case KAUTH_SYSTEM_SWAPCTL:
    379 	case KAUTH_SYSTEM_ACCOUNTING:
    380 	case KAUTH_SYSTEM_REBOOT:
    381 	case KAUTH_SYSTEM_CHROOT:
    382 	case KAUTH_SYSTEM_FILEHANDLE:
    383 	case KAUTH_SYSTEM_MKNOD:
    384 	case KAUTH_SYSTEM_SETIDCORE:
    385 	case KAUTH_SYSTEM_MODULE:
    386 	case KAUTH_SYSTEM_FS_RESERVEDSPACE:
    387 	case KAUTH_SYSTEM_MAP_VA_ZERO:
    388 	case KAUTH_SYSTEM_FS_EXTATTR:
    389 	case KAUTH_SYSTEM_FS_SNAPSHOT:
    390 		if (isroot)
    391 			result = KAUTH_RESULT_ALLOW;
    392 		break;
    393 
    394 	case KAUTH_SYSTEM_DEBUG:
    395 		break;
    396 
    397 	case KAUTH_SYSTEM_CHSYSFLAGS:
    398 		/* Deprecated. */
    399 		if (isroot)
    400 			result = KAUTH_RESULT_ALLOW;
    401 
    402 		break;
    403 
    404 	case KAUTH_SYSTEM_VERIEXEC:
    405 		switch (req) {
    406 		case KAUTH_REQ_SYSTEM_VERIEXEC_ACCESS:
    407 		case KAUTH_REQ_SYSTEM_VERIEXEC_MODIFY:
    408 			if (isroot)
    409 				result = KAUTH_RESULT_ALLOW;
    410 
    411 			break;
    412 
    413 		default:
    414 			break;
    415 		}
    416 
    417 		break;
    418 
    419 	case KAUTH_SYSTEM_LFS:
    420 		switch (req) {
    421 		case KAUTH_REQ_SYSTEM_LFS_MARKV:
    422 		case KAUTH_REQ_SYSTEM_LFS_BMAPV:
    423 		case KAUTH_REQ_SYSTEM_LFS_SEGCLEAN:
    424 		case KAUTH_REQ_SYSTEM_LFS_SEGWAIT:
    425 		case KAUTH_REQ_SYSTEM_LFS_FCNTL:
    426 			if (isroot)
    427 				result = KAUTH_RESULT_ALLOW;
    428 
    429 		default:
    430 			break;
    431 		}
    432 
    433 		break;
    434 
    435 	case KAUTH_SYSTEM_INTR:
    436 		switch (req) {
    437 		case KAUTH_REQ_SYSTEM_INTR_AFFINITY:
    438 			if (isroot)
    439 				result = KAUTH_RESULT_ALLOW;
    440 
    441 			break;
    442 
    443 		default:
    444 			break;
    445 		}
    446 
    447 		break;
    448 
    449 	case KAUTH_SYSTEM_KERNADDR:
    450 		if (isroot)
    451 			result = KAUTH_RESULT_ALLOW;
    452 
    453 		break;
    454 
    455 	default:
    456 		break;
    457 	}
    458 
    459 	return (result);
    460 }
    461 
    462 /*
    463  * kauth(9) listener
    464  *
    465  * Security model: Traditional NetBSD
    466  * Scope: Process
    467  * Responsibility: Superuser access
    468  */
    469 int
    470 secmodel_suser_process_cb(kauth_cred_t cred, kauth_action_t action,
    471     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    472 {
    473 	bool isroot;
    474 	int result;
    475 
    476 	isroot = suser_isroot(cred);
    477 	result = KAUTH_RESULT_DEFER;
    478 
    479 	switch (action) {
    480 	case KAUTH_PROCESS_SIGNAL:
    481 	case KAUTH_PROCESS_KTRACE:
    482 	case KAUTH_PROCESS_PROCFS:
    483 	case KAUTH_PROCESS_PTRACE:
    484 	case KAUTH_PROCESS_SCHEDULER_GETPARAM:
    485 	case KAUTH_PROCESS_SCHEDULER_SETPARAM:
    486 	case KAUTH_PROCESS_SCHEDULER_GETAFFINITY:
    487 	case KAUTH_PROCESS_SCHEDULER_SETAFFINITY:
    488 	case KAUTH_PROCESS_SETID:
    489 	case KAUTH_PROCESS_KEVENT_FILTER:
    490 	case KAUTH_PROCESS_NICE:
    491 	case KAUTH_PROCESS_FORK:
    492 	case KAUTH_PROCESS_CORENAME:
    493 	case KAUTH_PROCESS_STOPFLAG:
    494 		if (isroot)
    495 			result = KAUTH_RESULT_ALLOW;
    496 
    497 		break;
    498 
    499 	case KAUTH_PROCESS_CANSEE: {
    500 		unsigned long req;
    501 
    502 		req = (unsigned long)arg1;
    503 
    504 		switch (req) {
    505 		case KAUTH_REQ_PROCESS_CANSEE_ARGS:
    506 		case KAUTH_REQ_PROCESS_CANSEE_ENTRY:
    507 		case KAUTH_REQ_PROCESS_CANSEE_OPENFILES:
    508 		case KAUTH_REQ_PROCESS_CANSEE_EPROC:
    509 		case KAUTH_REQ_PROCESS_CANSEE_KPTR:
    510 			if (isroot) {
    511 				result = KAUTH_RESULT_ALLOW;
    512 				break;
    513 			}
    514 
    515 			break;
    516 
    517 		case KAUTH_REQ_PROCESS_CANSEE_ENV:
    518 			if (isroot)
    519 				result = KAUTH_RESULT_ALLOW;
    520 
    521 			break;
    522 
    523 		default:
    524 			break;
    525 		}
    526 
    527 		break;
    528 		}
    529 
    530 	case KAUTH_PROCESS_RLIMIT: {
    531 		enum kauth_process_req req;
    532 
    533 		req = (enum kauth_process_req)(unsigned long)arg1;
    534 
    535 		switch (req) {
    536 		case KAUTH_REQ_PROCESS_RLIMIT_SET:
    537 		case KAUTH_REQ_PROCESS_RLIMIT_GET:
    538 		case KAUTH_REQ_PROCESS_RLIMIT_BYPASS:
    539 			if (isroot)
    540 				result = KAUTH_RESULT_ALLOW;
    541 
    542 			break;
    543 
    544 		default:
    545 			break;
    546 		}
    547 
    548 		break;
    549 		}
    550 
    551 	default:
    552 		break;
    553 	}
    554 
    555 	return (result);
    556 }
    557 
    558 /*
    559  * kauth(9) listener
    560  *
    561  * Security model: Traditional NetBSD
    562  * Scope: Network
    563  * Responsibility: Superuser access
    564  */
    565 int
    566 secmodel_suser_network_cb(kauth_cred_t cred, kauth_action_t action,
    567     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    568 {
    569 	bool isroot;
    570 	int result;
    571 	enum kauth_network_req req;
    572 
    573 	isroot = suser_isroot(cred);
    574 	result = KAUTH_RESULT_DEFER;
    575 	req = (enum kauth_network_req)arg0;
    576 
    577 	switch (action) {
    578 	case KAUTH_NETWORK_ALTQ:
    579 		switch (req) {
    580 		case KAUTH_REQ_NETWORK_ALTQ_AFMAP:
    581 		case KAUTH_REQ_NETWORK_ALTQ_BLUE:
    582 		case KAUTH_REQ_NETWORK_ALTQ_CBQ:
    583 		case KAUTH_REQ_NETWORK_ALTQ_CDNR:
    584 		case KAUTH_REQ_NETWORK_ALTQ_CONF:
    585 		case KAUTH_REQ_NETWORK_ALTQ_FIFOQ:
    586 		case KAUTH_REQ_NETWORK_ALTQ_HFSC:
    587 		case KAUTH_REQ_NETWORK_ALTQ_JOBS:
    588 		case KAUTH_REQ_NETWORK_ALTQ_PRIQ:
    589 		case KAUTH_REQ_NETWORK_ALTQ_RED:
    590 		case KAUTH_REQ_NETWORK_ALTQ_RIO:
    591 		case KAUTH_REQ_NETWORK_ALTQ_WFQ:
    592 			if (isroot)
    593 				result = KAUTH_RESULT_ALLOW;
    594 			break;
    595 
    596 		default:
    597 			break;
    598 		}
    599 
    600 		break;
    601 
    602 	case KAUTH_NETWORK_BIND:
    603 		switch (req) {
    604 		case KAUTH_REQ_NETWORK_BIND_PORT:
    605 		case KAUTH_REQ_NETWORK_BIND_PRIVPORT:
    606 			if (isroot)
    607 				result = KAUTH_RESULT_ALLOW;
    608 			break;
    609 
    610 		default:
    611 			break;
    612 		}
    613 		break;
    614 
    615 	case KAUTH_NETWORK_FIREWALL:
    616 		switch (req) {
    617 		case KAUTH_REQ_NETWORK_FIREWALL_FW:
    618 		case KAUTH_REQ_NETWORK_FIREWALL_NAT:
    619 			if (isroot)
    620 				result = KAUTH_RESULT_ALLOW;
    621 
    622 			break;
    623 
    624 		default:
    625 			break;
    626 		}
    627 		break;
    628 
    629 	case KAUTH_NETWORK_FORWSRCRT:
    630 	case KAUTH_NETWORK_ROUTE:
    631 		if (isroot)
    632 			result = KAUTH_RESULT_ALLOW;
    633 
    634 		break;
    635 
    636 	case KAUTH_NETWORK_INTERFACE:
    637 		switch (req) {
    638 		case KAUTH_REQ_NETWORK_INTERFACE_GET:
    639 		case KAUTH_REQ_NETWORK_INTERFACE_SET:
    640 		case KAUTH_REQ_NETWORK_INTERFACE_GETPRIV:
    641 		case KAUTH_REQ_NETWORK_INTERFACE_SETPRIV:
    642 		case KAUTH_REQ_NETWORK_INTERFACE_FIRMWARE:
    643 			if (isroot)
    644 				result = KAUTH_RESULT_ALLOW;
    645 			break;
    646 
    647 		default:
    648 			break;
    649 		}
    650 		break;
    651 
    652 	case KAUTH_NETWORK_INTERFACE_BRIDGE:
    653 		switch (req) {
    654 		case KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_GETPRIV:
    655 		case KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_SETPRIV:
    656 			if (isroot)
    657 				result = KAUTH_RESULT_ALLOW;
    658 			break;
    659 
    660 		default:
    661 			break;
    662 		}
    663 
    664 		break;
    665 
    666 	case KAUTH_NETWORK_INTERFACE_PPP:
    667 		switch (req) {
    668 		case KAUTH_REQ_NETWORK_INTERFACE_PPP_ADD:
    669 			if (isroot)
    670 				result = KAUTH_RESULT_ALLOW;
    671 			break;
    672 
    673 		default:
    674 			break;
    675 		}
    676 
    677 		break;
    678 
    679 	case KAUTH_NETWORK_INTERFACE_PVC:
    680 		switch (req) {
    681 		case KAUTH_REQ_NETWORK_INTERFACE_PVC_ADD:
    682 			if (isroot)
    683 				result = KAUTH_RESULT_ALLOW;
    684 
    685 			break;
    686 
    687 		default:
    688 			break;
    689 		}
    690 
    691 		break;
    692 
    693 	case KAUTH_NETWORK_INTERFACE_SLIP:
    694 		switch (req) {
    695 		case KAUTH_REQ_NETWORK_INTERFACE_SLIP_ADD:
    696 			if (isroot)
    697 				result = KAUTH_RESULT_ALLOW;
    698 			break;
    699 
    700 		default:
    701 			break;
    702 		}
    703 
    704 		break;
    705 
    706 	case KAUTH_NETWORK_INTERFACE_STRIP:
    707 		switch (req) {
    708 		case KAUTH_REQ_NETWORK_INTERFACE_STRIP_ADD:
    709 			if (isroot)
    710 				result = KAUTH_RESULT_ALLOW;
    711 			break;
    712 
    713 		default:
    714 			break;
    715 		}
    716 
    717 		break;
    718 
    719 	case KAUTH_NETWORK_INTERFACE_TUN:
    720 		switch (req) {
    721 		case KAUTH_REQ_NETWORK_INTERFACE_TUN_ADD:
    722 			if (isroot)
    723 				result = KAUTH_RESULT_ALLOW;
    724 			break;
    725 
    726 		default:
    727 			break;
    728 		}
    729 
    730 		break;
    731 
    732 	case KAUTH_NETWORK_IPV6:
    733 		switch (req) {
    734 		case KAUTH_REQ_NETWORK_IPV6_HOPBYHOP:
    735 		case KAUTH_REQ_NETWORK_IPV6_JOIN_MULTICAST:
    736 			if (isroot)
    737 				result = KAUTH_RESULT_ALLOW;
    738 
    739 			break;
    740 
    741 		default:
    742 			break;
    743 		}
    744 
    745 		break;
    746 
    747 	case KAUTH_NETWORK_NFS:
    748 		switch (req) {
    749 		case KAUTH_REQ_NETWORK_NFS_EXPORT:
    750 		case KAUTH_REQ_NETWORK_NFS_SVC:
    751 			if (isroot)
    752 				result = KAUTH_RESULT_ALLOW;
    753 
    754 			break;
    755 
    756 		default:
    757 			break;
    758 		}
    759 		break;
    760 
    761 	case KAUTH_NETWORK_SMB:
    762 		switch (req) {
    763 		case KAUTH_REQ_NETWORK_SMB_SHARE_ACCESS:
    764 		case KAUTH_REQ_NETWORK_SMB_SHARE_CREATE:
    765 		case KAUTH_REQ_NETWORK_SMB_VC_ACCESS:
    766 		case KAUTH_REQ_NETWORK_SMB_VC_CREATE:
    767 			if (isroot)
    768 				result = KAUTH_RESULT_ALLOW;
    769 
    770 			break;
    771 
    772 		default:
    773 			break;
    774 		}
    775 
    776 		break;
    777 
    778 	case KAUTH_NETWORK_SOCKET:
    779 		switch (req) {
    780 		case KAUTH_REQ_NETWORK_SOCKET_DROP:
    781 		case KAUTH_REQ_NETWORK_SOCKET_OPEN:
    782 		case KAUTH_REQ_NETWORK_SOCKET_RAWSOCK:
    783 		case KAUTH_REQ_NETWORK_SOCKET_SETPRIV:
    784 			if (isroot)
    785 				result = KAUTH_RESULT_ALLOW;
    786 			break;
    787 
    788 		case KAUTH_REQ_NETWORK_SOCKET_CANSEE:
    789 			if (isroot) {
    790 				result = KAUTH_RESULT_ALLOW;
    791 				break;
    792 			}
    793 
    794 			break;
    795 
    796 		default:
    797 			break;
    798 		}
    799 
    800 		break;
    801 
    802 	case KAUTH_NETWORK_IPSEC:
    803 		switch (req) {
    804 		case KAUTH_REQ_NETWORK_IPSEC_BYPASS:
    805 			if (isroot)
    806 				result = KAUTH_RESULT_ALLOW;
    807 
    808 			break;
    809 
    810 		default:
    811 			break;
    812 		}
    813 
    814 		break;
    815 
    816 	default:
    817 		break;
    818 	}
    819 
    820 	return (result);
    821 }
    822 
    823 /*
    824  * kauth(9) listener
    825  *
    826  * Security model: Traditional NetBSD
    827  * Scope: Machdep
    828  * Responsibility: Superuser access
    829  */
    830 int
    831 secmodel_suser_machdep_cb(kauth_cred_t cred, kauth_action_t action,
    832     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    833 {
    834 	bool isroot;
    835 	int result;
    836 
    837 	isroot = suser_isroot(cred);
    838 	result = KAUTH_RESULT_DEFER;
    839 
    840 	switch (action) {
    841 	case KAUTH_MACHDEP_CPU_UCODE_APPLY:
    842 	case KAUTH_MACHDEP_IOPERM_GET:
    843 	case KAUTH_MACHDEP_LDT_GET:
    844 	case KAUTH_MACHDEP_LDT_SET:
    845 	case KAUTH_MACHDEP_MTRR_GET:
    846 	case KAUTH_MACHDEP_CACHEFLUSH:
    847 	case KAUTH_MACHDEP_IOPERM_SET:
    848 	case KAUTH_MACHDEP_IOPL:
    849 	case KAUTH_MACHDEP_MTRR_SET:
    850 	case KAUTH_MACHDEP_NVRAM:
    851 	case KAUTH_MACHDEP_UNMANAGEDMEM:
    852 	case KAUTH_MACHDEP_PXG:
    853 	case KAUTH_MACHDEP_SVS_DISABLE:
    854 		if (isroot)
    855 			result = KAUTH_RESULT_ALLOW;
    856 		break;
    857 
    858 	default:
    859 		break;
    860 	}
    861 
    862 	return (result);
    863 }
    864 
    865 /*
    866  * kauth(9) listener
    867  *
    868  * Security model: Traditional NetBSD
    869  * Scope: Device
    870  * Responsibility: Superuser access
    871  */
    872 int
    873 secmodel_suser_device_cb(kauth_cred_t cred, kauth_action_t action,
    874     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    875 {
    876 	bool isroot;
    877 	int result;
    878 
    879 	isroot = suser_isroot(cred);
    880 	result = KAUTH_RESULT_DEFER;
    881 
    882 	switch (action) {
    883 	case KAUTH_DEVICE_BLUETOOTH_SETPRIV:
    884 	case KAUTH_DEVICE_BLUETOOTH_SEND:
    885 	case KAUTH_DEVICE_BLUETOOTH_RECV:
    886 	case KAUTH_DEVICE_TTY_OPEN:
    887 	case KAUTH_DEVICE_TTY_PRIVSET:
    888 	case KAUTH_DEVICE_TTY_STI:
    889 	case KAUTH_DEVICE_TTY_VIRTUAL:
    890 	case KAUTH_DEVICE_RND_ADDDATA:
    891 	case KAUTH_DEVICE_RND_ADDDATA_ESTIMATE:
    892 	case KAUTH_DEVICE_RND_GETPRIV:
    893 	case KAUTH_DEVICE_RND_SETPRIV:
    894 	case KAUTH_DEVICE_WSCONS_KEYBOARD_BELL:
    895 	case KAUTH_DEVICE_WSCONS_KEYBOARD_KEYREPEAT:
    896 	case KAUTH_DEVICE_NVMM_CTL:
    897 		if (isroot)
    898 			result = KAUTH_RESULT_ALLOW;
    899 		break;
    900 
    901 	case KAUTH_DEVICE_BLUETOOTH_BCSP:
    902 	case KAUTH_DEVICE_BLUETOOTH_BTUART: {
    903 		enum kauth_device_req req;
    904 
    905 		req = (enum kauth_device_req)arg0;
    906 		switch (req) {
    907 		case KAUTH_REQ_DEVICE_BLUETOOTH_BCSP_ADD:
    908 		case KAUTH_REQ_DEVICE_BLUETOOTH_BTUART_ADD:
    909 			if (isroot)
    910 				result = KAUTH_RESULT_ALLOW;
    911 			break;
    912 
    913 		default:
    914 			break;
    915 		}
    916 
    917 		break;
    918 		}
    919 
    920 	case KAUTH_DEVICE_GPIO_PINSET:
    921 		/*
    922 		 * root can access gpio pins, secmodel_securlevel can veto
    923 		 * this decision.
    924 		 */
    925 		if (isroot)
    926 			result = KAUTH_RESULT_ALLOW;
    927 		break;
    928 
    929 	default:
    930 		break;
    931 	}
    932 
    933 	return (result);
    934 }
    935 
    936 int
    937 secmodel_suser_vnode_cb(kauth_cred_t cred, kauth_action_t action,
    938     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    939 {
    940 	bool isroot;
    941 	int result;
    942 
    943 	isroot = suser_isroot(cred);
    944 	result = KAUTH_RESULT_DEFER;
    945 
    946 	if (isroot) {
    947 		/* Superuser can execute only if the file's executable. */
    948 		if ((action & KAUTH_VNODE_EXECUTE) == 0 ||
    949 		    (action & KAUTH_VNODE_IS_EXEC))
    950 			result = KAUTH_RESULT_ALLOW;
    951 	}
    952 
    953 	return (result);
    954 }
    955 
    956