Home | History | Annotate | Line # | Download | only in suser
secmodel_suser.c revision 1.39.2.1
      1 /* $NetBSD: secmodel_suser.c,v 1.39.2.1 2012/11/20 03:02:51 tls 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.39.2.1 2012/11/20 03:02:51 tls 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 	bool isroot;
    471 	int result;
    472 
    473 	isroot = suser_isroot(cred);
    474 	result = KAUTH_RESULT_DEFER;
    475 
    476 	switch (action) {
    477 	case KAUTH_PROCESS_SIGNAL:
    478 	case KAUTH_PROCESS_KTRACE:
    479 	case KAUTH_PROCESS_PROCFS:
    480 	case KAUTH_PROCESS_PTRACE:
    481 	case KAUTH_PROCESS_SCHEDULER_GETPARAM:
    482 	case KAUTH_PROCESS_SCHEDULER_SETPARAM:
    483 	case KAUTH_PROCESS_SCHEDULER_GETAFFINITY:
    484 	case KAUTH_PROCESS_SCHEDULER_SETAFFINITY:
    485 	case KAUTH_PROCESS_SETID:
    486 	case KAUTH_PROCESS_KEVENT_FILTER:
    487 	case KAUTH_PROCESS_NICE:
    488 	case KAUTH_PROCESS_FORK:
    489 	case KAUTH_PROCESS_CORENAME:
    490 	case KAUTH_PROCESS_STOPFLAG:
    491 		if (isroot)
    492 			result = KAUTH_RESULT_ALLOW;
    493 
    494 		break;
    495 
    496 	case KAUTH_PROCESS_CANSEE: {
    497 		unsigned long req;
    498 
    499 		req = (unsigned long)arg1;
    500 
    501 		switch (req) {
    502 		case KAUTH_REQ_PROCESS_CANSEE_ARGS:
    503 		case KAUTH_REQ_PROCESS_CANSEE_ENTRY:
    504 		case KAUTH_REQ_PROCESS_CANSEE_OPENFILES:
    505 			if (isroot) {
    506 				result = KAUTH_RESULT_ALLOW;
    507 				break;
    508 			}
    509 
    510 			break;
    511 
    512 		case KAUTH_REQ_PROCESS_CANSEE_ENV:
    513 			if (isroot)
    514 				result = KAUTH_RESULT_ALLOW;
    515 
    516 			break;
    517 
    518 		default:
    519 			break;
    520 		}
    521 
    522 		break;
    523 		}
    524 
    525 	case KAUTH_PROCESS_RLIMIT: {
    526 		enum kauth_process_req req;
    527 
    528 		req = (enum kauth_process_req)(unsigned long)arg1;
    529 
    530 		switch (req) {
    531 		case KAUTH_REQ_PROCESS_RLIMIT_SET:
    532 		case KAUTH_REQ_PROCESS_RLIMIT_GET:
    533 		case KAUTH_REQ_PROCESS_RLIMIT_BYPASS:
    534 			if (isroot)
    535 				result = KAUTH_RESULT_ALLOW;
    536 
    537 			break;
    538 
    539 		default:
    540 			break;
    541 		}
    542 
    543 		break;
    544 		}
    545 
    546 	default:
    547 		break;
    548 	}
    549 
    550 	return (result);
    551 }
    552 
    553 /*
    554  * kauth(9) listener
    555  *
    556  * Security model: Traditional NetBSD
    557  * Scope: Network
    558  * Responsibility: Superuser access
    559  */
    560 int
    561 secmodel_suser_network_cb(kauth_cred_t cred, kauth_action_t action,
    562     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    563 {
    564 	bool isroot;
    565 	int result;
    566 	enum kauth_network_req req;
    567 
    568 	isroot = suser_isroot(cred);
    569 	result = KAUTH_RESULT_DEFER;
    570 	req = (enum kauth_network_req)arg0;
    571 
    572 	switch (action) {
    573 	case KAUTH_NETWORK_ALTQ:
    574 		switch (req) {
    575 		case KAUTH_REQ_NETWORK_ALTQ_AFMAP:
    576 		case KAUTH_REQ_NETWORK_ALTQ_BLUE:
    577 		case KAUTH_REQ_NETWORK_ALTQ_CBQ:
    578 		case KAUTH_REQ_NETWORK_ALTQ_CDNR:
    579 		case KAUTH_REQ_NETWORK_ALTQ_CONF:
    580 		case KAUTH_REQ_NETWORK_ALTQ_FIFOQ:
    581 		case KAUTH_REQ_NETWORK_ALTQ_HFSC:
    582 		case KAUTH_REQ_NETWORK_ALTQ_JOBS:
    583 		case KAUTH_REQ_NETWORK_ALTQ_PRIQ:
    584 		case KAUTH_REQ_NETWORK_ALTQ_RED:
    585 		case KAUTH_REQ_NETWORK_ALTQ_RIO:
    586 		case KAUTH_REQ_NETWORK_ALTQ_WFQ:
    587 			if (isroot)
    588 				result = KAUTH_RESULT_ALLOW;
    589 			break;
    590 
    591 		default:
    592 			break;
    593 		}
    594 
    595 		break;
    596 
    597 	case KAUTH_NETWORK_BIND:
    598 		switch (req) {
    599 		case KAUTH_REQ_NETWORK_BIND_PORT:
    600 		case KAUTH_REQ_NETWORK_BIND_PRIVPORT:
    601 			if (isroot)
    602 				result = KAUTH_RESULT_ALLOW;
    603 			break;
    604 
    605 		default:
    606 			break;
    607 		}
    608 		break;
    609 
    610 	case KAUTH_NETWORK_FIREWALL:
    611 		switch (req) {
    612 		case KAUTH_REQ_NETWORK_FIREWALL_FW:
    613 		case KAUTH_REQ_NETWORK_FIREWALL_NAT:
    614 			if (isroot)
    615 				result = KAUTH_RESULT_ALLOW;
    616 
    617 			break;
    618 
    619 		default:
    620 			break;
    621 		}
    622 		break;
    623 
    624 	case KAUTH_NETWORK_FORWSRCRT:
    625 	case KAUTH_NETWORK_ROUTE:
    626 		if (isroot)
    627 			result = KAUTH_RESULT_ALLOW;
    628 
    629 		break;
    630 
    631 	case KAUTH_NETWORK_INTERFACE:
    632 		switch (req) {
    633 		case KAUTH_REQ_NETWORK_INTERFACE_GET:
    634 		case KAUTH_REQ_NETWORK_INTERFACE_SET:
    635 		case KAUTH_REQ_NETWORK_INTERFACE_GETPRIV:
    636 		case KAUTH_REQ_NETWORK_INTERFACE_SETPRIV:
    637 		case KAUTH_REQ_NETWORK_INTERFACE_FIRMWARE:
    638 			if (isroot)
    639 				result = KAUTH_RESULT_ALLOW;
    640 			break;
    641 
    642 		default:
    643 			break;
    644 		}
    645 		break;
    646 
    647 	case KAUTH_NETWORK_INTERFACE_BRIDGE:
    648 		switch (req) {
    649 		case KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_GETPRIV:
    650 		case KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_SETPRIV:
    651 			if (isroot)
    652 				result = KAUTH_RESULT_ALLOW;
    653 			break;
    654 
    655 		default:
    656 			break;
    657 		}
    658 
    659 		break;
    660 
    661 	case KAUTH_NETWORK_INTERFACE_PPP:
    662 		switch (req) {
    663 		case KAUTH_REQ_NETWORK_INTERFACE_PPP_ADD:
    664 			if (isroot)
    665 				result = KAUTH_RESULT_ALLOW;
    666 			break;
    667 
    668 		default:
    669 			break;
    670 		}
    671 
    672 		break;
    673 
    674 	case KAUTH_NETWORK_INTERFACE_PVC:
    675 		switch (req) {
    676 		case KAUTH_REQ_NETWORK_INTERFACE_PVC_ADD:
    677 			if (isroot)
    678 				result = KAUTH_RESULT_ALLOW;
    679 
    680 			break;
    681 
    682 		default:
    683 			break;
    684 		}
    685 
    686 		break;
    687 
    688 	case KAUTH_NETWORK_INTERFACE_SLIP:
    689 		switch (req) {
    690 		case KAUTH_REQ_NETWORK_INTERFACE_SLIP_ADD:
    691 			if (isroot)
    692 				result = KAUTH_RESULT_ALLOW;
    693 			break;
    694 
    695 		default:
    696 			break;
    697 		}
    698 
    699 		break;
    700 
    701 	case KAUTH_NETWORK_INTERFACE_STRIP:
    702 		switch (req) {
    703 		case KAUTH_REQ_NETWORK_INTERFACE_STRIP_ADD:
    704 			if (isroot)
    705 				result = KAUTH_RESULT_ALLOW;
    706 			break;
    707 
    708 		default:
    709 			break;
    710 		}
    711 
    712 		break;
    713 
    714 	case KAUTH_NETWORK_INTERFACE_TUN:
    715 		switch (req) {
    716 		case KAUTH_REQ_NETWORK_INTERFACE_TUN_ADD:
    717 			if (isroot)
    718 				result = KAUTH_RESULT_ALLOW;
    719 			break;
    720 
    721 		default:
    722 			break;
    723 		}
    724 
    725 		break;
    726 
    727 	case KAUTH_NETWORK_IPV6:
    728 		switch (req) {
    729 		case KAUTH_REQ_NETWORK_IPV6_HOPBYHOP:
    730 		case KAUTH_REQ_NETWORK_IPV6_JOIN_MULTICAST:
    731 			if (isroot)
    732 				result = KAUTH_RESULT_ALLOW;
    733 
    734 			break;
    735 
    736 		default:
    737 			break;
    738 		}
    739 
    740 		break;
    741 
    742 	case KAUTH_NETWORK_NFS:
    743 		switch (req) {
    744 		case KAUTH_REQ_NETWORK_NFS_EXPORT:
    745 		case KAUTH_REQ_NETWORK_NFS_SVC:
    746 			if (isroot)
    747 				result = KAUTH_RESULT_ALLOW;
    748 
    749 			break;
    750 
    751 		default:
    752 			break;
    753 		}
    754 		break;
    755 
    756 	case KAUTH_NETWORK_SMB:
    757 		switch (req) {
    758 		case KAUTH_REQ_NETWORK_SMB_SHARE_ACCESS:
    759 		case KAUTH_REQ_NETWORK_SMB_SHARE_CREATE:
    760 		case KAUTH_REQ_NETWORK_SMB_VC_ACCESS:
    761 		case KAUTH_REQ_NETWORK_SMB_VC_CREATE:
    762 			if (isroot)
    763 				result = KAUTH_RESULT_ALLOW;
    764 
    765 			break;
    766 
    767 		default:
    768 			break;
    769 		}
    770 
    771 		break;
    772 
    773 	case KAUTH_NETWORK_SOCKET:
    774 		switch (req) {
    775 		case KAUTH_REQ_NETWORK_SOCKET_DROP:
    776 		case KAUTH_REQ_NETWORK_SOCKET_OPEN:
    777 		case KAUTH_REQ_NETWORK_SOCKET_RAWSOCK:
    778 		case KAUTH_REQ_NETWORK_SOCKET_SETPRIV:
    779 			if (isroot)
    780 				result = KAUTH_RESULT_ALLOW;
    781 			break;
    782 
    783 		case KAUTH_REQ_NETWORK_SOCKET_CANSEE:
    784 			if (isroot) {
    785 				result = KAUTH_RESULT_ALLOW;
    786 				break;
    787 			}
    788 
    789 			break;
    790 
    791 		default:
    792 			break;
    793 		}
    794 
    795 		break;
    796 
    797 	case KAUTH_NETWORK_IPSEC:
    798 		switch (req) {
    799 		case KAUTH_REQ_NETWORK_IPSEC_BYPASS:
    800 			if (isroot)
    801 				result = KAUTH_RESULT_ALLOW;
    802 
    803 			break;
    804 
    805 		default:
    806 			break;
    807 		}
    808 
    809 		break;
    810 
    811 	default:
    812 		break;
    813 	}
    814 
    815 	return (result);
    816 }
    817 
    818 /*
    819  * kauth(9) listener
    820  *
    821  * Security model: Traditional NetBSD
    822  * Scope: Machdep
    823  * Responsibility: Superuser access
    824  */
    825 int
    826 secmodel_suser_machdep_cb(kauth_cred_t cred, kauth_action_t action,
    827     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    828 {
    829         bool isroot;
    830         int result;
    831 
    832         isroot = suser_isroot(cred);
    833         result = KAUTH_RESULT_DEFER;
    834 
    835         switch (action) {
    836 	case KAUTH_MACHDEP_CPU_UCODE_APPLY:
    837 	case KAUTH_MACHDEP_IOPERM_GET:
    838 	case KAUTH_MACHDEP_LDT_GET:
    839 	case KAUTH_MACHDEP_LDT_SET:
    840 	case KAUTH_MACHDEP_MTRR_GET:
    841 	case KAUTH_MACHDEP_CACHEFLUSH:
    842 	case KAUTH_MACHDEP_IOPERM_SET:
    843 	case KAUTH_MACHDEP_IOPL:
    844 	case KAUTH_MACHDEP_MTRR_SET:
    845 	case KAUTH_MACHDEP_NVRAM:
    846 	case KAUTH_MACHDEP_UNMANAGEDMEM:
    847 	case KAUTH_MACHDEP_PXG:
    848 		if (isroot)
    849 			result = KAUTH_RESULT_ALLOW;
    850 		break;
    851 
    852 	default:
    853 		break;
    854 	}
    855 
    856 	return (result);
    857 }
    858 
    859 /*
    860  * kauth(9) listener
    861  *
    862  * Security model: Traditional NetBSD
    863  * Scope: Device
    864  * Responsibility: Superuser access
    865  */
    866 int
    867 secmodel_suser_device_cb(kauth_cred_t cred, kauth_action_t action,
    868     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    869 {
    870         bool isroot;
    871         int result;
    872 
    873         isroot = suser_isroot(cred);
    874         result = KAUTH_RESULT_DEFER;
    875 
    876 	switch (action) {
    877 	case KAUTH_DEVICE_BLUETOOTH_SETPRIV:
    878 	case KAUTH_DEVICE_BLUETOOTH_SEND:
    879 	case KAUTH_DEVICE_BLUETOOTH_RECV:
    880 	case KAUTH_DEVICE_TTY_OPEN:
    881 	case KAUTH_DEVICE_TTY_PRIVSET:
    882 	case KAUTH_DEVICE_TTY_STI:
    883 	case KAUTH_DEVICE_TTY_VIRTUAL:
    884 	case KAUTH_DEVICE_RND_ADDDATA:
    885 	case KAUTH_DEVICE_RND_ADDDATA_ESTIMATE:
    886 	case KAUTH_DEVICE_RND_GETPRIV:
    887 	case KAUTH_DEVICE_RND_SETPRIV:
    888 	case KAUTH_DEVICE_WSCONS_KEYBOARD_BELL:
    889 	case KAUTH_DEVICE_WSCONS_KEYBOARD_KEYREPEAT:
    890 		if (isroot)
    891 			result = KAUTH_RESULT_ALLOW;
    892 		break;
    893 
    894 	case KAUTH_DEVICE_BLUETOOTH_BCSP:
    895 	case KAUTH_DEVICE_BLUETOOTH_BTUART: {
    896 		enum kauth_device_req req;
    897 
    898 		req = (enum kauth_device_req)arg0;
    899 		switch (req) {
    900 		case KAUTH_REQ_DEVICE_BLUETOOTH_BCSP_ADD:
    901 		case KAUTH_REQ_DEVICE_BLUETOOTH_BTUART_ADD:
    902 			if (isroot)
    903 				result = KAUTH_RESULT_ALLOW;
    904 			break;
    905 
    906 		default:
    907 			break;
    908 		}
    909 
    910 		break;
    911 		}
    912 
    913 	case KAUTH_DEVICE_GPIO_PINSET:
    914 		/*
    915 		 * root can access gpio pins, secmodel_securlevel can veto
    916 		 * this decision.
    917 		 */
    918 		if (isroot)
    919 			result = KAUTH_RESULT_ALLOW;
    920 		break;
    921 
    922 	default:
    923 		break;
    924 	}
    925 
    926 	return (result);
    927 }
    928 
    929 int
    930 secmodel_suser_vnode_cb(kauth_cred_t cred, kauth_action_t action,
    931     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    932 {
    933 	bool isroot;
    934 	int result;
    935 
    936 	isroot = suser_isroot(cred);
    937 	result = KAUTH_RESULT_DEFER;
    938 
    939 	if (isroot) {
    940 		/* Superuser can execute only if the file's executable. */
    941 		if ((action & KAUTH_VNODE_EXECUTE) == 0 ||
    942 		    (action & KAUTH_VNODE_IS_EXEC))
    943 			result = KAUTH_RESULT_ALLOW;
    944 	}
    945 
    946 	return (result);
    947 }
    948 
    949