Home | History | Annotate | Line # | Download | only in securelevel
secmodel_securelevel.c revision 1.20.12.3
      1  1.20.12.3      yamt /* $NetBSD: secmodel_securelevel.c,v 1.20.12.3 2014/05/22 11:41:17 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.3      yamt __KERNEL_RCSID(0, "$NetBSD: secmodel_securelevel.c,v 1.20.12.3 2014/05/22 11:41:17 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.20.12.3      yamt 	const struct sysctlnode *rnode, *rnode2;
     99       1.14      elad 
    100       1.14      elad 	sysctl_createv(clog, 0, NULL, &rnode,
    101       1.14      elad 		       CTLFLAG_PERMANENT,
    102  1.20.12.3      yamt 		       CTLTYPE_NODE, "models", NULL,
    103       1.14      elad 		       NULL, 0, NULL, 0,
    104  1.20.12.3      yamt 		       CTL_SECURITY, CTL_CREATE, CTL_EOL);
    105       1.14      elad 
    106  1.20.12.3      yamt 	/* Compatibility: security.models.bsd44 */
    107  1.20.12.3      yamt 	rnode2 = rnode;
    108  1.20.12.3      yamt 	sysctl_createv(clog, 0, &rnode2, &rnode2,
    109       1.14      elad 		       CTLFLAG_PERMANENT,
    110  1.20.12.3      yamt 		       CTLTYPE_NODE, "bsd44", NULL,
    111       1.14      elad 		       NULL, 0, NULL, 0,
    112       1.14      elad 		       CTL_CREATE, CTL_EOL);
    113       1.14      elad 
    114  1.20.12.3      yamt         /* Compatibility: security.models.bsd44.securelevel */
    115  1.20.12.3      yamt 	sysctl_createv(clog, 0, &rnode2, NULL,
    116  1.20.12.3      yamt 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
    117  1.20.12.3      yamt 		       CTLTYPE_INT, "securelevel",
    118  1.20.12.3      yamt 		       SYSCTL_DESCR("System security level"),
    119  1.20.12.3      yamt 		       secmodel_securelevel_sysctl, 0, NULL, 0,
    120  1.20.12.3      yamt 		       CTL_CREATE, CTL_EOL);
    121  1.20.12.3      yamt 
    122       1.14      elad 	sysctl_createv(clog, 0, &rnode, &rnode,
    123       1.14      elad 		       CTLFLAG_PERMANENT,
    124       1.14      elad 		       CTLTYPE_NODE, "securelevel", NULL,
    125       1.14      elad 		       NULL, 0, NULL, 0,
    126       1.14      elad 		       CTL_CREATE, CTL_EOL);
    127       1.14      elad 
    128       1.14      elad 	sysctl_createv(clog, 0, &rnode, NULL,
    129       1.14      elad 		       CTLFLAG_PERMANENT,
    130       1.14      elad 		       CTLTYPE_STRING, "name", NULL,
    131  1.20.12.1      yamt 		       NULL, 0, __UNCONST(SECMODEL_SECURELEVEL_NAME), 0,
    132       1.14      elad 		       CTL_CREATE, CTL_EOL);
    133        1.1      elad 
    134       1.15      elad 	sysctl_createv(clog, 0, &rnode, NULL,
    135       1.15      elad 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
    136       1.15      elad 		       CTLTYPE_INT, "securelevel",
    137       1.15      elad 		       SYSCTL_DESCR("System security level"),
    138       1.15      elad 		       secmodel_securelevel_sysctl, 0, NULL, 0,
    139       1.15      elad 		       CTL_CREATE, CTL_EOL);
    140       1.15      elad 
    141       1.14      elad 	/* Compatibility: kern.securelevel */
    142        1.1      elad 
    143        1.1      elad 	sysctl_createv(clog, 0, NULL, NULL,
    144        1.1      elad 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
    145        1.1      elad 		       CTLTYPE_INT, "securelevel",
    146        1.1      elad 		       SYSCTL_DESCR("System security level"),
    147        1.1      elad 		       secmodel_securelevel_sysctl, 0, NULL, 0,
    148        1.1      elad 		       CTL_KERN, KERN_SECURELVL, CTL_EOL);
    149        1.1      elad }
    150        1.1      elad 
    151        1.1      elad void
    152       1.14      elad secmodel_securelevel_init(void)
    153       1.14      elad {
    154       1.14      elad #ifdef INSECURE
    155       1.14      elad 	securelevel = -1;
    156       1.14      elad #else
    157       1.14      elad 	securelevel = 0;
    158       1.14      elad #endif /* INSECURE */
    159       1.14      elad }
    160       1.14      elad 
    161       1.14      elad void
    162        1.1      elad secmodel_securelevel_start(void)
    163        1.1      elad {
    164        1.1      elad 	l_system = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
    165        1.1      elad 	    secmodel_securelevel_system_cb, NULL);
    166        1.1      elad 	l_process = kauth_listen_scope(KAUTH_SCOPE_PROCESS,
    167        1.1      elad 	    secmodel_securelevel_process_cb, NULL);
    168        1.1      elad 	l_network = kauth_listen_scope(KAUTH_SCOPE_NETWORK,
    169        1.1      elad 	    secmodel_securelevel_network_cb, NULL);
    170        1.1      elad 	l_machdep = kauth_listen_scope(KAUTH_SCOPE_MACHDEP,
    171        1.1      elad 	    secmodel_securelevel_machdep_cb, NULL);
    172        1.1      elad 	l_device = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
    173        1.1      elad 	    secmodel_securelevel_device_cb, NULL);
    174       1.13      elad 	l_vnode = kauth_listen_scope(KAUTH_SCOPE_VNODE,
    175       1.13      elad 	    secmodel_securelevel_vnode_cb, NULL);
    176        1.1      elad }
    177        1.1      elad 
    178        1.1      elad void
    179        1.1      elad secmodel_securelevel_stop(void)
    180        1.1      elad {
    181        1.1      elad 	kauth_unlisten_scope(l_system);
    182        1.1      elad 	kauth_unlisten_scope(l_process);
    183        1.1      elad 	kauth_unlisten_scope(l_network);
    184        1.1      elad 	kauth_unlisten_scope(l_machdep);
    185        1.1      elad 	kauth_unlisten_scope(l_device);
    186       1.13      elad 	kauth_unlisten_scope(l_vnode);
    187        1.1      elad }
    188       1.14      elad 
    189       1.14      elad static int
    190  1.20.12.1      yamt securelevel_eval(const char *what, void *arg, void *ret)
    191  1.20.12.1      yamt {
    192  1.20.12.1      yamt 	int error = 0;
    193  1.20.12.1      yamt 
    194  1.20.12.1      yamt 	if (strcasecmp(what, "is-securelevel-above") == 0) {
    195  1.20.12.1      yamt 		int level = (int)(uintptr_t)arg;
    196  1.20.12.1      yamt 		bool *bp = ret;
    197  1.20.12.1      yamt 
    198  1.20.12.1      yamt 		*bp = (securelevel > level);
    199  1.20.12.1      yamt 	} else {
    200  1.20.12.1      yamt 		error = ENOENT;
    201  1.20.12.1      yamt 	}
    202  1.20.12.1      yamt 
    203  1.20.12.1      yamt 	return error;
    204  1.20.12.1      yamt }
    205  1.20.12.1      yamt 
    206  1.20.12.1      yamt static int
    207       1.14      elad securelevel_modcmd(modcmd_t cmd, void *arg)
    208       1.14      elad {
    209       1.14      elad 	int error = 0;
    210       1.14      elad 
    211       1.14      elad 	switch (cmd) {
    212       1.14      elad 	case MODULE_CMD_INIT:
    213       1.14      elad 		secmodel_securelevel_init();
    214  1.20.12.1      yamt 		error = secmodel_register(&securelevel_sm,
    215  1.20.12.1      yamt 		    SECMODEL_SECURELEVEL_ID, SECMODEL_SECURELEVEL_NAME,
    216  1.20.12.1      yamt 		    NULL, securelevel_eval, NULL);
    217  1.20.12.1      yamt 		if (error != 0)
    218  1.20.12.1      yamt 			printf("securelevel_modcmd::init: secmodel_register "
    219  1.20.12.1      yamt 			    "returned %d\n", error);
    220  1.20.12.1      yamt 
    221       1.14      elad 		secmodel_securelevel_start();
    222       1.14      elad 		sysctl_security_securelevel_setup(&securelevel_sysctl_log);
    223       1.14      elad 		break;
    224       1.14      elad 
    225       1.14      elad 	case MODULE_CMD_FINI:
    226       1.14      elad 		sysctl_teardown(&securelevel_sysctl_log);
    227       1.14      elad 		secmodel_securelevel_stop();
    228  1.20.12.1      yamt 
    229  1.20.12.1      yamt 		error = secmodel_deregister(securelevel_sm);
    230  1.20.12.1      yamt 		if (error != 0)
    231  1.20.12.1      yamt 			printf("securelevel_modcmd::fini: secmodel_deregister "
    232  1.20.12.1      yamt 			    "returned %d\n", error);
    233  1.20.12.1      yamt 
    234       1.14      elad 		break;
    235       1.14      elad 
    236       1.14      elad 	case MODULE_CMD_AUTOUNLOAD:
    237       1.14      elad 		error = EPERM;
    238       1.14      elad 		break;
    239       1.14      elad 
    240       1.14      elad 	default:
    241       1.14      elad 		error = ENOTTY;
    242       1.14      elad 		break;
    243       1.14      elad 	}
    244       1.14      elad 
    245       1.14      elad 	return (error);
    246       1.14      elad }
    247        1.1      elad 
    248        1.1      elad /*
    249        1.1      elad  * kauth(9) listener
    250        1.1      elad  *
    251        1.1      elad  * Security model: Traditional NetBSD
    252        1.1      elad  * Scope: System
    253        1.1      elad  * Responsibility: Securelevel
    254        1.1      elad  */
    255        1.1      elad int
    256       1.18      elad secmodel_securelevel_system_cb(kauth_cred_t cred, kauth_action_t action,
    257       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    258        1.1      elad {
    259        1.1      elad 	int result;
    260        1.1      elad 	enum kauth_system_req req;
    261        1.1      elad 
    262        1.2      elad 	result = KAUTH_RESULT_DEFER;
    263        1.1      elad 	req = (enum kauth_system_req)arg0;
    264        1.1      elad 
    265        1.1      elad 	switch (action) {
    266        1.1      elad 	case KAUTH_SYSTEM_CHSYSFLAGS:
    267  1.20.12.1      yamt 		/* Deprecated. */
    268        1.2      elad 		if (securelevel > 0)
    269        1.2      elad 			result = KAUTH_RESULT_DENY;
    270        1.1      elad 		break;
    271        1.1      elad 
    272        1.1      elad 	case KAUTH_SYSTEM_TIME:
    273        1.1      elad 		switch (req) {
    274        1.1      elad 		case KAUTH_REQ_SYSTEM_TIME_RTCOFFSET:
    275        1.2      elad 			if (securelevel > 0)
    276        1.2      elad 				result = KAUTH_RESULT_DENY;
    277        1.1      elad 			break;
    278        1.1      elad 
    279        1.3      elad 		case KAUTH_REQ_SYSTEM_TIME_SYSTEM: {
    280        1.3      elad 			struct timespec *ts = arg1;
    281       1.10  christos 			struct timespec *delta = arg2;
    282        1.3      elad 
    283       1.16      elad 			if (securelevel > 1 && time_wraps(ts, delta))
    284        1.3      elad 				result = KAUTH_RESULT_DENY;
    285       1.16      elad 
    286        1.3      elad 			break;
    287        1.3      elad 		}
    288        1.3      elad 
    289        1.1      elad 		default:
    290        1.1      elad 			break;
    291        1.1      elad 		}
    292        1.1      elad 		break;
    293        1.1      elad 
    294  1.20.12.1      yamt 	case KAUTH_SYSTEM_MAP_VA_ZERO:
    295  1.20.12.1      yamt 		if (securelevel > 0)
    296  1.20.12.1      yamt 			result = KAUTH_RESULT_DENY;
    297  1.20.12.1      yamt 		break;
    298  1.20.12.1      yamt 
    299        1.7        ad 	case KAUTH_SYSTEM_MODULE:
    300        1.2      elad 		if (securelevel > 0)
    301        1.2      elad 			result = KAUTH_RESULT_DENY;
    302        1.1      elad 		break;
    303        1.1      elad 
    304        1.1      elad 	case KAUTH_SYSTEM_MOUNT:
    305        1.1      elad 		switch (req) {
    306        1.1      elad 		case KAUTH_REQ_SYSTEM_MOUNT_NEW:
    307        1.1      elad 			if (securelevel > 1)
    308        1.2      elad 				result = KAUTH_RESULT_DENY;
    309        1.1      elad 
    310        1.1      elad 			break;
    311        1.1      elad 
    312        1.1      elad 		case KAUTH_REQ_SYSTEM_MOUNT_UPDATE:
    313        1.1      elad 			if (securelevel > 1) {
    314        1.1      elad 				struct mount *mp = arg1;
    315        1.1      elad 				u_long flags = (u_long)arg2;
    316        1.1      elad 
    317        1.1      elad 				/* Can only degrade from read/write to read-only. */
    318        1.1      elad 				if (flags != (mp->mnt_flag | MNT_RDONLY | MNT_RELOAD |
    319        1.1      elad 				    MNT_FORCE | MNT_UPDATE))
    320        1.2      elad 					result = KAUTH_RESULT_DENY;
    321        1.1      elad 			}
    322        1.1      elad 
    323        1.1      elad 			break;
    324        1.1      elad 
    325        1.1      elad 		default:
    326        1.1      elad 			break;
    327        1.1      elad 		}
    328        1.1      elad 
    329        1.1      elad 		break;
    330        1.1      elad 
    331        1.1      elad 	case KAUTH_SYSTEM_SYSCTL:
    332        1.1      elad 		switch (req) {
    333        1.1      elad 		case KAUTH_REQ_SYSTEM_SYSCTL_ADD:
    334        1.1      elad 		case KAUTH_REQ_SYSTEM_SYSCTL_DELETE:
    335        1.1      elad 		case KAUTH_REQ_SYSTEM_SYSCTL_DESC:
    336        1.2      elad 			if (securelevel > 0)
    337        1.2      elad 				result = KAUTH_RESULT_DENY;
    338        1.1      elad 			break;
    339        1.1      elad 
    340        1.1      elad 		default:
    341        1.1      elad 			break;
    342        1.1      elad 		}
    343        1.1      elad 		break;
    344        1.1      elad 
    345        1.1      elad 	case KAUTH_SYSTEM_SETIDCORE:
    346        1.2      elad 		if (securelevel > 0)
    347        1.2      elad 			result = KAUTH_RESULT_DENY;
    348        1.1      elad 		break;
    349        1.1      elad 
    350        1.1      elad 	case KAUTH_SYSTEM_DEBUG:
    351        1.1      elad 		switch (req) {
    352        1.1      elad 		case KAUTH_REQ_SYSTEM_DEBUG_IPKDB:
    353        1.2      elad 			if (securelevel > 0)
    354        1.2      elad 				result = KAUTH_RESULT_DENY;
    355        1.1      elad 			break;
    356        1.1      elad 
    357        1.1      elad 		default:
    358        1.1      elad 			break;
    359        1.1      elad 		}
    360        1.1      elad 		break;
    361       1.11      elad 
    362       1.11      elad 	default:
    363       1.11      elad 		break;
    364        1.1      elad 	}
    365        1.1      elad 
    366        1.1      elad 	return (result);
    367        1.1      elad }
    368        1.1      elad 
    369        1.1      elad /*
    370        1.1      elad  * kauth(9) listener
    371        1.1      elad  *
    372        1.1      elad  * Security model: Traditional NetBSD
    373        1.1      elad  * Scope: Process
    374        1.1      elad  * Responsibility: Securelevel
    375        1.1      elad  */
    376        1.1      elad int
    377       1.18      elad secmodel_securelevel_process_cb(kauth_cred_t cred, kauth_action_t action,
    378       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    379        1.1      elad {
    380        1.1      elad 	struct proc *p;
    381        1.1      elad 	int result;
    382        1.1      elad 
    383        1.2      elad 	result = KAUTH_RESULT_DEFER;
    384        1.1      elad 	p = arg0;
    385        1.1      elad 
    386        1.1      elad 	switch (action) {
    387        1.8      elad 	case KAUTH_PROCESS_PROCFS: {
    388        1.1      elad 		enum kauth_process_req req;
    389        1.1      elad 
    390        1.1      elad 		req = (enum kauth_process_req)arg2;
    391        1.1      elad 		switch (req) {
    392        1.8      elad 		case KAUTH_REQ_PROCESS_PROCFS_READ:
    393        1.1      elad 			break;
    394        1.1      elad 
    395        1.8      elad 		case KAUTH_REQ_PROCESS_PROCFS_RW:
    396        1.8      elad 		case KAUTH_REQ_PROCESS_PROCFS_WRITE:
    397        1.1      elad 			if ((p == initproc) && (securelevel > -1))
    398        1.1      elad 				result = KAUTH_RESULT_DENY;
    399        1.1      elad 
    400        1.1      elad 			break;
    401        1.2      elad 
    402        1.1      elad 		default:
    403        1.1      elad 			break;
    404        1.1      elad 		}
    405        1.1      elad 
    406        1.1      elad 		break;
    407        1.1      elad 		}
    408        1.1      elad 
    409        1.8      elad 	case KAUTH_PROCESS_PTRACE:
    410       1.19      elad 		if ((p == initproc) && (securelevel > -1))
    411        1.1      elad 			result = KAUTH_RESULT_DENY;
    412        1.1      elad 
    413        1.1      elad 		break;
    414        1.1      elad 
    415        1.1      elad 	case KAUTH_PROCESS_CORENAME:
    416        1.2      elad 		if (securelevel > 1)
    417        1.2      elad 			result = KAUTH_RESULT_DENY;
    418        1.1      elad 		break;
    419       1.11      elad 
    420       1.11      elad 	default:
    421       1.11      elad 		break;
    422        1.1      elad 	}
    423        1.1      elad 
    424        1.1      elad 	return (result);
    425        1.1      elad }
    426        1.1      elad 
    427        1.1      elad /*
    428        1.1      elad  * kauth(9) listener
    429        1.1      elad  *
    430        1.1      elad  * Security model: Traditional NetBSD
    431        1.1      elad  * Scope: Network
    432        1.1      elad  * Responsibility: Securelevel
    433        1.1      elad  */
    434        1.1      elad int
    435       1.18      elad secmodel_securelevel_network_cb(kauth_cred_t cred, kauth_action_t action,
    436       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    437        1.1      elad {
    438        1.1      elad 	int result;
    439        1.1      elad 	enum kauth_network_req req;
    440        1.1      elad 
    441        1.2      elad 	result = KAUTH_RESULT_DEFER;
    442        1.1      elad 	req = (enum kauth_network_req)arg0;
    443        1.1      elad 
    444        1.1      elad 	switch (action) {
    445        1.1      elad 	case KAUTH_NETWORK_FIREWALL:
    446        1.1      elad 		switch (req) {
    447        1.1      elad 		case KAUTH_REQ_NETWORK_FIREWALL_FW:
    448        1.1      elad 		case KAUTH_REQ_NETWORK_FIREWALL_NAT:
    449        1.2      elad 			if (securelevel > 1)
    450        1.2      elad 				result = KAUTH_RESULT_DENY;
    451        1.1      elad 			break;
    452        1.1      elad 
    453        1.1      elad 		default:
    454        1.1      elad 			break;
    455        1.1      elad 		}
    456        1.1      elad 		break;
    457        1.1      elad 
    458        1.1      elad 	case KAUTH_NETWORK_FORWSRCRT:
    459        1.2      elad 		if (securelevel > 0)
    460        1.2      elad 			result = KAUTH_RESULT_DENY;
    461        1.1      elad 		break;
    462       1.11      elad 
    463       1.11      elad 	default:
    464       1.11      elad 		break;
    465        1.1      elad 	}
    466        1.1      elad 
    467        1.1      elad 	return (result);
    468        1.1      elad }
    469        1.1      elad 
    470  1.20.12.1      yamt /*
    471        1.1      elad  * kauth(9) listener
    472        1.1      elad  *
    473        1.1      elad  * Security model: Traditional NetBSD
    474        1.1      elad  * Scope: Machdep
    475        1.1      elad  * Responsibility: Securelevel
    476        1.1      elad  */
    477        1.1      elad int
    478       1.18      elad secmodel_securelevel_machdep_cb(kauth_cred_t cred, kauth_action_t action,
    479       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    480        1.1      elad {
    481  1.20.12.2      yamt 	int result;
    482        1.1      elad 
    483  1.20.12.2      yamt 	result = KAUTH_RESULT_DEFER;
    484        1.1      elad 
    485  1.20.12.2      yamt 	switch (action) {
    486        1.1      elad 	case KAUTH_MACHDEP_IOPERM_SET:
    487        1.1      elad 	case KAUTH_MACHDEP_IOPL:
    488        1.2      elad 		if (securelevel > 0)
    489        1.2      elad 			result = KAUTH_RESULT_DENY;
    490        1.1      elad 		break;
    491        1.1      elad 
    492        1.1      elad 	case KAUTH_MACHDEP_UNMANAGEDMEM:
    493        1.2      elad 		if (securelevel > 0)
    494        1.2      elad 			result = KAUTH_RESULT_DENY;
    495        1.1      elad 		break;
    496       1.11      elad 
    497  1.20.12.1      yamt 	case KAUTH_MACHDEP_CPU_UCODE_APPLY:
    498  1.20.12.1      yamt 		if (securelevel > 1)
    499  1.20.12.1      yamt 			result = KAUTH_RESULT_DENY;
    500  1.20.12.1      yamt 		break;
    501  1.20.12.1      yamt 
    502       1.11      elad 	default:
    503       1.11      elad 		break;
    504        1.1      elad 	}
    505        1.1      elad 
    506        1.1      elad 	return (result);
    507        1.1      elad }
    508        1.1      elad 
    509        1.1      elad /*
    510        1.1      elad  * kauth(9) listener
    511        1.1      elad  *
    512        1.1      elad  * Security model: Traditional NetBSD
    513  1.20.12.1      yamt  * Scope: Device
    514        1.1      elad  * Responsibility: Securelevel
    515        1.1      elad  */
    516        1.1      elad int
    517       1.18      elad secmodel_securelevel_device_cb(kauth_cred_t cred, kauth_action_t action,
    518       1.18      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    519        1.1      elad {
    520        1.1      elad 	int result;
    521        1.1      elad 
    522        1.2      elad 	result = KAUTH_RESULT_DEFER;
    523        1.1      elad 
    524        1.1      elad 	switch (action) {
    525        1.1      elad 	case KAUTH_DEVICE_RAWIO_SPEC: {
    526       1.17      elad 		struct vnode *vp;
    527        1.1      elad 		enum kauth_device_req req;
    528        1.1      elad 
    529        1.1      elad 		req = (enum kauth_device_req)arg0;
    530        1.1      elad 		vp = arg1;
    531        1.1      elad 
    532        1.1      elad 		KASSERT(vp != NULL);
    533        1.1      elad 
    534        1.1      elad 		/* Handle /dev/mem and /dev/kmem. */
    535       1.17      elad 		if (iskmemvp(vp)) {
    536        1.1      elad 			switch (req) {
    537        1.1      elad 			case KAUTH_REQ_DEVICE_RAWIO_SPEC_READ:
    538        1.1      elad 				break;
    539        1.1      elad 
    540        1.1      elad 			case KAUTH_REQ_DEVICE_RAWIO_SPEC_WRITE:
    541        1.1      elad 			case KAUTH_REQ_DEVICE_RAWIO_SPEC_RW:
    542        1.2      elad 				if (securelevel > 0)
    543        1.2      elad 					result = KAUTH_RESULT_DENY;
    544       1.17      elad 
    545        1.1      elad 				break;
    546       1.11      elad 
    547       1.11      elad 			default:
    548       1.11      elad 				break;
    549        1.1      elad 			}
    550        1.1      elad 
    551        1.1      elad 			break;
    552        1.1      elad 		}
    553        1.1      elad 
    554        1.1      elad 		switch (req) {
    555        1.1      elad 		case KAUTH_REQ_DEVICE_RAWIO_SPEC_READ:
    556        1.1      elad 			break;
    557        1.1      elad 
    558        1.1      elad 		case KAUTH_REQ_DEVICE_RAWIO_SPEC_WRITE:
    559       1.17      elad 		case KAUTH_REQ_DEVICE_RAWIO_SPEC_RW: {
    560       1.17      elad 			int error;
    561        1.1      elad 
    562       1.17      elad 			error = rawdev_mounted(vp, NULL);
    563        1.1      elad 
    564       1.17      elad 			/* Not a disk. */
    565       1.17      elad 			if (error == EINVAL)
    566        1.1      elad 				break;
    567        1.2      elad 
    568       1.17      elad 			if (error && securelevel > 0)
    569       1.17      elad 				result = KAUTH_RESULT_DENY;
    570        1.1      elad 
    571        1.2      elad 			if (securelevel > 1)
    572        1.2      elad 				result = KAUTH_RESULT_DENY;
    573        1.1      elad 
    574        1.1      elad 			break;
    575       1.17      elad 			}
    576       1.11      elad 
    577       1.11      elad 		default:
    578       1.11      elad 			break;
    579        1.1      elad 		}
    580        1.1      elad 
    581        1.1      elad 		break;
    582        1.1      elad 		}
    583        1.1      elad 
    584        1.2      elad 	case KAUTH_DEVICE_RAWIO_PASSTHRU:
    585        1.1      elad 		if (securelevel > 0) {
    586        1.1      elad 			u_long bits;
    587        1.1      elad 
    588        1.1      elad 			bits = (u_long)arg0;
    589        1.1      elad 
    590        1.1      elad 			KASSERT(bits != 0);
    591        1.1      elad 			KASSERT((bits & ~KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_ALL) == 0);
    592        1.1      elad 
    593        1.1      elad 			if (bits & ~KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_READCONF)
    594        1.1      elad 				result = KAUTH_RESULT_DENY;
    595        1.1      elad 		}
    596        1.1      elad 
    597        1.1      elad 		break;
    598       1.11      elad 
    599       1.12   mbalmer 	case KAUTH_DEVICE_GPIO_PINSET:
    600       1.12   mbalmer 		if (securelevel > 0)
    601       1.12   mbalmer 			result = KAUTH_RESULT_DENY;
    602       1.12   mbalmer 		break;
    603       1.12   mbalmer 
    604  1.20.12.1      yamt 	case KAUTH_DEVICE_RND_ADDDATA_ESTIMATE:
    605  1.20.12.1      yamt 		if (securelevel > 0)
    606  1.20.12.1      yamt 			result = KAUTH_RESULT_DENY;
    607  1.20.12.1      yamt 		break;
    608  1.20.12.1      yamt 
    609       1.11      elad 	default:
    610       1.11      elad 		break;
    611        1.1      elad 	}
    612        1.1      elad 
    613        1.1      elad 	return (result);
    614        1.1      elad }
    615       1.13      elad 
    616       1.13      elad int
    617       1.13      elad secmodel_securelevel_vnode_cb(kauth_cred_t cred, kauth_action_t action,
    618       1.13      elad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
    619       1.13      elad {
    620       1.13      elad 	int result;
    621       1.13      elad 
    622       1.13      elad 	result = KAUTH_RESULT_DEFER;
    623       1.13      elad 
    624       1.13      elad 	if ((action & KAUTH_VNODE_WRITE_SYSFLAGS) &&
    625       1.13      elad 	    (action & KAUTH_VNODE_HAS_SYSFLAGS)) {
    626       1.13      elad 		if (securelevel > 0)
    627       1.13      elad 			result = KAUTH_RESULT_DENY;
    628       1.13      elad 	}
    629       1.13      elad 
    630       1.13      elad 	return (result);
    631       1.13      elad }
    632       1.13      elad 
    633