1*c865d5f4Sandvar /* $NetBSD: secmodel_example.c,v 1.30 2024/02/02 22:14:04 andvar 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*c865d5f4Sandvar __KERNEL_RCSID(0, "$NetBSD: secmodel_example.c,v 1.30 2024/02/02 22:14:04 andvar Exp $");
176cb705e0Selad
186cb705e0Selad #include <sys/types.h>
196cb705e0Selad #include <sys/param.h>
206cb705e0Selad #include <sys/kauth.h>
216cb705e0Selad
2247c04e7bSjym #include <sys/module.h>
236cb705e0Selad #include <sys/sysctl.h>
246cb705e0Selad
256cb705e0Selad #include <secmodel/secmodel.h>
266cb705e0Selad #include <secmodel/example/example.h>
276cb705e0Selad
2847c04e7bSjym MODULE(MODULE_CLASS_SECMODEL, secmodel_example, NULL);
2947c04e7bSjym
3047c04e7bSjym static secmodel_t example_sm;
3147c04e7bSjym static struct sysctllog *sysctl_example_log;
3247c04e7bSjym
3347c04e7bSjym static kauth_listener_t l_device, l_generic, l_machdep, l_network,
3447c04e7bSjym l_process, l_system, l_vnode;
3547c04e7bSjym
3647c04e7bSjym static void secmodel_example_init(void);
3747c04e7bSjym static void secmodel_example_start(void);
3847c04e7bSjym static void secmodel_example_stop(void);
3947c04e7bSjym
4047c04e7bSjym static void sysctl_security_example_setup(struct sysctllog **);
4147c04e7bSjym
4247c04e7bSjym static int secmodel_example_device_cb(kauth_cred_t, kauth_action_t, void *,
4347c04e7bSjym void *, void *, void *, void *);
4447c04e7bSjym static int secmodel_example_generic_cb(kauth_cred_t, kauth_action_t, void *,
4547c04e7bSjym void *, void *, void *, void *);
4647c04e7bSjym static int secmodel_example_machdep_cb(kauth_cred_t, kauth_action_t, void *,
4747c04e7bSjym void *, void *, void *, void *);
4847c04e7bSjym static int secmodel_example_network_cb(kauth_cred_t, kauth_action_t, void *,
4947c04e7bSjym void *, void *, void *, void *);
5047c04e7bSjym static int secmodel_example_process_cb(kauth_cred_t, kauth_action_t, void *,
5147c04e7bSjym void *, void *, void *, void *);
5247c04e7bSjym static int secmodel_example_system_cb(kauth_cred_t, kauth_action_t, void *,
5347c04e7bSjym void *, void *, void *, void *);
5447c04e7bSjym static int secmodel_example_vnode_cb(kauth_cred_t, kauth_action_t, void *,
5547c04e7bSjym void *, void *, void *, void *);
566cb705e0Selad
576cb705e0Selad /*
5847c04e7bSjym * Creates sysctl(7) entries expected from a security model.
596cb705e0Selad */
6047c04e7bSjym static void
sysctl_security_example_setup(struct sysctllog ** clog)6147c04e7bSjym 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,
8747c04e7bSjym NULL, 0, __UNCONST(SECMODEL_EXAMPLE_NAME), 0
886cb705e0Selad CTL_CREATE, CTL_EOL);
8947c04e7bSjym }
906cb705e0Selad
9147c04e7bSjym /*
9247c04e7bSjym * Initialize the security model.
9347c04e7bSjym */
9447c04e7bSjym static void
secmodel_example_init(void)9547c04e7bSjym secmodel_example_init(void)
9647c04e7bSjym {
9747c04e7bSjym
9847c04e7bSjym /* typically used to set static variables and states */
996cb705e0Selad }
1006cb705e0Selad
1016cb705e0Selad /*
1026cb705e0Selad * Start the security model.
1036cb705e0Selad */
10447c04e7bSjym static void
secmodel_example_start(void)10547c04e7bSjym secmodel_example_start(void)
1066cb705e0Selad {
1076cb705e0Selad
10847c04e7bSjym /* register listeners */
10947c04e7bSjym l_device = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
11047c04e7bSjym secmodel_example_device_cb, NULL);
11147c04e7bSjym l_generic = kauth_listen_scope(KAUTH_SCOPE_GENERIC,
1126cb705e0Selad secmodel_example_generic_cb, NULL);
11347c04e7bSjym l_machdep = kauth_listen_scope(KAUTH_SCOPE_MACHDEP,
1146cb705e0Selad secmodel_example_machdep_cb, NULL);
11547c04e7bSjym l_network = kauth_listen_scope(KAUTH_SCOPE_NETWORK,
11647c04e7bSjym secmodel_example_network_cb, NULL);
11747c04e7bSjym l_process = kauth_listen_scope(KAUTH_SCOPE_PROCESS,
11847c04e7bSjym secmodel_example_process_cb, NULL);
11947c04e7bSjym l_system = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
12047c04e7bSjym secmodel_example_system_cb, NULL);
12147c04e7bSjym l_vnode = kauth_listen_scope(KAUTH_SCOPE_VNODE,
12247c04e7bSjym secmodel_example_vnode_cb, NULL);
12347c04e7bSjym }
12447c04e7bSjym
12547c04e7bSjym /*
12647c04e7bSjym * Stop the security model.
12747c04e7bSjym */
12847c04e7bSjym static void
secmodel_example_stop(void)12947c04e7bSjym secmodel_example_stop(void)
13047c04e7bSjym {
13147c04e7bSjym
13247c04e7bSjym /* unregister listeners */
13347c04e7bSjym kauth_unlisten_scope(l_device);
13447c04e7bSjym kauth_unlisten_scope(l_generic);
13547c04e7bSjym kauth_unlisten_scope(l_machdep);
13647c04e7bSjym kauth_unlisten_scope(l_network);
13747c04e7bSjym kauth_unlisten_scope(l_process);
13847c04e7bSjym kauth_unlisten_scope(l_system);
13947c04e7bSjym kauth_unlisten_scope(l_vnode);
14047c04e7bSjym }
14147c04e7bSjym
14247c04e7bSjym /*
14347c04e7bSjym * An evaluation routine example. That one will allow any secmodel(9)
14447c04e7bSjym * to request to secmodel_example if "is-example-useful". We consider
14547c04e7bSjym * that it is, so return yes.
14647c04e7bSjym */
14747c04e7bSjym static int
secmodel_example_eval(const char * what,void * arg,void * ret)14847c04e7bSjym secmodel_example_eval(const char *what, void *arg, void *ret)
14947c04e7bSjym {
15047c04e7bSjym int error = 0;
15147c04e7bSjym
15247c04e7bSjym if (strcasecmp(what, "is-example-useful") == 0) {
15347c04e7bSjym bool *bp = ret;
15447c04e7bSjym *bp = true;
15547c04e7bSjym } else {
15647c04e7bSjym error = ENOENT;
15747c04e7bSjym }
15847c04e7bSjym
15947c04e7bSjym return error;
16047c04e7bSjym }
16147c04e7bSjym
16247c04e7bSjym /*
163*c865d5f4Sandvar * Module attachment/detachment routine. Whether the secmodel(9) is
16447c04e7bSjym * builtin or loaded dynamically, it is in charge of initializing, starting
16547c04e7bSjym * and stopping the module. See module(9).
16647c04e7bSjym */
16747c04e7bSjym
16847c04e7bSjym static int
secmodel_example_modcmd(modcmd_t cmd,void * arg)16947c04e7bSjym secmodel_example_modcmd(modcmd_t cmd, void *arg)
17047c04e7bSjym {
17147c04e7bSjym int error = 0;
17247c04e7bSjym
17347c04e7bSjym switch (cmd) {
17447c04e7bSjym case MODULE_CMD_INIT:
17547c04e7bSjym secmodel_example_init();
17647c04e7bSjym secmodel_example_start();
17747c04e7bSjym sysctl_security_example_setup(&sysctl_example_log);
17847c04e7bSjym
17947c04e7bSjym error = secmodel_register(&example_sm,
18047c04e7bSjym SECMODEL_EXAMPLE_ID, SECMODEL_EXAMPLE_NAME,
18147c04e7bSjym NULL, secmodel_example_eval, NULL);
18247c04e7bSjym if (error != 0)
18347c04e7bSjym printf("secmodel_example_modcmd::init: "
18447c04e7bSjym "secmodel_register returned %d\n", error);
18547c04e7bSjym
18647c04e7bSjym break;
18747c04e7bSjym
18847c04e7bSjym case MODULE_CMD_FINI:
18947c04e7bSjym error = secmodel_deregister(example_sm);
19047c04e7bSjym if (error != 0)
19147c04e7bSjym printf("secmodel_example_modcmd::fini: "
19247c04e7bSjym "secmodel_deregister returned %d\n", error);
19347c04e7bSjym
19447c04e7bSjym sysctl_teardown(&sysctl_example_log);
19547c04e7bSjym secmodel_example_stop();
19647c04e7bSjym break;
19747c04e7bSjym
19847c04e7bSjym default:
19947c04e7bSjym error = ENOTTY;
20047c04e7bSjym break;
20147c04e7bSjym }
20247c04e7bSjym
20347c04e7bSjym return error;
2046cb705e0Selad }
2056cb705e0Selad
2066cb705e0Selad /*
2076cb705e0Selad * Security model: example
2086cb705e0Selad * Scope: Generic
2096cb705e0Selad */
21047c04e7bSjym static int
secmodel_example_generic_cb(kauth_cred_t cred,kauth_action_t action,void * cookie,void * arg0,void * arg1,void * arg2,void * arg3)21147c04e7bSjym 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 */
23247c04e7bSjym 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:
27447c04e7bSjym 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
31547c04e7bSjym case KAUTH_SYSTEM_FS_QUOTA:
31647c04e7bSjym switch (req) {
31747c04e7bSjym case KAUTH_REQ_SYSTEM_FS_QUOTA_GET:
31847c04e7bSjym case KAUTH_REQ_SYSTEM_FS_QUOTA_ONOFF:
31947c04e7bSjym case KAUTH_REQ_SYSTEM_FS_QUOTA_MANAGE:
32047c04e7bSjym case KAUTH_REQ_SYSTEM_FS_QUOTA_NOLIMIT:
32147c04e7bSjym default:
32247c04e7bSjym result = KAUTH_RESULT_DEFER;
32347c04e7bSjym break;
32447c04e7bSjym }
32547c04e7bSjym break;
32647c04e7bSjym
3276cb705e0Selad case KAUTH_SYSTEM_FILEHANDLE:
3286cb705e0Selad case KAUTH_SYSTEM_MKNOD:
329fb37bad4Selad case KAUTH_SYSTEM_MODULE:
33047c04e7bSjym 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 */
34947c04e7bSjym 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:
36847c04e7bSjym switch ((u_long)arg1) {
36947c04e7bSjym case KAUTH_REQ_PROCESS_CANSEE_ARGS:
37047c04e7bSjym case KAUTH_REQ_PROCESS_CANSEE_ENTRY:
37147c04e7bSjym case KAUTH_REQ_PROCESS_CANSEE_ENV:
37247c04e7bSjym case KAUTH_REQ_PROCESS_CANSEE_OPENFILES:
3732ce97679Smaxv case KAUTH_REQ_PROCESS_CANSEE_EPROC:
37447c04e7bSjym default:
37547c04e7bSjym result = KAUTH_RESULT_DEFER;
37647c04e7bSjym break;
37747c04e7bSjym }
37847c04e7bSjym break;
37947c04e7bSjym
380238ad51dSelad case KAUTH_PROCESS_CORENAME:
38147c04e7bSjym switch ((u_long)arg1) {
38247c04e7bSjym case KAUTH_REQ_PROCESS_CORENAME_GET:
38347c04e7bSjym case KAUTH_REQ_PROCESS_CORENAME_SET:
38447c04e7bSjym default:
38547c04e7bSjym result = KAUTH_RESULT_DEFER;
38647c04e7bSjym break;
38747c04e7bSjym }
38847c04e7bSjym break;
38947c04e7bSjym
39047c04e7bSjym case KAUTH_PROCESS_RLIMIT:
39147c04e7bSjym switch ((u_long)arg1) {
39247c04e7bSjym case KAUTH_REQ_PROCESS_RLIMIT_GET:
39347c04e7bSjym case KAUTH_REQ_PROCESS_RLIMIT_SET:
39447c04e7bSjym default:
39547c04e7bSjym result = KAUTH_RESULT_DEFER;
39647c04e7bSjym break;
39747c04e7bSjym }
39847c04e7bSjym break;
39947c04e7bSjym
40047c04e7bSjym case KAUTH_PROCESS_STOPFLAG:
40147c04e7bSjym case KAUTH_PROCESS_PTRACE:
40247c04e7bSjym case KAUTH_PROCESS_SIGNAL:
40347c04e7bSjym 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 */
42647c04e7bSjym 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
50047c04e7bSjym case KAUTH_NETWORK_INTERFACE_PPP:
50147c04e7bSjym switch ((u_long)arg0) {
50247c04e7bSjym case KAUTH_REQ_NETWORK_INTERFACE_PPP_ADD:
50347c04e7bSjym default:
50447c04e7bSjym result = KAUTH_RESULT_DEFER;
50547c04e7bSjym break;
50647c04e7bSjym }
50747c04e7bSjym break;
50847c04e7bSjym
50947c04e7bSjym case KAUTH_NETWORK_INTERFACE_SLIP:
51047c04e7bSjym switch ((u_long)arg0) {
51147c04e7bSjym case KAUTH_REQ_NETWORK_INTERFACE_SLIP_ADD:
51247c04e7bSjym default:
51347c04e7bSjym result = KAUTH_RESULT_DEFER;
51447c04e7bSjym break;
51547c04e7bSjym }
51647c04e7bSjym break;
51747c04e7bSjym
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:
52647c04e7bSjym case KAUTH_REQ_NETWORK_SOCKET_DROP:
52747c04e7bSjym case KAUTH_REQ_NETWORK_SOCKET_SETPRIV:
52847c04e7bSjym default:
52947c04e7bSjym result = KAUTH_RESULT_DEFER;
53047c04e7bSjym break;
53147c04e7bSjym }
53247c04e7bSjym break;
53347c04e7bSjym
53447c04e7bSjym break;
53547c04e7bSjym case KAUTH_NETWORK_INTERFACE_TUN:
53647c04e7bSjym switch ((u_long)arg0) {
53747c04e7bSjym 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 */
55847c04e7bSjym 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) {
56747c04e7bSjym 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:
57547c04e7bSjym 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 */
59147c04e7bSjym 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 }
61647c04e7bSjym break;
6177d27a7d8Selad
61847c04e7bSjym case KAUTH_DEVICE_BLUETOOTH_BCSP:
61947c04e7bSjym switch ((u_long)arg0) {
62047c04e7bSjym case KAUTH_REQ_DEVICE_BLUETOOTH_BCSP_ADD:
62147c04e7bSjym default:
62247c04e7bSjym result = KAUTH_RESULT_DEFER;
62347c04e7bSjym break;
62447c04e7bSjym }
62547c04e7bSjym break;
62647c04e7bSjym
62747c04e7bSjym case KAUTH_DEVICE_BLUETOOTH_BTUART:
62847c04e7bSjym switch ((u_long)arg0) {
62947c04e7bSjym case KAUTH_REQ_DEVICE_BLUETOOTH_BTUART_ADD:
63047c04e7bSjym default:
63147c04e7bSjym result = KAUTH_RESULT_DEFER;
63247c04e7bSjym break;
63347c04e7bSjym }
6347d27a7d8Selad break;
6357d27a7d8Selad
6367d27a7d8Selad case KAUTH_DEVICE_RAWIO_PASSTHRU:
63747c04e7bSjym case KAUTH_DEVICE_BLUETOOTH_RECV:
63847c04e7bSjym case KAUTH_DEVICE_BLUETOOTH_SEND:
63947c04e7bSjym case KAUTH_DEVICE_BLUETOOTH_SETPRIV:
64047c04e7bSjym default:
64147c04e7bSjym result = KAUTH_RESULT_DEFER;
64247c04e7bSjym break;
64347c04e7bSjym }
64447c04e7bSjym
64547c04e7bSjym return (result);
64647c04e7bSjym }
64747c04e7bSjym
64847c04e7bSjym /*
64947c04e7bSjym * kauth(9) listener
65047c04e7bSjym *
65147c04e7bSjym * Security model: example
65247c04e7bSjym * Scope: Vnode
65347c04e7bSjym */
65447c04e7bSjym static int
secmodel_example_vnode_cb(kauth_cred_t cred,kauth_action_t action,void * cookie,void * arg0,void * arg1,void * arg2,void * arg3)65547c04e7bSjym secmodel_example_vnode_cb(kauth_cred_t cred, kauth_action_t action,
65647c04e7bSjym void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
65747c04e7bSjym {
65847c04e7bSjym int result;
65947c04e7bSjym
66047c04e7bSjym result = KAUTH_RESULT_DENY;
66147c04e7bSjym
66247c04e7bSjym switch (action) {
66347c04e7bSjym case KAUTH_VNODE_READ_DATA:
66447c04e7bSjym /* KAUTH_VNODE_LIST_DIRECTORY: */
66547c04e7bSjym result = KAUTH_RESULT_DEFER;
66647c04e7bSjym break;
66747c04e7bSjym
66847c04e7bSjym case KAUTH_VNODE_WRITE_DATA:
66947c04e7bSjym /* KAUTH_VNODE_ADD_FILE: */
67047c04e7bSjym result = KAUTH_RESULT_DEFER;
67147c04e7bSjym break;
67247c04e7bSjym
67347c04e7bSjym case KAUTH_VNODE_EXECUTE:
67447c04e7bSjym /* KAUTH_VNODE_SEARCH: */
67547c04e7bSjym result = KAUTH_RESULT_DEFER;
67647c04e7bSjym break;
67747c04e7bSjym
67847c04e7bSjym case KAUTH_VNODE_APPEND_DATA:
67947c04e7bSjym /* KAUTH_VNODE_ADD_SUBDIRECTORY: */
68047c04e7bSjym result = KAUTH_RESULT_DEFER;
68147c04e7bSjym break;
68247c04e7bSjym
68347c04e7bSjym case KAUTH_VNODE_DELETE:
68447c04e7bSjym case KAUTH_VNODE_READ_TIMES:
68547c04e7bSjym case KAUTH_VNODE_WRITE_TIMES:
68647c04e7bSjym case KAUTH_VNODE_READ_FLAGS:
68747c04e7bSjym case KAUTH_VNODE_WRITE_FLAGS:
68847c04e7bSjym case KAUTH_VNODE_READ_SYSFLAGS:
68947c04e7bSjym case KAUTH_VNODE_WRITE_SYSFLAGS:
69047c04e7bSjym case KAUTH_VNODE_RENAME:
69147c04e7bSjym case KAUTH_VNODE_CHANGE_OWNERSHIP:
69247c04e7bSjym case KAUTH_VNODE_READ_SECURITY:
69347c04e7bSjym case KAUTH_VNODE_WRITE_SECURITY:
69447c04e7bSjym case KAUTH_VNODE_READ_ATTRIBUTES:
69547c04e7bSjym case KAUTH_VNODE_WRITE_ATTRIBUTES:
69647c04e7bSjym case KAUTH_VNODE_READ_EXTATTRIBUTES:
69747c04e7bSjym case KAUTH_VNODE_WRITE_EXTATTRIBUTES:
6987d27a7d8Selad default:
6997d27a7d8Selad result = KAUTH_RESULT_DEFER;
7007d27a7d8Selad break;
7017d27a7d8Selad }
7027d27a7d8Selad
7037d27a7d8Selad return (result);
7047d27a7d8Selad }
705