Home | History | Annotate | Line # | Download | only in securelevel
secmodel_securelevel.c revision 1.20.12.2
      1  1.20.12.2      yamt /* $NetBSD: secmodel_securelevel.c,v 1.20.12.2 2012/10/30 17:22:55 yamt Exp $ */
      2        1.1      elad /*-
      3        1.1      elad  * Copyright (c) 2006 Elad Efrat <elad (at) NetBSD.org>
      4        1.1      elad  * All rights reserved.
      5        1.1      elad  *
      6        1.1      elad  * Redistribution and use in source and binary forms, with or without
      7        1.1      elad  * modification, are permitted provided that the following conditions
      8        1.1      elad  * are met:
      9        1.1      elad  * 1. Redistributions of source code must retain the above copyright
     10        1.1      elad  *    notice, this list of conditions and the following disclaimer.
     11        1.1      elad  * 2. Redistributions in binary form must reproduce the above copyright
     12        1.1      elad  *    notice, this list of conditions and the following disclaimer in the
     13        1.1      elad  *    documentation and/or other materials provided with the distribution.
     14        1.1      elad  * 3. The name of the author may not be used to endorse or promote products
     15        1.1      elad  *    derived from this software without specific prior written permission.
     16        1.1      elad  *
     17        1.1      elad  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     18        1.1      elad  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     19        1.1      elad  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     20        1.1      elad  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     21        1.1      elad  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     22        1.1      elad  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23        1.1      elad  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24        1.1      elad  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25        1.1      elad  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26        1.1      elad  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27        1.1      elad  */
     28        1.1      elad 
     29        1.1      elad /*
     30        1.1      elad  * This file contains kauth(9) listeners needed to implement the traditional
     31  1.20.12.1      yamt  * NetBSD securelevel.
     32        1.1      elad  *
     33        1.1      elad  * The securelevel is a system-global indication on what operations are
     34        1.1      elad  * allowed or not. It affects all users, including root.
     35        1.1      elad  */
     36        1.1      elad 
     37        1.1      elad #include <sys/cdefs.h>
     38  1.20.12.2      yamt __KERNEL_RCSID(0, "$NetBSD: secmodel_securelevel.c,v 1.20.12.2 2012/10/30 17:22:55 yamt Exp $");
     39        1.1      elad 
     40        1.1      elad #ifdef _KERNEL_OPT
     41        1.1      elad #include "opt_insecure.h"
     42        1.1      elad #endif /* _KERNEL_OPT */
     43        1.1      elad 
     44        1.1      elad #include <sys/types.h>
     45        1.1      elad #include <sys/param.h>
     46        1.1      elad #include <sys/kauth.h>
     47        1.1      elad 
     48        1.1      elad #include <sys/conf.h>
     49        1.1      elad #include <sys/mount.h>
     50        1.1      elad #include <sys/sysctl.h>
     51        1.1      elad #include <sys/vnode.h>
     52       1.14      elad #include <sys/module.h>
     53       1.16      elad #include <sys/timevar.h>
     54        1.1      elad 
     55        1.1      elad #include <miscfs/specfs/specdev.h>
     56        1.1      elad 
     57  1.20.12.1      yamt #include <secmodel/secmodel.h>
     58        1.1      elad #include <secmodel/securelevel/securelevel.h>
     59        1.1      elad 
     60       1.14      elad MODULE(MODULE_CLASS_SECMODEL, securelevel, NULL);
     61       1.14      elad 
     62        1.1      elad static int securelevel;
     63        1.1      elad 
     64       1.13      elad static kauth_listener_t l_system, l_process, l_network, l_machdep, l_device,
     65       1.13      elad     l_vnode;
     66        1.1      elad 
     67  1.20.12.1      yamt static secmodel_t securelevel_sm;
     68       1.14      elad static struct sysctllog *securelevel_sysctl_log;
     69       1.14      elad 
     70        1.1      elad /*
     71       1.20      elad  * Sysctl helper routine for securelevel. Ensures that the value only rises
     72       1.20      elad  * unless the caller is init.
     73        1.1      elad  */
     74        1.1      elad int
     75        1.1      elad secmodel_securelevel_sysctl(SYSCTLFN_ARGS)
     76  1.20.12.1      yamt {
     77        1.1      elad 	int newsecurelevel, error;
     78        1.1      elad 	struct sysctlnode node;
     79        1.1      elad 
     80        1.1      elad 	newsecurelevel = securelevel;
     81        1.1      elad 	node = *rnode;
     82        1.1      elad 	node.sysctl_data = &newsecurelevel;
     83        1.1      elad 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
     84        1.1      elad 	if (error || newp == NULL)
     85        1.1      elad 		return (error);
     86  1.20.12.1      yamt 
     87       1.20      elad 	if ((newsecurelevel < securelevel) && (l->l_proc != initproc))
     88        1.1      elad 		return (EPERM);
     89        1.1      elad 
     90        1.1      elad 	securelevel = newsecurelevel;
     91        1.1      elad 
     92        1.1      elad 	return (error);
     93        1.1      elad }
     94        1.1      elad 
     95        1.1      elad void
     96       1.14      elad sysctl_security_securelevel_setup(struct sysctllog **clog)
     97        1.1      elad {
     98       1.14      elad 	const struct sysctlnode *rnode;
     99       1.14      elad 
    100       1.14      elad 	sysctl_createv(clog, 0, NULL, &rnode,
    101       1.14      elad 		       CTLFLAG_PERMANENT,
    102       1.14      elad 		       CTLTYPE_NODE, "security", NULL,
    103       1.14      elad 		       NULL, 0, NULL, 0,
    104       1.14      elad 		       CTL_SECURITY, CTL_EOL);
    105       1.14      elad 
    106       1.14      elad 	sysctl_createv(clog, 0, &rnode, &rnode,
    107       1.14      elad 		       CTLFLAG_PERMANENT,
    108       1.14      elad 		       CTLTYPE_NODE, "models", NULL,
    109       1.14      elad 		       NULL, 0, NULL, 0,
    110       1.14      elad 		       CTL_CREATE, CTL_EOL);
    111       1.14      elad 
    112       1.14      elad 	sysctl_createv(clog, 0, &rnode, &rnode,
    113       1.14      elad 		       CTLFLAG_PERMANENT,
    114       1.14      elad 		       CTLTYPE_NODE, "securelevel", NULL,
    115       1.14      elad 		       NULL, 0, NULL, 0,
    116       1.14      elad 		       CTL_CREATE, CTL_EOL);
    117       1.14      elad 
    118       1.14      elad 	sysctl_createv(clog, 0, &rnode, NULL,
    119       1.14      elad 		       CTLFLAG_PERMANENT,
    120       1.14      elad 		       CTLTYPE_STRING, "name", NULL,
    121  1.20.12.1      yamt 		       NULL, 0, __UNCONST(SECMODEL_SECURELEVEL_NAME), 0,
    122       1.14      elad 		       CTL_CREATE, CTL_EOL);
    123        1.1      elad 
    124       1.15      elad 	sysctl_createv(clog, 0, &rnode, NULL,
    125       1.15      elad 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
    126       1.15      elad 		       CTLTYPE_INT, "securelevel",
    127       1.15      elad 		       SYSCTL_DESCR("System security level"),
    128       1.15      elad 		       secmodel_securelevel_sysctl, 0, NULL, 0,
    129       1.15      elad 		       CTL_CREATE, CTL_EOL);
    130       1.15      elad 
    131       1.14      elad 	/* Compatibility: kern.securelevel */
    132        1.1      elad 	sysctl_createv(clog, 0, NULL, NULL,
    133        1.1      elad 		       CTLFLAG_PERMANENT,
    134        1.1      elad 		       CTLTYPE_NODE, "kern", NULL,
    135        1.1      elad 		       NULL, 0, NULL, 0,
    136        1.1      elad 		       CTL_KERN, CTL_EOL);
    137        1.1      elad 
    138        1.1      elad 	sysctl_createv(clog, 0, NULL, NULL,
    139        1.1      elad 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
    140        1.1      elad 		       CTLTYPE_INT, "securelevel",
    141        1.1      elad 		       SYSCTL_DESCR("System security level"),
    142        1.1      elad 		       secmodel_securelevel_sysctl, 0, NULL, 0,
    143        1.1      elad 		       CTL_KERN, KERN_SECURELVL, CTL_EOL);
    144        1.1      elad }
    145        1.1      elad 
    146        1.1      elad void
    147       1.14      elad secmodel_securelevel_init(void)
    148       1.14      elad {
    149       1.14      elad #ifdef INSECURE
    150       1.14      elad 	securelevel = -1;
    151       1.14      elad #else
    152       1.14      elad 	securelevel = 0;
    153       1.14      elad #endif /* INSECURE */
    154       1.14      elad }
    155       1.14      elad 
    156       1.14      elad void
    157        1.1      elad secmodel_securelevel_start(void)
    158        1.1      elad {
    159        1.1      elad 	l_system = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
    160        1.1      elad 	    secmodel_securelevel_system_cb, NULL);
    161        1.1      elad 	l_process = kauth_listen_scope(KAUTH_SCOPE_PROCESS,
    162        1.1      elad 	    secmodel_securelevel_process_cb, NULL);
    163        1.1      elad 	l_network = kauth_listen_scope(KAUTH_SCOPE_NETWORK,
    164        1.1      elad 	    secmodel_securelevel_network_cb, NULL);
    165        1.1      elad 	l_machdep = kauth_listen_scope(KAUTH_SCOPE_MACHDEP,
    166        1.1      elad 	    secmodel_securelevel_machdep_cb, NULL);
    167        1.1      elad 	l_device = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
    168        1.1      elad 	    secmodel_securelevel_device_cb, NULL);
    169       1.13      elad 	l_vnode = kauth_listen_scope(KAUTH_SCOPE_VNODE,
    170       1.13      elad 	    secmodel_securelevel_vnode_cb, NULL);
    171        1.1      elad }
    172        1.1      elad 
    173        1.1      elad void
    174        1.1      elad secmodel_securelevel_stop(void)
    175        1.1      elad {
    176        1.1      elad 	kauth_unlisten_scope(l_system);
    177        1.1      elad 	kauth_unlisten_scope(l_process);
    178        1.1      elad 	kauth_unlisten_scope(l_network);
    179        1.1      elad 	kauth_unlisten_scope(l_machdep);
    180        1.1      elad 	kauth_unlisten_scope(l_device);
    181       1.13      elad 	kauth_unlisten_scope(l_vnode);
    182        1.1      elad }
    183       1.14      elad 
    184       1.14      elad static int
    185  1.20.12.1      yamt securelevel_eval(const char *what, void *arg, void *ret)
    186  1.20.12.1      yamt {
    187  1.20.12.1      yamt 	int error = 0;
    188  1.20.12.1      yamt 
    189  1.20.12.1      yamt 	if (strcasecmp(what, "is-securelevel-above") == 0) {
    190  1.20.12.1      yamt 		int level = (int)(uintptr_t)arg;
    191  1.20.12.1      yamt 		bool *bp = ret;
    192  1.20.12.1      yamt 
    193  1.20.12.1      yamt 		*bp = (securelevel > level);
    194  1.20.12.1      yamt 	} else {
    195  1.20.12.1      yamt 		error = ENOENT;
    196  1.20.12.1      yamt 	}
    197  1.20.12.1      yamt 
    198  1.20.12.1      yamt 	return error;
    199  1.20.12.1      yamt }
    200  1.20.12.1      yamt 
    201  1.20.12.1      yamt static int
    202       1.14      elad securelevel_modcmd(modcmd_t cmd, void *arg)
    203       1.14      elad {
    204       1.14      elad 	int error = 0;
    205       1.14      elad 
    206       1.14      elad 	switch (cmd) {
    207       1.14      elad 	case MODULE_CMD_INIT:
    208       1.14      elad 		secmodel_securelevel_init();
    209  1.20.12.1      yamt 		error = secmodel_register(&securelevel_sm,
    210  1.20.12.1      yamt 		    SECMODEL_SECURELEVEL_ID, SECMODEL_SECURELEVEL_NAME,
    211  1.20.12.1      yamt 		    NULL, securelevel_eval, NULL);
    212  1.20.12.1      yamt 		if (error != 0)
    213  1.20.12.1      yamt 			printf("securelevel_modcmd::init: secmodel_register "
    214  1.20.12.1      yamt 			    "returned %d\n", error);
    215  1.20.12.1      yamt 
    216       1.14      elad 		secmodel_securelevel_start();
    217       1.14      elad 		sysctl_security_securelevel_setup(&securelevel_sysctl_log);
    218       1.14      elad 		break;
    219       1.14      elad 
    220       1.14      elad 	case MODULE_CMD_FINI:
    221       1.14      elad 		sysctl_teardown(&securelevel_sysctl_log);
    222       1.14      elad 		secmodel_securelevel_stop();
    223  1.20.12.1      yamt 
    224  1.20.12.1      yamt 		error = secmodel_deregister(securelevel_sm);
    225  1.20.12.1      yamt 		if (error != 0)
    226  1.20.12.1      yamt 			printf("securelevel_modcmd::fini: secmodel_deregister "
    227  1.20.12.1      yamt 			    "returned %d\n", error);
    228  1.20.12.1      yamt 
    229       1.14      elad 		break;
    230       1.14      elad 
    231       1.14      elad 	case MODULE_CMD_AUTOUNLOAD:
    232       1.14      elad 		error = EPERM;
    233       1.14      elad 		break;
    234       1.14      elad 
    235       1.14      elad 	default:
    236       1.14      elad 		error = ENOTTY;
    237       1.14      elad 		break;
    238       1.14      elad 	}
    239       1.14      elad 
    240       1.14      elad 	return (error);
    241       1.14      elad }
    242        1.1      elad 
    243        1.1      elad /*
    244        1.1      elad  * kauth(9) listener
    245        1.1      elad  *
    246        1.1      elad  * Security model: Traditional NetBSD
    247        1.1      elad  * Scope: System
    248        1.1      elad  * Responsibility: Securelevel
    249        1.1      elad  */
    250        1.1      elad int
    251       1.18      elad secmodel_securelevel_system_cb(kauth_cred_t cred, kauth_action_t action,
    252       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    253        1.1      elad {
    254        1.1      elad 	int result;
    255        1.1      elad 	enum kauth_system_req req;
    256        1.1      elad 
    257        1.2      elad 	result = KAUTH_RESULT_DEFER;
    258        1.1      elad 	req = (enum kauth_system_req)arg0;
    259        1.1      elad 
    260        1.1      elad 	switch (action) {
    261        1.1      elad 	case KAUTH_SYSTEM_CHSYSFLAGS:
    262  1.20.12.1      yamt 		/* Deprecated. */
    263        1.2      elad 		if (securelevel > 0)
    264        1.2      elad 			result = KAUTH_RESULT_DENY;
    265        1.1      elad 		break;
    266        1.1      elad 
    267        1.1      elad 	case KAUTH_SYSTEM_TIME:
    268        1.1      elad 		switch (req) {
    269        1.1      elad 		case KAUTH_REQ_SYSTEM_TIME_RTCOFFSET:
    270        1.2      elad 			if (securelevel > 0)
    271        1.2      elad 				result = KAUTH_RESULT_DENY;
    272        1.1      elad 			break;
    273        1.1      elad 
    274        1.3      elad 		case KAUTH_REQ_SYSTEM_TIME_SYSTEM: {
    275        1.3      elad 			struct timespec *ts = arg1;
    276       1.10  christos 			struct timespec *delta = arg2;
    277        1.3      elad 
    278       1.16      elad 			if (securelevel > 1 && time_wraps(ts, delta))
    279        1.3      elad 				result = KAUTH_RESULT_DENY;
    280       1.16      elad 
    281        1.3      elad 			break;
    282        1.3      elad 		}
    283        1.3      elad 
    284        1.1      elad 		default:
    285        1.1      elad 			break;
    286        1.1      elad 		}
    287        1.1      elad 		break;
    288        1.1      elad 
    289  1.20.12.1      yamt 	case KAUTH_SYSTEM_MAP_VA_ZERO:
    290  1.20.12.1      yamt 		if (securelevel > 0)
    291  1.20.12.1      yamt 			result = KAUTH_RESULT_DENY;
    292  1.20.12.1      yamt 		break;
    293  1.20.12.1      yamt 
    294        1.7        ad 	case KAUTH_SYSTEM_MODULE:
    295        1.2      elad 		if (securelevel > 0)
    296        1.2      elad 			result = KAUTH_RESULT_DENY;
    297        1.1      elad 		break;
    298        1.1      elad 
    299        1.1      elad 	case KAUTH_SYSTEM_MOUNT:
    300        1.1      elad 		switch (req) {
    301        1.1      elad 		case KAUTH_REQ_SYSTEM_MOUNT_NEW:
    302        1.1      elad 			if (securelevel > 1)
    303        1.2      elad 				result = KAUTH_RESULT_DENY;
    304        1.1      elad 
    305        1.1      elad 			break;
    306        1.1      elad 
    307        1.1      elad 		case KAUTH_REQ_SYSTEM_MOUNT_UPDATE:
    308        1.1      elad 			if (securelevel > 1) {
    309        1.1      elad 				struct mount *mp = arg1;
    310        1.1      elad 				u_long flags = (u_long)arg2;
    311        1.1      elad 
    312        1.1      elad 				/* Can only degrade from read/write to read-only. */
    313        1.1      elad 				if (flags != (mp->mnt_flag | MNT_RDONLY | MNT_RELOAD |
    314        1.1      elad 				    MNT_FORCE | MNT_UPDATE))
    315        1.2      elad 					result = KAUTH_RESULT_DENY;
    316        1.1      elad 			}
    317        1.1      elad 
    318        1.1      elad 			break;
    319        1.1      elad 
    320        1.1      elad 		default:
    321        1.1      elad 			break;
    322        1.1      elad 		}
    323        1.1      elad 
    324        1.1      elad 		break;
    325        1.1      elad 
    326        1.1      elad 	case KAUTH_SYSTEM_SYSCTL:
    327        1.1      elad 		switch (req) {
    328        1.1      elad 		case KAUTH_REQ_SYSTEM_SYSCTL_ADD:
    329        1.1      elad 		case KAUTH_REQ_SYSTEM_SYSCTL_DELETE:
    330        1.1      elad 		case KAUTH_REQ_SYSTEM_SYSCTL_DESC:
    331        1.2      elad 			if (securelevel > 0)
    332        1.2      elad 				result = KAUTH_RESULT_DENY;
    333        1.1      elad 			break;
    334        1.1      elad 
    335        1.1      elad 		default:
    336        1.1      elad 			break;
    337        1.1      elad 		}
    338        1.1      elad 		break;
    339        1.1      elad 
    340        1.1      elad 	case KAUTH_SYSTEM_SETIDCORE:
    341        1.2      elad 		if (securelevel > 0)
    342        1.2      elad 			result = KAUTH_RESULT_DENY;
    343        1.1      elad 		break;
    344        1.1      elad 
    345        1.1      elad 	case KAUTH_SYSTEM_DEBUG:
    346        1.1      elad 		switch (req) {
    347        1.1      elad 		case KAUTH_REQ_SYSTEM_DEBUG_IPKDB:
    348        1.2      elad 			if (securelevel > 0)
    349        1.2      elad 				result = KAUTH_RESULT_DENY;
    350        1.1      elad 			break;
    351        1.1      elad 
    352        1.1      elad 		default:
    353        1.1      elad 			break;
    354        1.1      elad 		}
    355        1.1      elad 		break;
    356       1.11      elad 
    357       1.11      elad 	default:
    358       1.11      elad 		break;
    359        1.1      elad 	}
    360        1.1      elad 
    361        1.1      elad 	return (result);
    362        1.1      elad }
    363        1.1      elad 
    364        1.1      elad /*
    365        1.1      elad  * kauth(9) listener
    366        1.1      elad  *
    367        1.1      elad  * Security model: Traditional NetBSD
    368        1.1      elad  * Scope: Process
    369        1.1      elad  * Responsibility: Securelevel
    370        1.1      elad  */
    371        1.1      elad int
    372       1.18      elad secmodel_securelevel_process_cb(kauth_cred_t cred, kauth_action_t action,
    373       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    374        1.1      elad {
    375        1.1      elad 	struct proc *p;
    376        1.1      elad 	int result;
    377        1.1      elad 
    378        1.2      elad 	result = KAUTH_RESULT_DEFER;
    379        1.1      elad 	p = arg0;
    380        1.1      elad 
    381        1.1      elad 	switch (action) {
    382        1.8      elad 	case KAUTH_PROCESS_PROCFS: {
    383        1.1      elad 		enum kauth_process_req req;
    384        1.1      elad 
    385        1.1      elad 		req = (enum kauth_process_req)arg2;
    386        1.1      elad 		switch (req) {
    387        1.8      elad 		case KAUTH_REQ_PROCESS_PROCFS_READ:
    388        1.1      elad 			break;
    389        1.1      elad 
    390        1.8      elad 		case KAUTH_REQ_PROCESS_PROCFS_RW:
    391        1.8      elad 		case KAUTH_REQ_PROCESS_PROCFS_WRITE:
    392        1.1      elad 			if ((p == initproc) && (securelevel > -1))
    393        1.1      elad 				result = KAUTH_RESULT_DENY;
    394        1.1      elad 
    395        1.1      elad 			break;
    396        1.2      elad 
    397        1.1      elad 		default:
    398        1.1      elad 			break;
    399        1.1      elad 		}
    400        1.1      elad 
    401        1.1      elad 		break;
    402        1.1      elad 		}
    403        1.1      elad 
    404        1.8      elad 	case KAUTH_PROCESS_PTRACE:
    405       1.19      elad 		if ((p == initproc) && (securelevel > -1))
    406        1.1      elad 			result = KAUTH_RESULT_DENY;
    407        1.1      elad 
    408        1.1      elad 		break;
    409        1.1      elad 
    410        1.1      elad 	case KAUTH_PROCESS_CORENAME:
    411        1.2      elad 		if (securelevel > 1)
    412        1.2      elad 			result = KAUTH_RESULT_DENY;
    413        1.1      elad 		break;
    414       1.11      elad 
    415       1.11      elad 	default:
    416       1.11      elad 		break;
    417        1.1      elad 	}
    418        1.1      elad 
    419        1.1      elad 	return (result);
    420        1.1      elad }
    421        1.1      elad 
    422        1.1      elad /*
    423        1.1      elad  * kauth(9) listener
    424        1.1      elad  *
    425        1.1      elad  * Security model: Traditional NetBSD
    426        1.1      elad  * Scope: Network
    427        1.1      elad  * Responsibility: Securelevel
    428        1.1      elad  */
    429        1.1      elad int
    430       1.18      elad secmodel_securelevel_network_cb(kauth_cred_t cred, kauth_action_t action,
    431       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    432        1.1      elad {
    433        1.1      elad 	int result;
    434        1.1      elad 	enum kauth_network_req req;
    435        1.1      elad 
    436        1.2      elad 	result = KAUTH_RESULT_DEFER;
    437        1.1      elad 	req = (enum kauth_network_req)arg0;
    438        1.1      elad 
    439        1.1      elad 	switch (action) {
    440        1.1      elad 	case KAUTH_NETWORK_FIREWALL:
    441        1.1      elad 		switch (req) {
    442        1.1      elad 		case KAUTH_REQ_NETWORK_FIREWALL_FW:
    443        1.1      elad 		case KAUTH_REQ_NETWORK_FIREWALL_NAT:
    444        1.2      elad 			if (securelevel > 1)
    445        1.2      elad 				result = KAUTH_RESULT_DENY;
    446        1.1      elad 			break;
    447        1.1      elad 
    448        1.1      elad 		default:
    449        1.1      elad 			break;
    450        1.1      elad 		}
    451        1.1      elad 		break;
    452        1.1      elad 
    453        1.1      elad 	case KAUTH_NETWORK_FORWSRCRT:
    454        1.2      elad 		if (securelevel > 0)
    455        1.2      elad 			result = KAUTH_RESULT_DENY;
    456        1.1      elad 		break;
    457       1.11      elad 
    458       1.11      elad 	default:
    459       1.11      elad 		break;
    460        1.1      elad 	}
    461        1.1      elad 
    462        1.1      elad 	return (result);
    463        1.1      elad }
    464        1.1      elad 
    465  1.20.12.1      yamt /*
    466        1.1      elad  * kauth(9) listener
    467        1.1      elad  *
    468        1.1      elad  * Security model: Traditional NetBSD
    469        1.1      elad  * Scope: Machdep
    470        1.1      elad  * Responsibility: Securelevel
    471        1.1      elad  */
    472        1.1      elad int
    473       1.18      elad secmodel_securelevel_machdep_cb(kauth_cred_t cred, kauth_action_t action,
    474       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    475        1.1      elad {
    476  1.20.12.2      yamt 	int result;
    477        1.1      elad 
    478  1.20.12.2      yamt 	result = KAUTH_RESULT_DEFER;
    479        1.1      elad 
    480  1.20.12.2      yamt 	switch (action) {
    481        1.1      elad 	case KAUTH_MACHDEP_IOPERM_SET:
    482        1.1      elad 	case KAUTH_MACHDEP_IOPL:
    483        1.2      elad 		if (securelevel > 0)
    484        1.2      elad 			result = KAUTH_RESULT_DENY;
    485        1.1      elad 		break;
    486        1.1      elad 
    487        1.1      elad 	case KAUTH_MACHDEP_UNMANAGEDMEM:
    488        1.2      elad 		if (securelevel > 0)
    489        1.2      elad 			result = KAUTH_RESULT_DENY;
    490        1.1      elad 		break;
    491       1.11      elad 
    492  1.20.12.1      yamt 	case KAUTH_MACHDEP_CPU_UCODE_APPLY:
    493  1.20.12.1      yamt 		if (securelevel > 1)
    494  1.20.12.1      yamt 			result = KAUTH_RESULT_DENY;
    495  1.20.12.1      yamt 		break;
    496  1.20.12.1      yamt 
    497       1.11      elad 	default:
    498       1.11      elad 		break;
    499        1.1      elad 	}
    500        1.1      elad 
    501        1.1      elad 	return (result);
    502        1.1      elad }
    503        1.1      elad 
    504        1.1      elad /*
    505        1.1      elad  * kauth(9) listener
    506        1.1      elad  *
    507        1.1      elad  * Security model: Traditional NetBSD
    508  1.20.12.1      yamt  * Scope: Device
    509        1.1      elad  * Responsibility: Securelevel
    510        1.1      elad  */
    511        1.1      elad int
    512       1.18      elad secmodel_securelevel_device_cb(kauth_cred_t cred, kauth_action_t action,
    513       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    514        1.1      elad {
    515        1.1      elad 	int result;
    516        1.1      elad 
    517        1.2      elad 	result = KAUTH_RESULT_DEFER;
    518        1.1      elad 
    519        1.1      elad 	switch (action) {
    520        1.1      elad 	case KAUTH_DEVICE_RAWIO_SPEC: {
    521       1.17      elad 		struct vnode *vp;
    522        1.1      elad 		enum kauth_device_req req;
    523        1.1      elad 
    524        1.1      elad 		req = (enum kauth_device_req)arg0;
    525        1.1      elad 		vp = arg1;
    526        1.1      elad 
    527        1.1      elad 		KASSERT(vp != NULL);
    528        1.1      elad 
    529        1.1      elad 		/* Handle /dev/mem and /dev/kmem. */
    530       1.17      elad 		if (iskmemvp(vp)) {
    531        1.1      elad 			switch (req) {
    532        1.1      elad 			case KAUTH_REQ_DEVICE_RAWIO_SPEC_READ:
    533        1.1      elad 				break;
    534        1.1      elad 
    535        1.1      elad 			case KAUTH_REQ_DEVICE_RAWIO_SPEC_WRITE:
    536        1.1      elad 			case KAUTH_REQ_DEVICE_RAWIO_SPEC_RW:
    537        1.2      elad 				if (securelevel > 0)
    538        1.2      elad 					result = KAUTH_RESULT_DENY;
    539       1.17      elad 
    540        1.1      elad 				break;
    541       1.11      elad 
    542       1.11      elad 			default:
    543       1.11      elad 				break;
    544        1.1      elad 			}
    545        1.1      elad 
    546        1.1      elad 			break;
    547        1.1      elad 		}
    548        1.1      elad 
    549        1.1      elad 		switch (req) {
    550        1.1      elad 		case KAUTH_REQ_DEVICE_RAWIO_SPEC_READ:
    551        1.1      elad 			break;
    552        1.1      elad 
    553        1.1      elad 		case KAUTH_REQ_DEVICE_RAWIO_SPEC_WRITE:
    554       1.17      elad 		case KAUTH_REQ_DEVICE_RAWIO_SPEC_RW: {
    555       1.17      elad 			int error;
    556        1.1      elad 
    557       1.17      elad 			error = rawdev_mounted(vp, NULL);
    558        1.1      elad 
    559       1.17      elad 			/* Not a disk. */
    560       1.17      elad 			if (error == EINVAL)
    561        1.1      elad 				break;
    562        1.2      elad 
    563       1.17      elad 			if (error && securelevel > 0)
    564       1.17      elad 				result = KAUTH_RESULT_DENY;
    565        1.1      elad 
    566        1.2      elad 			if (securelevel > 1)
    567        1.2      elad 				result = KAUTH_RESULT_DENY;
    568        1.1      elad 
    569        1.1      elad 			break;
    570       1.17      elad 			}
    571       1.11      elad 
    572       1.11      elad 		default:
    573       1.11      elad 			break;
    574        1.1      elad 		}
    575        1.1      elad 
    576        1.1      elad 		break;
    577        1.1      elad 		}
    578        1.1      elad 
    579        1.2      elad 	case KAUTH_DEVICE_RAWIO_PASSTHRU:
    580        1.1      elad 		if (securelevel > 0) {
    581        1.1      elad 			u_long bits;
    582        1.1      elad 
    583        1.1      elad 			bits = (u_long)arg0;
    584        1.1      elad 
    585        1.1      elad 			KASSERT(bits != 0);
    586        1.1      elad 			KASSERT((bits & ~KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_ALL) == 0);
    587        1.1      elad 
    588        1.1      elad 			if (bits & ~KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_READCONF)
    589        1.1      elad 				result = KAUTH_RESULT_DENY;
    590        1.1      elad 		}
    591        1.1      elad 
    592        1.1      elad 		break;
    593       1.11      elad 
    594       1.12   mbalmer 	case KAUTH_DEVICE_GPIO_PINSET:
    595       1.12   mbalmer 		if (securelevel > 0)
    596       1.12   mbalmer 			result = KAUTH_RESULT_DENY;
    597       1.12   mbalmer 		break;
    598       1.12   mbalmer 
    599  1.20.12.1      yamt 	case KAUTH_DEVICE_RND_ADDDATA_ESTIMATE:
    600  1.20.12.1      yamt 		if (securelevel > 0)
    601  1.20.12.1      yamt 			result = KAUTH_RESULT_DENY;
    602  1.20.12.1      yamt 		break;
    603  1.20.12.1      yamt 
    604       1.11      elad 	default:
    605       1.11      elad 		break;
    606        1.1      elad 	}
    607        1.1      elad 
    608        1.1      elad 	return (result);
    609        1.1      elad }
    610       1.13      elad 
    611       1.13      elad int
    612       1.13      elad secmodel_securelevel_vnode_cb(kauth_cred_t cred, kauth_action_t action,
    613       1.13      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    614       1.13      elad {
    615       1.13      elad 	int result;
    616       1.13      elad 
    617       1.13      elad 	result = KAUTH_RESULT_DEFER;
    618       1.13      elad 
    619       1.13      elad 	if ((action & KAUTH_VNODE_WRITE_SYSFLAGS) &&
    620       1.13      elad 	    (action & KAUTH_VNODE_HAS_SYSFLAGS)) {
    621       1.13      elad 		if (securelevel > 0)
    622       1.13      elad 			result = KAUTH_RESULT_DENY;
    623       1.13      elad 	}
    624       1.13      elad 
    625       1.13      elad 	return (result);
    626       1.13      elad }
    627       1.13      elad 
    628