1*f3668868Sjakllsch /* $NetBSD: secmodel_example.c,v 1.29 2023/01/05 17:36:53 jakllsch Exp $ */
26cb705e0Selad 
36cb705e0Selad /*
46cb705e0Selad  * This file is placed in the public domain.
56cb705e0Selad  */
66cb705e0Selad 
76cb705e0Selad /*
86cb705e0Selad  * Skeleton file for building a NetBSD security model from scratch, containing
96cb705e0Selad  * every kauth(9) scope, action, and request, as well as some coding hints.
106cb705e0Selad  *
116cb705e0Selad  * This file will be kept in-sync with the official NetBSD kernel, so *always*
126cb705e0Selad  * use the latest revision.
136cb705e0Selad  */
146cb705e0Selad 
156cb705e0Selad #include <sys/cdefs.h>
16*f3668868Sjakllsch __KERNEL_RCSID(0, "$NetBSD: secmodel_example.c,v 1.29 2023/01/05 17:36:53 jakllsch Exp $");
176cb705e0Selad 
186cb705e0Selad #include <sys/types.h>
196cb705e0Selad #include <sys/param.h>
206cb705e0Selad #include <sys/kauth.h>
216cb705e0Selad 
22202611c6Sjym #include <sys/module.h>
236cb705e0Selad #include <sys/sysctl.h>
246cb705e0Selad 
256cb705e0Selad #include <secmodel/secmodel.h>
266cb705e0Selad #include <secmodel/example/example.h>
276cb705e0Selad 
28202611c6Sjym MODULE(MODULE_CLASS_SECMODEL, secmodel_example, NULL);
29202611c6Sjym 
30202611c6Sjym static secmodel_t example_sm;
31202611c6Sjym static struct sysctllog *sysctl_example_log;
32202611c6Sjym 
33202611c6Sjym static kauth_listener_t l_device, l_generic, l_machdep, l_network,
34202611c6Sjym     l_process, l_system, l_vnode;
35202611c6Sjym 
36202611c6Sjym static void secmodel_example_init(void);
37202611c6Sjym static void secmodel_example_start(void);
38202611c6Sjym static void secmodel_example_stop(void);
39202611c6Sjym 
40202611c6Sjym static void sysctl_security_example_setup(struct sysctllog **);
41202611c6Sjym 
42202611c6Sjym static int secmodel_example_device_cb(kauth_cred_t, kauth_action_t, void *,
43202611c6Sjym     void *, void *, void *, void *);
44202611c6Sjym static int secmodel_example_generic_cb(kauth_cred_t, kauth_action_t, void *,
45202611c6Sjym     void *, void *, void *, void *);
46202611c6Sjym static int secmodel_example_machdep_cb(kauth_cred_t, kauth_action_t, void *,
47202611c6Sjym     void *, void *, void *, void *);
48202611c6Sjym static int secmodel_example_network_cb(kauth_cred_t, kauth_action_t, void *,
49202611c6Sjym     void *, void *, void *, void *);
50202611c6Sjym static int secmodel_example_process_cb(kauth_cred_t, kauth_action_t, void *,
51202611c6Sjym     void *, void *, void *, void *);
52202611c6Sjym static int secmodel_example_system_cb(kauth_cred_t, kauth_action_t, void *,
53202611c6Sjym     void *, void *, void *, void *);
54202611c6Sjym static int secmodel_example_vnode_cb(kauth_cred_t, kauth_action_t, void *,
55202611c6Sjym     void *, void *, void *, void *);
566cb705e0Selad 
576cb705e0Selad /*
58202611c6Sjym  * Creates sysctl(7) entries expected from a security model.
596cb705e0Selad  */
60202611c6Sjym static void
sysctl_security_example_setup(struct sysctllog ** clog)61202611c6Sjym sysctl_security_example_setup(struct sysctllog **clog)
626cb705e0Selad {
636cb705e0Selad 	const struct sysctlnode *rnode;
646cb705e0Selad 
656cb705e0Selad 	sysctl_createv(clog, 0, NULL, &rnode,
666cb705e0Selad 		       CTLFLAG_PERMANENT,
676cb705e0Selad 		       CTLTYPE_NODE, "security", NULL,
686cb705e0Selad 		       NULL, 0, NULL, 0,
696cb705e0Selad 		       CTL_CREATE, CTL_EOL);
706cb705e0Selad 
716cb705e0Selad 	sysctl_createv(clog, 0, &rnode, &rnode,
726cb705e0Selad 		       CTLFLAG_PERMANENT,
736cb705e0Selad 		       CTLTYPE_NODE, "models", NULL,
746cb705e0Selad 		       NULL, 0, NULL, 0,
756cb705e0Selad 		       CTL_CREATE, CTL_EOL);
766cb705e0Selad 
776cb705e0Selad 	sysctl_createv(clog, 0, &rnode, &rnode,
786cb705e0Selad 		       CTLFLAG_PERMANENT,
796cb705e0Selad 		       CTLTYPE_NODE, "example",
806cb705e0Selad 		       SYSCTL_DESCR("example security model"),
816cb705e0Selad 		       NULL, 0, NULL, 0,
826cb705e0Selad 		       CTL_CREATE, CTL_EOL);
836cb705e0Selad 
846cb705e0Selad 	sysctl_createv(clog, 0, &rnode, NULL,
856cb705e0Selad 		       CTLFLAG_PERMANENT,
866cb705e0Selad 		       CTLTYPE_STRING, "name", NULL,
87202611c6Sjym 		       NULL, 0, __UNCONST(SECMODEL_EXAMPLE_NAME), 0
886cb705e0Selad 		       CTL_CREATE, CTL_EOL);
89202611c6Sjym }
906cb705e0Selad 
91202611c6Sjym /*
92202611c6Sjym  * Initialize the security model.
93202611c6Sjym  */
94202611c6Sjym static void
secmodel_example_init(void)95202611c6Sjym secmodel_example_init(void)
96202611c6Sjym {
97202611c6Sjym 
98202611c6Sjym 	/* typically used to set static variables and states */
996cb705e0Selad }
1006cb705e0Selad 
1016cb705e0Selad /*
1026cb705e0Selad  * Start the security model.
1036cb705e0Selad  */
104202611c6Sjym static void
secmodel_example_start(void)105202611c6Sjym secmodel_example_start(void)
1066cb705e0Selad {
1076cb705e0Selad 
108202611c6Sjym 	/* register listeners */
109202611c6Sjym 	l_device = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
110202611c6Sjym 	    secmodel_example_device_cb, NULL);
111202611c6Sjym 	l_generic = kauth_listen_scope(KAUTH_SCOPE_GENERIC,
1126cb705e0Selad 	    secmodel_example_generic_cb, NULL);
113202611c6Sjym 	l_machdep = kauth_listen_scope(KAUTH_SCOPE_MACHDEP,
1146cb705e0Selad 	    secmodel_example_machdep_cb, NULL);
115202611c6Sjym 	l_network = kauth_listen_scope(KAUTH_SCOPE_NETWORK,
116202611c6Sjym 	    secmodel_example_network_cb, NULL);
117202611c6Sjym 	l_process = kauth_listen_scope(KAUTH_SCOPE_PROCESS,
118202611c6Sjym 	    secmodel_example_process_cb, NULL);
119202611c6Sjym 	l_system = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
120202611c6Sjym 	    secmodel_example_system_cb, NULL);
121202611c6Sjym 	l_vnode = kauth_listen_scope(KAUTH_SCOPE_VNODE,
122202611c6Sjym 	    secmodel_example_vnode_cb, NULL);
123202611c6Sjym }
124202611c6Sjym 
125202611c6Sjym /*
126202611c6Sjym  * Stop the security model.
127202611c6Sjym  */
128202611c6Sjym static void
secmodel_example_stop(void)129202611c6Sjym secmodel_example_stop(void)
130202611c6Sjym {
131202611c6Sjym 
132202611c6Sjym 	/* unregister listeners */
133202611c6Sjym 	kauth_unlisten_scope(l_device);
134202611c6Sjym 	kauth_unlisten_scope(l_generic);
135202611c6Sjym 	kauth_unlisten_scope(l_machdep);
136202611c6Sjym 	kauth_unlisten_scope(l_network);
137202611c6Sjym 	kauth_unlisten_scope(l_process);
138202611c6Sjym 	kauth_unlisten_scope(l_system);
139202611c6Sjym 	kauth_unlisten_scope(l_vnode);
140202611c6Sjym }
141202611c6Sjym 
142202611c6Sjym /*
143202611c6Sjym  * An evaluation routine example. That one will allow any secmodel(9)
144202611c6Sjym  * to request to secmodel_example if "is-example-useful". We consider
145202611c6Sjym  * that it is, so return yes.
146202611c6Sjym  */
147202611c6Sjym static int
secmodel_example_eval(const char * what,void * arg,void * ret)148202611c6Sjym secmodel_example_eval(const char *what, void *arg, void *ret)
149202611c6Sjym {
150202611c6Sjym 	int error = 0;
151202611c6Sjym 
152202611c6Sjym 	if (strcasecmp(what, "is-example-useful") == 0) {
153202611c6Sjym 		bool *bp = ret;
154202611c6Sjym 		*bp = true;
155202611c6Sjym 	} else {
156202611c6Sjym 		error = ENOENT;
157202611c6Sjym 	}
158202611c6Sjym 
159202611c6Sjym 	return error;
160202611c6Sjym }
161202611c6Sjym 
162202611c6Sjym /*
163202611c6Sjym  * Module attachement/detachement routine. Whether the secmodel(9) is
164202611c6Sjym  * builtin or loaded dynamically, it is in charge of initializing, starting
165202611c6Sjym  * and stopping the module. See module(9).
166202611c6Sjym  */
167202611c6Sjym 
168202611c6Sjym static int
secmodel_example_modcmd(modcmd_t cmd,void * arg)169202611c6Sjym secmodel_example_modcmd(modcmd_t cmd, void *arg)
170202611c6Sjym {
171202611c6Sjym 	int error = 0;
172202611c6Sjym 
173202611c6Sjym 	switch (cmd) {
174202611c6Sjym 	case MODULE_CMD_INIT:
175202611c6Sjym 		secmodel_example_init();
176202611c6Sjym 		secmodel_example_start();
177202611c6Sjym 		sysctl_security_example_setup(&sysctl_example_log);
178202611c6Sjym 
179202611c6Sjym 		error = secmodel_register(&example_sm,
180202611c6Sjym 		    SECMODEL_EXAMPLE_ID, SECMODEL_EXAMPLE_NAME,
181202611c6Sjym 		    NULL, secmodel_example_eval, NULL);
182202611c6Sjym 		if (error != 0)
183202611c6Sjym 			printf("secmodel_example_modcmd::init: "
184202611c6Sjym 			    "secmodel_register returned %d\n", error);
185202611c6Sjym 
186202611c6Sjym 		break;
187202611c6Sjym 
188202611c6Sjym 	case MODULE_CMD_FINI:
189202611c6Sjym 		error = secmodel_deregister(example_sm);
190202611c6Sjym 		if (error != 0)
191202611c6Sjym 			printf("secmodel_example_modcmd::fini: "
192202611c6Sjym 			    "secmodel_deregister returned %d\n", error);
193202611c6Sjym 
194202611c6Sjym 		sysctl_teardown(&sysctl_example_log);
195202611c6Sjym 		secmodel_example_stop();
196202611c6Sjym 		break;
197202611c6Sjym 
198202611c6Sjym 	default:
199202611c6Sjym 		error = ENOTTY;
200202611c6Sjym 		break;
201202611c6Sjym 	}
202202611c6Sjym 
203202611c6Sjym 	return error;
2046cb705e0Selad }
2056cb705e0Selad 
2066cb705e0Selad /*
2076cb705e0Selad  * Security model: example
2086cb705e0Selad  * Scope: Generic
2096cb705e0Selad  */
210202611c6Sjym static int
secmodel_example_generic_cb(kauth_cred_t cred,kauth_action_t action,void * cookie,void * arg0,void * arg1,void * arg2,void * arg3)211202611c6Sjym secmodel_example_generic_cb(kauth_cred_t cred, kauth_action_t action,
2126cb705e0Selad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
2136cb705e0Selad {
2146cb705e0Selad 	int result;
2156cb705e0Selad 
2166cb705e0Selad 	result = KAUTH_RESULT_DENY;
2176cb705e0Selad 
2186cb705e0Selad 	switch(action) {
2196cb705e0Selad 	case KAUTH_GENERIC_ISSUSER:
2206cb705e0Selad 	default:
2216cb705e0Selad 		result = KAUTH_RESULT_DEFER;
2226cb705e0Selad 		break;
2236cb705e0Selad 	}
2246cb705e0Selad 
2256cb705e0Selad 	return (result);
2266cb705e0Selad }
2276cb705e0Selad 
2286cb705e0Selad /*
2296cb705e0Selad  * Security model: example
2306cb705e0Selad  * Scope: System
2316cb705e0Selad  */
232202611c6Sjym static int
secmodel_example_system_cb(kauth_cred_t cred,kauth_action_t action,void * cookie,void * arg0,void * arg1,void * arg2,void * arg3)2336cb705e0Selad secmodel_example_system_cb(kauth_cred_t cred, kauth_action_t action,
2346cb705e0Selad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
2356cb705e0Selad {
2366cb705e0Selad 	int result;
2376cb705e0Selad 	enum kauth_system_req req;
2386cb705e0Selad 
2396cb705e0Selad 	result = KAUTH_RESULT_DENY;
2406cb705e0Selad 
2416cb705e0Selad 	req = (enum kauth_system_req)arg0;
2426cb705e0Selad 
2436cb705e0Selad 	switch (action) {
244a13160f4Selad 	case KAUTH_SYSTEM_MOUNT:
245a13160f4Selad 		switch (req) {
246a13160f4Selad 		case KAUTH_REQ_SYSTEM_MOUNT_GET:
247a13160f4Selad 		case KAUTH_REQ_SYSTEM_MOUNT_NEW:
248a13160f4Selad 		case KAUTH_REQ_SYSTEM_MOUNT_UNMOUNT:
249a13160f4Selad 		case KAUTH_REQ_SYSTEM_MOUNT_UPDATE:
250a13160f4Selad 		default:
251a13160f4Selad 			result = KAUTH_RESULT_DEFER;
252a13160f4Selad 			break;
253a13160f4Selad 		}
254a13160f4Selad 		break;
255a13160f4Selad 
2566cb705e0Selad 	case KAUTH_SYSTEM_TIME:
2576cb705e0Selad 		switch (req) {
2586cb705e0Selad 		case KAUTH_REQ_SYSTEM_TIME_ADJTIME:
2596cb705e0Selad 		case KAUTH_REQ_SYSTEM_TIME_NTPADJTIME:
2606cb705e0Selad 		case KAUTH_REQ_SYSTEM_TIME_RTCOFFSET:
2616cb705e0Selad 		case KAUTH_REQ_SYSTEM_TIME_SYSTEM:
26218558073Selad 		case KAUTH_REQ_SYSTEM_TIME_TIMECOUNTERS:
2636cb705e0Selad 		default:
2646cb705e0Selad 			result = KAUTH_RESULT_DEFER;
2656cb705e0Selad 			break;
2666cb705e0Selad 		}
2676cb705e0Selad 		break;
2686cb705e0Selad 
2696cb705e0Selad 	case KAUTH_SYSTEM_SYSCTL:
2706cb705e0Selad 		switch (req) {
2716cb705e0Selad 		case KAUTH_REQ_SYSTEM_SYSCTL_ADD:
2726cb705e0Selad 		case KAUTH_REQ_SYSTEM_SYSCTL_DELETE:
2736cb705e0Selad 		case KAUTH_REQ_SYSTEM_SYSCTL_DESC:
274202611c6Sjym 		case KAUTH_REQ_SYSTEM_SYSCTL_PRVT:
2756cb705e0Selad 		default:
2766cb705e0Selad 			result = KAUTH_RESULT_DEFER;
2776cb705e0Selad 			break;
2786cb705e0Selad 		}
2796cb705e0Selad 		break;
2806cb705e0Selad 
2816cb705e0Selad 	case KAUTH_SYSTEM_CHROOT:
2826cb705e0Selad 		switch (req) {
2836cb705e0Selad 		case KAUTH_REQ_SYSTEM_CHROOT_CHROOT:
2846cb705e0Selad 		case KAUTH_REQ_SYSTEM_CHROOT_FCHROOT:
2856cb705e0Selad 		default:
2866cb705e0Selad 			result = KAUTH_RESULT_DEFER;
2876cb705e0Selad 			break;
2886cb705e0Selad 		}
2896cb705e0Selad 		break;
2906cb705e0Selad 
291cd23f363Selad 	case KAUTH_SYSTEM_CPU:
292cd23f363Selad 		switch (req) {
293cd23f363Selad 		case KAUTH_REQ_SYSTEM_CPU_SETSTATE:
294cd23f363Selad 		default:
295cd23f363Selad 			result = KAUTH_RESULT_DEFER;
296cd23f363Selad 			break;
297cd23f363Selad 		}
298cd23f363Selad 		break;
299cd23f363Selad 
3006cb705e0Selad 	case KAUTH_SYSTEM_DEBUG:
3016cb705e0Selad 		break;
3026cb705e0Selad 
303fb37bad4Selad 	case KAUTH_SYSTEM_PSET:
304fb37bad4Selad 		switch (req) {
305fb37bad4Selad 		case KAUTH_REQ_SYSTEM_PSET_ASSIGN:
306fb37bad4Selad 		case KAUTH_REQ_SYSTEM_PSET_BIND:
307fb37bad4Selad 		case KAUTH_REQ_SYSTEM_PSET_CREATE:
308fb37bad4Selad 		case KAUTH_REQ_SYSTEM_PSET_DESTROY:
309fb37bad4Selad 		default:
310fb37bad4Selad 			result = KAUTH_RESULT_DEFER;
311fb37bad4Selad 			break;
312fb37bad4Selad 		}
313fb37bad4Selad 		break;
314fb37bad4Selad 
315202611c6Sjym 	case KAUTH_SYSTEM_FS_QUOTA:
316202611c6Sjym 		switch (req) {
317202611c6Sjym 		case KAUTH_REQ_SYSTEM_FS_QUOTA_GET:
318202611c6Sjym 		case KAUTH_REQ_SYSTEM_FS_QUOTA_ONOFF:
319202611c6Sjym 		case KAUTH_REQ_SYSTEM_FS_QUOTA_MANAGE:
320202611c6Sjym 		case KAUTH_REQ_SYSTEM_FS_QUOTA_NOLIMIT:
321202611c6Sjym 		default:
322202611c6Sjym 			result = KAUTH_RESULT_DEFER;
323202611c6Sjym 			break;
324202611c6Sjym 		}
325202611c6Sjym 		break;
326202611c6Sjym 
3276cb705e0Selad 	case KAUTH_SYSTEM_FILEHANDLE:
3286cb705e0Selad 	case KAUTH_SYSTEM_MKNOD:
329fb37bad4Selad 	case KAUTH_SYSTEM_MODULE:
330202611c6Sjym 	case KAUTH_SYSTEM_FS_RESERVEDSPACE:
3316cb705e0Selad 	case KAUTH_SYSTEM_SETIDCORE:
3326cb705e0Selad 	case KAUTH_SYSTEM_SWAPCTL:
3336cb705e0Selad 	case KAUTH_SYSTEM_ACCOUNTING:
3346cb705e0Selad 	case KAUTH_SYSTEM_REBOOT:
3356cb705e0Selad 	default:
3366cb705e0Selad 		result = KAUTH_RESULT_DEFER;
3376cb705e0Selad 		break;
3386cb705e0Selad 	}
3396cb705e0Selad 
3406cb705e0Selad 	return (result);
3416cb705e0Selad }
3426cb705e0Selad 
3436cb705e0Selad /*
3446cb705e0Selad  * kauth(9) listener
3456cb705e0Selad  *
3466cb705e0Selad  * Security model: example
3476cb705e0Selad  * Scope: Process
3486cb705e0Selad  */
349202611c6Sjym static int
secmodel_example_process_cb(kauth_cred_t cred,kauth_action_t action,void * cookie,void * arg0,void * arg1,void * arg2,void * arg3)3506cb705e0Selad secmodel_example_process_cb(kauth_cred_t cred, kauth_action_t action,
3516cb705e0Selad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
3526cb705e0Selad {
3536cb705e0Selad 	int result;
3546cb705e0Selad 
3556cb705e0Selad 	result = KAUTH_RESULT_DENY;
3566cb705e0Selad 
3576cb705e0Selad 	switch (action) {
358e43f626dSelad 	case KAUTH_PROCESS_KTRACE:
359e43f626dSelad 		switch ((u_long)arg1) {
360e43f626dSelad 		case KAUTH_REQ_PROCESS_KTRACE_PERSISTENT:
361e43f626dSelad 		default:
362e43f626dSelad 			result = KAUTH_RESULT_DEFER;
363e43f626dSelad 			break;
364e43f626dSelad 		}
365e43f626dSelad 		break;
366e43f626dSelad 
367238ad51dSelad 	case KAUTH_PROCESS_CANSEE:
368202611c6Sjym 		switch ((u_long)arg1) {
369202611c6Sjym 		case KAUTH_REQ_PROCESS_CANSEE_ARGS:
370202611c6Sjym 		case KAUTH_REQ_PROCESS_CANSEE_ENTRY:
371202611c6Sjym 		case KAUTH_REQ_PROCESS_CANSEE_ENV:
372202611c6Sjym 		case KAUTH_REQ_PROCESS_CANSEE_OPENFILES:
3732892045eSmaxv 		case KAUTH_REQ_PROCESS_CANSEE_EPROC:
374202611c6Sjym 		default:
375202611c6Sjym 			result = KAUTH_RESULT_DEFER;
376202611c6Sjym 			break;
377202611c6Sjym 		}
378202611c6Sjym 		break;
379202611c6Sjym 
380238ad51dSelad 	case KAUTH_PROCESS_CORENAME:
381202611c6Sjym 		switch ((u_long)arg1) {
382202611c6Sjym 		case KAUTH_REQ_PROCESS_CORENAME_GET:
383202611c6Sjym 		case KAUTH_REQ_PROCESS_CORENAME_SET:
384202611c6Sjym 		default:
385202611c6Sjym 			result = KAUTH_RESULT_DEFER;
386202611c6Sjym 			break;
387202611c6Sjym 		}
388202611c6Sjym 		break;
389202611c6Sjym 
390202611c6Sjym 	case KAUTH_PROCESS_RLIMIT:
391202611c6Sjym 		switch ((u_long)arg1) {
392202611c6Sjym 		case KAUTH_REQ_PROCESS_RLIMIT_GET:
393202611c6Sjym 		case KAUTH_REQ_PROCESS_RLIMIT_SET:
394202611c6Sjym 		default:
395202611c6Sjym 			result = KAUTH_RESULT_DEFER;
396202611c6Sjym 			break;
397202611c6Sjym 		}
398202611c6Sjym 		break;
399202611c6Sjym 
400202611c6Sjym 	case KAUTH_PROCESS_STOPFLAG:
401202611c6Sjym 	case KAUTH_PROCESS_PTRACE:
402202611c6Sjym 	case KAUTH_PROCESS_SIGNAL:
403202611c6Sjym 	case KAUTH_PROCESS_PROCFS:
404964f16c2Selad 	case KAUTH_PROCESS_FORK:
405c27d5f30Selad 	case KAUTH_PROCESS_KEVENT_FILTER:
406a78693aaSelad 	case KAUTH_PROCESS_NICE:
407e99760e7Selad 	case KAUTH_PROCESS_SCHEDULER_GETAFFINITY:
408e99760e7Selad 	case KAUTH_PROCESS_SCHEDULER_SETAFFINITY:
409e99760e7Selad 	case KAUTH_PROCESS_SCHEDULER_GETPARAM:
410e99760e7Selad 	case KAUTH_PROCESS_SCHEDULER_SETPARAM:
4116cb705e0Selad 	case KAUTH_PROCESS_SETID:
4126cb705e0Selad 	default:
4136cb705e0Selad 		result = KAUTH_RESULT_DEFER;
4146cb705e0Selad 		break;
4156cb705e0Selad 	}
4166cb705e0Selad 
4176cb705e0Selad 	return (result);
4186cb705e0Selad }
4196cb705e0Selad 
4206cb705e0Selad /*
4216cb705e0Selad  * kauth(9) listener
4226cb705e0Selad  *
4236cb705e0Selad  * Security model: example
4246cb705e0Selad  * Scope: Network
4256cb705e0Selad  */
426202611c6Sjym static int
secmodel_example_network_cb(kauth_cred_t cred,kauth_action_t action,void * cookie,void * arg0,void * arg1,void * arg2,void * arg3)4276cb705e0Selad secmodel_example_network_cb(kauth_cred_t cred, kauth_action_t action,
4286cb705e0Selad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
4296cb705e0Selad {
4306cb705e0Selad 	int result;
4316cb705e0Selad 
4326cb705e0Selad 	result = KAUTH_RESULT_DENY;
4336cb705e0Selad 
4346cb705e0Selad 	switch (action) {
4356cb705e0Selad 	case KAUTH_NETWORK_ALTQ:
4366cb705e0Selad 		switch((u_long)arg0) {
4376cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_AFMAP:
4386cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_BLUE:
4396cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_CBQ:
4406cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_CDNR:
4416cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_CONF:
4426cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_FIFOQ:
4436cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_HFSC:
444fab05f40Selad 		case KAUTH_REQ_NETWORK_ALTQ_JOBS:
4456cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_PRIQ:
4466cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_RED:
4476cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_RIO:
4486cb705e0Selad 		case KAUTH_REQ_NETWORK_ALTQ_WFQ:
4496cb705e0Selad 		default:
4506cb705e0Selad 			result = KAUTH_RESULT_DEFER;
4516cb705e0Selad 			break;
4526cb705e0Selad 		}
4536cb705e0Selad 		break;
4546cb705e0Selad 
4556cb705e0Selad 	case KAUTH_NETWORK_BIND:
4566cb705e0Selad 		switch((u_long)arg0) {
4576cb705e0Selad 		case KAUTH_REQ_NETWORK_BIND_PORT:
4586cb705e0Selad 		case KAUTH_REQ_NETWORK_BIND_PRIVPORT:
4596cb705e0Selad 		default:
4606cb705e0Selad 			result = KAUTH_RESULT_DEFER;
4616cb705e0Selad 			break;
4626cb705e0Selad 		}
4636cb705e0Selad 		break;
4646cb705e0Selad 
4656cb705e0Selad 	case KAUTH_NETWORK_FIREWALL:
4666cb705e0Selad 		switch ((u_long)arg0) {
4676cb705e0Selad 		case KAUTH_REQ_NETWORK_FIREWALL_FW:
4686cb705e0Selad 		case KAUTH_REQ_NETWORK_FIREWALL_NAT:
4696cb705e0Selad 		default:
4706cb705e0Selad 			result = KAUTH_RESULT_DEFER;
4716cb705e0Selad 			break;
4726cb705e0Selad 		}
4736cb705e0Selad 		break;
4746cb705e0Selad 
475305fe091Selad 	case KAUTH_NETWORK_FORWSRCRT:
476305fe091Selad 		break;
477305fe091Selad 
478305fe091Selad 	case KAUTH_NETWORK_INTERFACE:
479305fe091Selad 		switch ((u_long)arg0) {
480305fe091Selad 		case KAUTH_REQ_NETWORK_INTERFACE_GET:
481305fe091Selad 		case KAUTH_REQ_NETWORK_INTERFACE_SET:
482305fe091Selad 		case KAUTH_REQ_NETWORK_INTERFACE_GETPRIV:
483305fe091Selad 		case KAUTH_REQ_NETWORK_INTERFACE_SETPRIV:
484305fe091Selad 		default:
485305fe091Selad 			result = KAUTH_RESULT_DEFER;
486305fe091Selad 			break;
487305fe091Selad 		}
488305fe091Selad 		break;
489305fe091Selad 
490cd05a6eeSelad 	case KAUTH_NETWORK_NFS:
491cd05a6eeSelad 		switch ((u_long)arg0) {
492cd05a6eeSelad 		case KAUTH_REQ_NETWORK_NFS_EXPORT:
493cd05a6eeSelad 		case KAUTH_REQ_NETWORK_NFS_SVC:
494cd05a6eeSelad 		default:
495cd05a6eeSelad 			result = KAUTH_RESULT_DEFER;
496cd05a6eeSelad 			break;
497cd05a6eeSelad 		}
498cd05a6eeSelad 		break;
499cd05a6eeSelad 
500202611c6Sjym 	case KAUTH_NETWORK_INTERFACE_PPP:
501202611c6Sjym 		switch ((u_long)arg0) {
502202611c6Sjym 		case KAUTH_REQ_NETWORK_INTERFACE_PPP_ADD:
503202611c6Sjym 		default:
504202611c6Sjym 			result = KAUTH_RESULT_DEFER;
505202611c6Sjym 			break;
506202611c6Sjym 		}
507202611c6Sjym 		break;
508202611c6Sjym 
509202611c6Sjym 	case KAUTH_NETWORK_INTERFACE_SLIP:
510202611c6Sjym 		switch ((u_long)arg0) {
511202611c6Sjym 		case KAUTH_REQ_NETWORK_INTERFACE_SLIP_ADD:
512202611c6Sjym 		default:
513202611c6Sjym 			result = KAUTH_RESULT_DEFER;
514202611c6Sjym 			break;
515202611c6Sjym 		}
516202611c6Sjym 		break;
517202611c6Sjym 
518305fe091Selad 	case KAUTH_NETWORK_ROUTE:
519305fe091Selad 		break;
520305fe091Selad 
5216cb705e0Selad 	case KAUTH_NETWORK_SOCKET:
5226cb705e0Selad 		switch((u_long)arg0) {
523adf8d7aaSelad 		case KAUTH_REQ_NETWORK_SOCKET_OPEN:
5246cb705e0Selad 		case KAUTH_REQ_NETWORK_SOCKET_RAWSOCK:
5258c494ca7Selad 		case KAUTH_REQ_NETWORK_SOCKET_CANSEE:
526202611c6Sjym 		case KAUTH_REQ_NETWORK_SOCKET_DROP:
527202611c6Sjym 		case KAUTH_REQ_NETWORK_SOCKET_SETPRIV:
528202611c6Sjym 		default:
529202611c6Sjym 			result = KAUTH_RESULT_DEFER;
530202611c6Sjym 			break;
531202611c6Sjym 		}
532202611c6Sjym 		break;
533202611c6Sjym 
534202611c6Sjym 		break;
535202611c6Sjym 	case KAUTH_NETWORK_INTERFACE_TUN:
536202611c6Sjym 		switch ((u_long)arg0) {
537202611c6Sjym 		case KAUTH_REQ_NETWORK_INTERFACE_TUN_ADD:
5386cb705e0Selad 		default:
5396cb705e0Selad 			result = KAUTH_RESULT_DEFER;
5406cb705e0Selad 			break;
5416cb705e0Selad 		}
5426cb705e0Selad 		break;
5436cb705e0Selad 
5446cb705e0Selad 	default:
5456cb705e0Selad 		result = KAUTH_RESULT_DEFER;
5466cb705e0Selad 		break;
5476cb705e0Selad 	}
5486cb705e0Selad 
5496cb705e0Selad 	return (result);
5506cb705e0Selad }
5516cb705e0Selad 
5526cb705e0Selad /*
5536cb705e0Selad  * kauth(9) listener
5546cb705e0Selad  *
5556cb705e0Selad  * Security model: example
5566cb705e0Selad  * Scope: Machdep
5576cb705e0Selad  */
558202611c6Sjym static int
secmodel_example_machdep_cb(kauth_cred_t cred,kauth_action_t action,void * cookie,void * arg0,void * arg1,void * arg2,void * arg3)5596cb705e0Selad secmodel_example_machdep_cb(kauth_cred_t cred, kauth_action_t action,
5606cb705e0Selad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
5616cb705e0Selad {
5626cb705e0Selad 	int result;
5636cb705e0Selad 
5646cb705e0Selad 	result = KAUTH_RESULT_DENY;
5656cb705e0Selad 
5666cb705e0Selad 	switch (action) {
567202611c6Sjym 	case KAUTH_MACHDEP_CACHEFLUSH:
568504c71d9Selad 	case KAUTH_MACHDEP_IOPERM_GET:
569504c71d9Selad 	case KAUTH_MACHDEP_IOPERM_SET:
570504c71d9Selad 	case KAUTH_MACHDEP_IOPL:
571504c71d9Selad 	case KAUTH_MACHDEP_LDT_GET:
572504c71d9Selad 	case KAUTH_MACHDEP_LDT_SET:
573504c71d9Selad 	case KAUTH_MACHDEP_MTRR_GET:
574504c71d9Selad 	case KAUTH_MACHDEP_MTRR_SET:
575202611c6Sjym 	case KAUTH_MACHDEP_NVRAM:
576504c71d9Selad 	case KAUTH_MACHDEP_UNMANAGEDMEM:
5776cb705e0Selad 	default:
5786cb705e0Selad 		result = KAUTH_RESULT_DEFER;
5796cb705e0Selad 		break;
5806cb705e0Selad 	}
5816cb705e0Selad 
5826cb705e0Selad 	return (result);
5836cb705e0Selad }
5846cb705e0Selad 
5857d27a7d8Selad /*
5867d27a7d8Selad  * kauth(9) listener
5877d27a7d8Selad  *
5887d27a7d8Selad  * Security model: example
5897d27a7d8Selad  * Scope: Device
5907d27a7d8Selad  */
591202611c6Sjym static int
secmodel_example_device_cb(kauth_cred_t cred,kauth_action_t action,void * cookie,void * arg0,void * arg1,void * arg2,void * arg3)5927d27a7d8Selad secmodel_example_device_cb(kauth_cred_t cred, kauth_action_t action,
5937d27a7d8Selad     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
5947d27a7d8Selad {
5957d27a7d8Selad 	int result;
5967d27a7d8Selad 
5977d27a7d8Selad 	result = KAUTH_RESULT_DENY;
5987d27a7d8Selad 
5997d27a7d8Selad 	switch (action) {
6007d27a7d8Selad 	case KAUTH_DEVICE_TTY_OPEN:
6017d27a7d8Selad 	case KAUTH_DEVICE_TTY_PRIVSET:
602c27d5f30Selad 	case KAUTH_DEVICE_TTY_STI:
6037d27a7d8Selad 		break;
6047d27a7d8Selad 
6057d27a7d8Selad 	case KAUTH_DEVICE_RAWIO_SPEC:
6067d27a7d8Selad 		switch ((u_long)arg0) {
6077d27a7d8Selad 		case KAUTH_REQ_DEVICE_RAWIO_SPEC_READ:
6087d27a7d8Selad 		case KAUTH_REQ_DEVICE_RAWIO_SPEC_WRITE:
6097d27a7d8Selad 		case KAUTH_REQ_DEVICE_RAWIO_SPEC_RW:
6107d27a7d8Selad 			break;
6117d27a7d8Selad 
6127d27a7d8Selad 		default:
6137d27a7d8Selad 			result = KAUTH_RESULT_DEFER;
6147d27a7d8Selad 			break;
6157d27a7d8Selad 		}
616202611c6Sjym 		break;
6177d27a7d8Selad 
618202611c6Sjym 	case KAUTH_DEVICE_BLUETOOTH_BCSP:
619202611c6Sjym 		switch ((u_long)arg0) {
620202611c6Sjym 		case KAUTH_REQ_DEVICE_BLUETOOTH_BCSP_ADD:
621202611c6Sjym 		default:
622202611c6Sjym 			result = KAUTH_RESULT_DEFER;
623202611c6Sjym 			break;
624202611c6Sjym 		}
625202611c6Sjym 		break;
626202611c6Sjym 
627202611c6Sjym 	case KAUTH_DEVICE_BLUETOOTH_BTUART:
628202611c6Sjym 		switch ((u_long)arg0) {
629202611c6Sjym 		case KAUTH_REQ_DEVICE_BLUETOOTH_BTUART_ADD:
630202611c6Sjym 		default:
631202611c6Sjym 			result = KAUTH_RESULT_DEFER;
632202611c6Sjym 			break;
633202611c6Sjym 		}
6347d27a7d8Selad 		break;
6357d27a7d8Selad 
6367d27a7d8Selad 	case KAUTH_DEVICE_RAWIO_PASSTHRU:
637202611c6Sjym 	case KAUTH_DEVICE_BLUETOOTH_RECV:
638202611c6Sjym 	case KAUTH_DEVICE_BLUETOOTH_SEND:
639202611c6Sjym 	case KAUTH_DEVICE_BLUETOOTH_SETPRIV:
640202611c6Sjym 	default:
641202611c6Sjym 		result = KAUTH_RESULT_DEFER;
642202611c6Sjym 		break;
643202611c6Sjym 	}
644202611c6Sjym 
645202611c6Sjym 	return (result);
646202611c6Sjym }
647202611c6Sjym 
648202611c6Sjym /*
649202611c6Sjym  * kauth(9) listener
650202611c6Sjym  *
651202611c6Sjym  * Security model: example
652202611c6Sjym  * Scope: Vnode
653202611c6Sjym  */
654202611c6Sjym static int
secmodel_example_vnode_cb(kauth_cred_t cred,kauth_action_t action,void * cookie,void * arg0,void * arg1,void * arg2,void * arg3)655202611c6Sjym secmodel_example_vnode_cb(kauth_cred_t cred, kauth_action_t action,
656202611c6Sjym     void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
657202611c6Sjym {
658202611c6Sjym 	int result;
659202611c6Sjym 
660202611c6Sjym 	result = KAUTH_RESULT_DENY;
661202611c6Sjym 
662202611c6Sjym 	switch (action) {
663202611c6Sjym 	case KAUTH_VNODE_READ_DATA:
664202611c6Sjym 	  /* KAUTH_VNODE_LIST_DIRECTORY: */
665202611c6Sjym 		result = KAUTH_RESULT_DEFER;
666202611c6Sjym 		break;
667202611c6Sjym 
668202611c6Sjym 	case KAUTH_VNODE_WRITE_DATA:
669202611c6Sjym 	  /* KAUTH_VNODE_ADD_FILE: */
670202611c6Sjym 		result = KAUTH_RESULT_DEFER;
671202611c6Sjym 		break;
672202611c6Sjym 
673202611c6Sjym 	case KAUTH_VNODE_EXECUTE:
674202611c6Sjym 	  /* KAUTH_VNODE_SEARCH: */
675202611c6Sjym 		result = KAUTH_RESULT_DEFER;
676202611c6Sjym 		break;
677202611c6Sjym 
678202611c6Sjym 	case KAUTH_VNODE_APPEND_DATA:
679202611c6Sjym 	  /* KAUTH_VNODE_ADD_SUBDIRECTORY: */
680202611c6Sjym 		result = KAUTH_RESULT_DEFER;
681202611c6Sjym 		break;
682202611c6Sjym 
683202611c6Sjym 	case KAUTH_VNODE_DELETE:
684202611c6Sjym 	case KAUTH_VNODE_READ_TIMES:
685202611c6Sjym 	case KAUTH_VNODE_WRITE_TIMES:
686202611c6Sjym 	case KAUTH_VNODE_READ_FLAGS:
687202611c6Sjym 	case KAUTH_VNODE_WRITE_FLAGS:
688202611c6Sjym 	case KAUTH_VNODE_READ_SYSFLAGS:
689202611c6Sjym 	case KAUTH_VNODE_WRITE_SYSFLAGS:
690202611c6Sjym 	case KAUTH_VNODE_RENAME:
691202611c6Sjym 	case KAUTH_VNODE_CHANGE_OWNERSHIP:
692202611c6Sjym 	case KAUTH_VNODE_READ_SECURITY:
693202611c6Sjym 	case KAUTH_VNODE_WRITE_SECURITY:
694202611c6Sjym 	case KAUTH_VNODE_READ_ATTRIBUTES:
695202611c6Sjym 	case KAUTH_VNODE_WRITE_ATTRIBUTES:
696202611c6Sjym 	case KAUTH_VNODE_READ_EXTATTRIBUTES:
697202611c6Sjym 	case KAUTH_VNODE_WRITE_EXTATTRIBUTES:
6987d27a7d8Selad 	default:
6997d27a7d8Selad 		result = KAUTH_RESULT_DEFER;
7007d27a7d8Selad 		break;
7017d27a7d8Selad 	}
7027d27a7d8Selad 
7037d27a7d8Selad 	return (result);
7047d27a7d8Selad }
705