secmodel_suser.c revision 1.54 1 /* $NetBSD: secmodel_suser.c,v 1.54 2020/05/16 19:12:38 alnsn Exp $ */
2 /*-
3 * Copyright (c) 2006 Elad Efrat <elad (at) NetBSD.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 /*
30 * This file contains kauth(9) listeners needed to implement the traditional
31 * NetBSD superuser access restrictions.
32 *
33 * There are two main resources a request can be issued to: user-owned and
34 * system owned. For the first, traditional Unix access checks are done, as
35 * well as superuser checks. If needed, the request context is examined before
36 * a decision is made. For the latter, usually only superuser checks are done
37 * as normal users are not allowed to access system resources.
38 */
39
40 #include <sys/cdefs.h>
41 __KERNEL_RCSID(0, "$NetBSD: secmodel_suser.c,v 1.54 2020/05/16 19:12:38 alnsn Exp $");
42
43 #include <sys/types.h>
44 #include <sys/param.h>
45 #include <sys/kauth.h>
46
47 #include <sys/mutex.h>
48 #include <sys/mount.h>
49 #include <sys/socketvar.h>
50 #include <sys/sysctl.h>
51 #include <sys/vnode.h>
52 #include <sys/proc.h>
53 #include <sys/module.h>
54
55 #include <secmodel/secmodel.h>
56 #include <secmodel/suser/suser.h>
57
58 MODULE(MODULE_CLASS_SECMODEL, suser, NULL);
59
60 static kauth_listener_t l_generic, l_system, l_process, l_network, l_machdep,
61 l_device, l_vnode;
62
63 static secmodel_t suser_sm;
64
65 SYSCTL_SETUP(sysctl_security_suser_setup, "secmodel_user sysctl")
66 {
67 const struct sysctlnode *rnode;
68
69 sysctl_createv(clog, 0, NULL, &rnode,
70 CTLFLAG_PERMANENT,
71 CTLTYPE_NODE, "models", NULL,
72 NULL, 0, NULL, 0,
73 CTL_SECURITY, CTL_CREATE, CTL_EOL);
74
75 sysctl_createv(clog, 0, &rnode, &rnode,
76 CTLFLAG_PERMANENT,
77 CTLTYPE_NODE, "suser", NULL,
78 NULL, 0, NULL, 0,
79 CTL_CREATE, CTL_EOL);
80
81 sysctl_createv(clog, 0, &rnode, NULL,
82 CTLFLAG_PERMANENT,
83 CTLTYPE_STRING, "name", NULL,
84 NULL, 0, __UNCONST(SECMODEL_SUSER_NAME), 0,
85 CTL_CREATE, CTL_EOL);
86 }
87
88 void
89 secmodel_suser_init(void)
90 {
91
92 }
93
94 void
95 secmodel_suser_start(void)
96 {
97 l_generic = kauth_listen_scope(KAUTH_SCOPE_GENERIC,
98 secmodel_suser_generic_cb, NULL);
99 l_system = kauth_listen_scope(KAUTH_SCOPE_SYSTEM,
100 secmodel_suser_system_cb, NULL);
101 l_process = kauth_listen_scope(KAUTH_SCOPE_PROCESS,
102 secmodel_suser_process_cb, NULL);
103 l_network = kauth_listen_scope(KAUTH_SCOPE_NETWORK,
104 secmodel_suser_network_cb, NULL);
105 l_machdep = kauth_listen_scope(KAUTH_SCOPE_MACHDEP,
106 secmodel_suser_machdep_cb, NULL);
107 l_device = kauth_listen_scope(KAUTH_SCOPE_DEVICE,
108 secmodel_suser_device_cb, NULL);
109 l_vnode = kauth_listen_scope(KAUTH_SCOPE_VNODE,
110 secmodel_suser_vnode_cb, NULL);
111 }
112
113 void
114 secmodel_suser_stop(void)
115 {
116 kauth_unlisten_scope(l_generic);
117 kauth_unlisten_scope(l_system);
118 kauth_unlisten_scope(l_process);
119 kauth_unlisten_scope(l_network);
120 kauth_unlisten_scope(l_machdep);
121 kauth_unlisten_scope(l_device);
122 kauth_unlisten_scope(l_vnode);
123 }
124
125 static bool
126 suser_isroot(kauth_cred_t cred)
127 {
128 return kauth_cred_geteuid(cred) == 0;
129 }
130
131 static int
132 suser_eval(const char *what, void *arg, void *ret)
133 {
134 int error = 0;
135
136 if (strcasecmp(what, "is-root") == 0) {
137 kauth_cred_t cred = arg;
138 bool *bp = ret;
139
140 *bp = suser_isroot(cred);
141 } else {
142 error = ENOENT;
143 }
144
145 return error;
146 }
147
148 static int
149 suser_modcmd(modcmd_t cmd, void *arg)
150 {
151 int error = 0;
152
153 switch (cmd) {
154 case MODULE_CMD_INIT:
155 error = secmodel_register(&suser_sm,
156 SECMODEL_SUSER_ID, SECMODEL_SUSER_NAME,
157 NULL, suser_eval, NULL);
158 if (error != 0)
159 printf("suser_modcmd::init: secmodel_register "
160 "returned %d\n", error);
161
162 secmodel_suser_init();
163 secmodel_suser_start();
164 break;
165
166 case MODULE_CMD_FINI:
167 secmodel_suser_stop();
168
169 error = secmodel_deregister(suser_sm);
170 if (error != 0)
171 printf("suser_modcmd::fini: secmodel_deregister "
172 "returned %d\n", error);
173
174 break;
175
176 case MODULE_CMD_AUTOUNLOAD:
177 error = EPERM;
178 break;
179
180 default:
181 error = ENOTTY;
182 break;
183 }
184
185 return (error);
186 }
187
188 /*
189 * kauth(9) listener
190 *
191 * Security model: Traditional NetBSD
192 * Scope: Generic
193 * Responsibility: Superuser access
194 */
195 int
196 secmodel_suser_generic_cb(kauth_cred_t cred, kauth_action_t action,
197 void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
198 {
199 bool isroot;
200 int result;
201
202 isroot = suser_isroot(cred);
203 result = KAUTH_RESULT_DEFER;
204
205 switch (action) {
206 case KAUTH_GENERIC_ISSUSER:
207 if (isroot)
208 result = KAUTH_RESULT_ALLOW;
209 break;
210
211 default:
212 break;
213 }
214
215 return (result);
216 }
217
218 /*
219 * kauth(9) listener
220 *
221 * Security model: Traditional NetBSD
222 * Scope: System
223 * Responsibility: Superuser access
224 */
225 int
226 secmodel_suser_system_cb(kauth_cred_t cred, kauth_action_t action,
227 void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
228 {
229 bool isroot;
230 int result;
231 enum kauth_system_req req;
232
233 isroot = suser_isroot(cred);
234 result = KAUTH_RESULT_DEFER;
235 req = (enum kauth_system_req)(uintptr_t)arg0;
236
237 switch (action) {
238 case KAUTH_SYSTEM_CPU:
239 switch (req) {
240 case KAUTH_REQ_SYSTEM_CPU_SETSTATE:
241 if (isroot)
242 result = KAUTH_RESULT_ALLOW;
243
244 break;
245
246 default:
247 break;
248 }
249
250 break;
251
252 case KAUTH_SYSTEM_DEVMAPPER:
253 if (isroot)
254 result = KAUTH_RESULT_ALLOW;
255
256 break;
257
258 case KAUTH_SYSTEM_FS_QUOTA:
259 switch (req) {
260 case KAUTH_REQ_SYSTEM_FS_QUOTA_GET:
261 case KAUTH_REQ_SYSTEM_FS_QUOTA_ONOFF:
262 case KAUTH_REQ_SYSTEM_FS_QUOTA_MANAGE:
263 case KAUTH_REQ_SYSTEM_FS_QUOTA_NOLIMIT:
264 if (isroot)
265 result = KAUTH_RESULT_ALLOW;
266 break;
267
268 default:
269 break;
270 }
271
272 break;
273
274 case KAUTH_SYSTEM_SYSVIPC:
275 switch (req) {
276 case KAUTH_REQ_SYSTEM_SYSVIPC_BYPASS:
277 case KAUTH_REQ_SYSTEM_SYSVIPC_SHM_LOCK:
278 case KAUTH_REQ_SYSTEM_SYSVIPC_SHM_UNLOCK:
279 case KAUTH_REQ_SYSTEM_SYSVIPC_MSGQ_OVERSIZE:
280 if (isroot)
281 result = KAUTH_RESULT_ALLOW;
282
283 break;
284
285 default:
286 break;
287 }
288
289 break;
290
291 case KAUTH_SYSTEM_MOUNT:
292 switch (req) {
293 case KAUTH_REQ_SYSTEM_MOUNT_DEVICE:
294 case KAUTH_REQ_SYSTEM_MOUNT_GET:
295 case KAUTH_REQ_SYSTEM_MOUNT_NEW:
296 case KAUTH_REQ_SYSTEM_MOUNT_UNMOUNT:
297 case KAUTH_REQ_SYSTEM_MOUNT_UPDATE:
298 case KAUTH_REQ_SYSTEM_MOUNT_UMAP:
299 if (isroot) {
300 result = KAUTH_RESULT_ALLOW;
301 break;
302 }
303
304 break;
305
306 default:
307 break;
308 }
309
310 break;
311
312 case KAUTH_SYSTEM_MQUEUE:
313 if (isroot)
314 result = KAUTH_RESULT_ALLOW;
315
316 break;
317
318 case KAUTH_SYSTEM_PSET:
319 switch (req) {
320 case KAUTH_REQ_SYSTEM_PSET_ASSIGN:
321 case KAUTH_REQ_SYSTEM_PSET_BIND:
322 case KAUTH_REQ_SYSTEM_PSET_CREATE:
323 case KAUTH_REQ_SYSTEM_PSET_DESTROY:
324 if (isroot)
325 result = KAUTH_RESULT_ALLOW;
326
327 break;
328
329 default:
330 break;
331 }
332
333 break;
334
335 case KAUTH_SYSTEM_TIME:
336 switch (req) {
337 case KAUTH_REQ_SYSTEM_TIME_ADJTIME:
338 case KAUTH_REQ_SYSTEM_TIME_NTPADJTIME:
339 case KAUTH_REQ_SYSTEM_TIME_TIMECOUNTERS:
340 case KAUTH_REQ_SYSTEM_TIME_SYSTEM:
341 case KAUTH_REQ_SYSTEM_TIME_RTCOFFSET:
342 if (isroot)
343 result = KAUTH_RESULT_ALLOW;
344 break;
345
346 default:
347 break;
348 }
349 break;
350
351 case KAUTH_SYSTEM_SEMAPHORE:
352 if (isroot)
353 result = KAUTH_RESULT_ALLOW;
354
355 break;
356
357 case KAUTH_SYSTEM_SYSCTL:
358 switch (req) {
359 case KAUTH_REQ_SYSTEM_SYSCTL_ADD:
360 case KAUTH_REQ_SYSTEM_SYSCTL_DELETE:
361 case KAUTH_REQ_SYSTEM_SYSCTL_DESC:
362 case KAUTH_REQ_SYSTEM_SYSCTL_MODIFY:
363 case KAUTH_REQ_SYSTEM_SYSCTL_PRVT:
364 if (isroot)
365 result = KAUTH_RESULT_ALLOW;
366 break;
367
368 default:
369 break;
370 }
371
372 break;
373
374 case KAUTH_SYSTEM_SWAPCTL:
375 case KAUTH_SYSTEM_ACCOUNTING:
376 case KAUTH_SYSTEM_REBOOT:
377 case KAUTH_SYSTEM_CHROOT:
378 case KAUTH_SYSTEM_FILEHANDLE:
379 case KAUTH_SYSTEM_MKNOD:
380 case KAUTH_SYSTEM_SETIDCORE:
381 case KAUTH_SYSTEM_MODULE:
382 case KAUTH_SYSTEM_FS_RESERVEDSPACE:
383 case KAUTH_SYSTEM_MAP_VA_ZERO:
384 case KAUTH_SYSTEM_FS_EXTATTR:
385 case KAUTH_SYSTEM_FS_SNAPSHOT:
386 if (isroot)
387 result = KAUTH_RESULT_ALLOW;
388 break;
389
390 case KAUTH_SYSTEM_DEBUG:
391 break;
392
393 case KAUTH_SYSTEM_CHSYSFLAGS:
394 /* Deprecated. */
395 if (isroot)
396 result = KAUTH_RESULT_ALLOW;
397
398 break;
399
400 case KAUTH_SYSTEM_VERIEXEC:
401 switch (req) {
402 case KAUTH_REQ_SYSTEM_VERIEXEC_ACCESS:
403 case KAUTH_REQ_SYSTEM_VERIEXEC_MODIFY:
404 if (isroot)
405 result = KAUTH_RESULT_ALLOW;
406
407 break;
408
409 default:
410 break;
411 }
412
413 break;
414
415 case KAUTH_SYSTEM_LFS:
416 switch (req) {
417 case KAUTH_REQ_SYSTEM_LFS_MARKV:
418 case KAUTH_REQ_SYSTEM_LFS_BMAPV:
419 case KAUTH_REQ_SYSTEM_LFS_SEGCLEAN:
420 case KAUTH_REQ_SYSTEM_LFS_SEGWAIT:
421 case KAUTH_REQ_SYSTEM_LFS_FCNTL:
422 if (isroot)
423 result = KAUTH_RESULT_ALLOW;
424
425 default:
426 break;
427 }
428
429 break;
430
431 case KAUTH_SYSTEM_INTR:
432 switch (req) {
433 case KAUTH_REQ_SYSTEM_INTR_AFFINITY:
434 if (isroot)
435 result = KAUTH_RESULT_ALLOW;
436
437 break;
438
439 default:
440 break;
441 }
442
443 break;
444
445 case KAUTH_SYSTEM_KERNADDR:
446 if (isroot)
447 result = KAUTH_RESULT_ALLOW;
448
449 break;
450
451 default:
452 break;
453 }
454
455 return (result);
456 }
457
458 /*
459 * kauth(9) listener
460 *
461 * Security model: Traditional NetBSD
462 * Scope: Process
463 * Responsibility: Superuser access
464 */
465 int
466 secmodel_suser_process_cb(kauth_cred_t cred, kauth_action_t action,
467 void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
468 {
469 bool isroot;
470 int result;
471
472 isroot = suser_isroot(cred);
473 result = KAUTH_RESULT_DEFER;
474
475 switch (action) {
476 case KAUTH_PROCESS_SIGNAL:
477 case KAUTH_PROCESS_KTRACE:
478 case KAUTH_PROCESS_PROCFS:
479 case KAUTH_PROCESS_PTRACE:
480 case KAUTH_PROCESS_SCHEDULER_GETPARAM:
481 case KAUTH_PROCESS_SCHEDULER_SETPARAM:
482 case KAUTH_PROCESS_SCHEDULER_GETAFFINITY:
483 case KAUTH_PROCESS_SCHEDULER_SETAFFINITY:
484 case KAUTH_PROCESS_SETID:
485 case KAUTH_PROCESS_KEVENT_FILTER:
486 case KAUTH_PROCESS_NICE:
487 case KAUTH_PROCESS_FORK:
488 case KAUTH_PROCESS_CORENAME:
489 case KAUTH_PROCESS_STOPFLAG:
490 if (isroot)
491 result = KAUTH_RESULT_ALLOW;
492
493 break;
494
495 case KAUTH_PROCESS_CANSEE: {
496 unsigned long req;
497
498 req = (unsigned long)arg1;
499
500 switch (req) {
501 case KAUTH_REQ_PROCESS_CANSEE_ARGS:
502 case KAUTH_REQ_PROCESS_CANSEE_ENTRY:
503 case KAUTH_REQ_PROCESS_CANSEE_OPENFILES:
504 case KAUTH_REQ_PROCESS_CANSEE_EPROC:
505 case KAUTH_REQ_PROCESS_CANSEE_KPTR:
506 if (isroot) {
507 result = KAUTH_RESULT_ALLOW;
508 break;
509 }
510
511 break;
512
513 case KAUTH_REQ_PROCESS_CANSEE_ENV:
514 if (isroot)
515 result = KAUTH_RESULT_ALLOW;
516
517 break;
518
519 default:
520 break;
521 }
522
523 break;
524 }
525
526 case KAUTH_PROCESS_RLIMIT: {
527 enum kauth_process_req req;
528
529 req = (enum kauth_process_req)(uintptr_t)arg1;
530
531 switch (req) {
532 case KAUTH_REQ_PROCESS_RLIMIT_SET:
533 case KAUTH_REQ_PROCESS_RLIMIT_GET:
534 case KAUTH_REQ_PROCESS_RLIMIT_BYPASS:
535 if (isroot)
536 result = KAUTH_RESULT_ALLOW;
537
538 break;
539
540 default:
541 break;
542 }
543
544 break;
545 }
546
547 default:
548 break;
549 }
550
551 return (result);
552 }
553
554 /*
555 * kauth(9) listener
556 *
557 * Security model: Traditional NetBSD
558 * Scope: Network
559 * Responsibility: Superuser access
560 */
561 int
562 secmodel_suser_network_cb(kauth_cred_t cred, kauth_action_t action,
563 void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
564 {
565 bool isroot;
566 int result;
567 enum kauth_network_req req;
568
569 isroot = suser_isroot(cred);
570 result = KAUTH_RESULT_DEFER;
571 req = (enum kauth_network_req)(uintptr_t)arg0;
572
573 switch (action) {
574 case KAUTH_NETWORK_ALTQ:
575 switch (req) {
576 case KAUTH_REQ_NETWORK_ALTQ_AFMAP:
577 case KAUTH_REQ_NETWORK_ALTQ_BLUE:
578 case KAUTH_REQ_NETWORK_ALTQ_CBQ:
579 case KAUTH_REQ_NETWORK_ALTQ_CDNR:
580 case KAUTH_REQ_NETWORK_ALTQ_CONF:
581 case KAUTH_REQ_NETWORK_ALTQ_FIFOQ:
582 case KAUTH_REQ_NETWORK_ALTQ_HFSC:
583 case KAUTH_REQ_NETWORK_ALTQ_JOBS:
584 case KAUTH_REQ_NETWORK_ALTQ_PRIQ:
585 case KAUTH_REQ_NETWORK_ALTQ_RED:
586 case KAUTH_REQ_NETWORK_ALTQ_RIO:
587 case KAUTH_REQ_NETWORK_ALTQ_WFQ:
588 if (isroot)
589 result = KAUTH_RESULT_ALLOW;
590 break;
591
592 default:
593 break;
594 }
595
596 break;
597
598 case KAUTH_NETWORK_BIND:
599 switch (req) {
600 case KAUTH_REQ_NETWORK_BIND_PORT:
601 case KAUTH_REQ_NETWORK_BIND_PRIVPORT:
602 if (isroot)
603 result = KAUTH_RESULT_ALLOW;
604 break;
605
606 default:
607 break;
608 }
609 break;
610
611 case KAUTH_NETWORK_FIREWALL:
612 switch (req) {
613 case KAUTH_REQ_NETWORK_FIREWALL_FW:
614 case KAUTH_REQ_NETWORK_FIREWALL_NAT:
615 if (isroot)
616 result = KAUTH_RESULT_ALLOW;
617
618 break;
619
620 default:
621 break;
622 }
623 break;
624
625 case KAUTH_NETWORK_FORWSRCRT:
626 case KAUTH_NETWORK_ROUTE:
627 if (isroot)
628 result = KAUTH_RESULT_ALLOW;
629
630 break;
631
632 case KAUTH_NETWORK_INTERFACE:
633 switch (req) {
634 case KAUTH_REQ_NETWORK_INTERFACE_GET:
635 case KAUTH_REQ_NETWORK_INTERFACE_SET:
636 case KAUTH_REQ_NETWORK_INTERFACE_GETPRIV:
637 case KAUTH_REQ_NETWORK_INTERFACE_SETPRIV:
638 case KAUTH_REQ_NETWORK_INTERFACE_FIRMWARE:
639 if (isroot)
640 result = KAUTH_RESULT_ALLOW;
641 break;
642
643 default:
644 break;
645 }
646 break;
647
648 case KAUTH_NETWORK_INTERFACE_BRIDGE:
649 switch (req) {
650 case KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_GETPRIV:
651 case KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_SETPRIV:
652 if (isroot)
653 result = KAUTH_RESULT_ALLOW;
654 break;
655
656 default:
657 break;
658 }
659
660 break;
661
662 case KAUTH_NETWORK_INTERFACE_PPP:
663 switch (req) {
664 case KAUTH_REQ_NETWORK_INTERFACE_PPP_ADD:
665 if (isroot)
666 result = KAUTH_RESULT_ALLOW;
667 break;
668
669 default:
670 break;
671 }
672
673 break;
674
675 case KAUTH_NETWORK_INTERFACE_PVC:
676 switch (req) {
677 case KAUTH_REQ_NETWORK_INTERFACE_PVC_ADD:
678 if (isroot)
679 result = KAUTH_RESULT_ALLOW;
680
681 break;
682
683 default:
684 break;
685 }
686
687 break;
688
689 case KAUTH_NETWORK_INTERFACE_SLIP:
690 switch (req) {
691 case KAUTH_REQ_NETWORK_INTERFACE_SLIP_ADD:
692 if (isroot)
693 result = KAUTH_RESULT_ALLOW;
694 break;
695
696 default:
697 break;
698 }
699
700 break;
701
702 case KAUTH_NETWORK_INTERFACE_STRIP:
703 switch (req) {
704 case KAUTH_REQ_NETWORK_INTERFACE_STRIP_ADD:
705 if (isroot)
706 result = KAUTH_RESULT_ALLOW;
707 break;
708
709 default:
710 break;
711 }
712
713 break;
714
715 case KAUTH_NETWORK_INTERFACE_TUN:
716 switch (req) {
717 case KAUTH_REQ_NETWORK_INTERFACE_TUN_ADD:
718 if (isroot)
719 result = KAUTH_RESULT_ALLOW;
720 break;
721
722 default:
723 break;
724 }
725
726 break;
727
728 case KAUTH_NETWORK_IPV6:
729 switch (req) {
730 case KAUTH_REQ_NETWORK_IPV6_HOPBYHOP:
731 case KAUTH_REQ_NETWORK_IPV6_JOIN_MULTICAST:
732 if (isroot)
733 result = KAUTH_RESULT_ALLOW;
734
735 break;
736
737 default:
738 break;
739 }
740
741 break;
742
743 case KAUTH_NETWORK_NFS:
744 switch (req) {
745 case KAUTH_REQ_NETWORK_NFS_EXPORT:
746 case KAUTH_REQ_NETWORK_NFS_SVC:
747 if (isroot)
748 result = KAUTH_RESULT_ALLOW;
749
750 break;
751
752 default:
753 break;
754 }
755 break;
756
757 case KAUTH_NETWORK_SMB:
758 switch (req) {
759 case KAUTH_REQ_NETWORK_SMB_SHARE_ACCESS:
760 case KAUTH_REQ_NETWORK_SMB_SHARE_CREATE:
761 case KAUTH_REQ_NETWORK_SMB_VC_ACCESS:
762 case KAUTH_REQ_NETWORK_SMB_VC_CREATE:
763 if (isroot)
764 result = KAUTH_RESULT_ALLOW;
765
766 break;
767
768 default:
769 break;
770 }
771
772 break;
773
774 case KAUTH_NETWORK_SOCKET:
775 switch (req) {
776 case KAUTH_REQ_NETWORK_SOCKET_DROP:
777 case KAUTH_REQ_NETWORK_SOCKET_OPEN:
778 case KAUTH_REQ_NETWORK_SOCKET_RAWSOCK:
779 case KAUTH_REQ_NETWORK_SOCKET_SETPRIV:
780 if (isroot)
781 result = KAUTH_RESULT_ALLOW;
782 break;
783
784 case KAUTH_REQ_NETWORK_SOCKET_CANSEE:
785 if (isroot) {
786 result = KAUTH_RESULT_ALLOW;
787 break;
788 }
789
790 break;
791
792 default:
793 break;
794 }
795
796 break;
797
798 case KAUTH_NETWORK_IPSEC:
799 switch (req) {
800 case KAUTH_REQ_NETWORK_IPSEC_BYPASS:
801 if (isroot)
802 result = KAUTH_RESULT_ALLOW;
803
804 break;
805
806 default:
807 break;
808 }
809
810 break;
811
812 default:
813 break;
814 }
815
816 return (result);
817 }
818
819 /*
820 * kauth(9) listener
821 *
822 * Security model: Traditional NetBSD
823 * Scope: Machdep
824 * Responsibility: Superuser access
825 */
826 int
827 secmodel_suser_machdep_cb(kauth_cred_t cred, kauth_action_t action,
828 void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
829 {
830 bool isroot;
831 int result;
832
833 isroot = suser_isroot(cred);
834 result = KAUTH_RESULT_DEFER;
835
836 switch (action) {
837 case KAUTH_MACHDEP_CPU_UCODE_APPLY:
838 case KAUTH_MACHDEP_IOPERM_GET:
839 case KAUTH_MACHDEP_LDT_GET:
840 case KAUTH_MACHDEP_LDT_SET:
841 case KAUTH_MACHDEP_MTRR_GET:
842 case KAUTH_MACHDEP_CACHEFLUSH:
843 case KAUTH_MACHDEP_IOPERM_SET:
844 case KAUTH_MACHDEP_IOPL:
845 case KAUTH_MACHDEP_MTRR_SET:
846 case KAUTH_MACHDEP_NVRAM:
847 case KAUTH_MACHDEP_UNMANAGEDMEM:
848 case KAUTH_MACHDEP_PXG:
849 if (isroot)
850 result = KAUTH_RESULT_ALLOW;
851 break;
852
853 case KAUTH_MACHDEP_SVS_DISABLE:
854 /* Deprecated. */
855 if (isroot)
856 result = KAUTH_RESULT_ALLOW;
857 break;
858
859 default:
860 break;
861 }
862
863 return (result);
864 }
865
866 /*
867 * kauth(9) listener
868 *
869 * Security model: Traditional NetBSD
870 * Scope: Device
871 * Responsibility: Superuser access
872 */
873 int
874 secmodel_suser_device_cb(kauth_cred_t cred, kauth_action_t action,
875 void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
876 {
877 bool isroot;
878 int result;
879
880 isroot = suser_isroot(cred);
881 result = KAUTH_RESULT_DEFER;
882
883 switch (action) {
884 case KAUTH_DEVICE_BLUETOOTH_SETPRIV:
885 case KAUTH_DEVICE_BLUETOOTH_SEND:
886 case KAUTH_DEVICE_BLUETOOTH_RECV:
887 case KAUTH_DEVICE_TTY_OPEN:
888 case KAUTH_DEVICE_TTY_PRIVSET:
889 case KAUTH_DEVICE_TTY_STI:
890 case KAUTH_DEVICE_TTY_VIRTUAL:
891 case KAUTH_DEVICE_RND_ADDDATA:
892 case KAUTH_DEVICE_RND_ADDDATA_ESTIMATE:
893 case KAUTH_DEVICE_RND_GETPRIV:
894 case KAUTH_DEVICE_RND_SETPRIV:
895 case KAUTH_DEVICE_WSCONS_KEYBOARD_BELL:
896 case KAUTH_DEVICE_WSCONS_KEYBOARD_KEYREPEAT:
897 case KAUTH_DEVICE_NVMM_CTL:
898 if (isroot)
899 result = KAUTH_RESULT_ALLOW;
900 break;
901
902 case KAUTH_DEVICE_BLUETOOTH_BCSP:
903 case KAUTH_DEVICE_BLUETOOTH_BTUART: {
904 enum kauth_device_req req;
905
906 req = (enum kauth_device_req)(uintptr_t)arg0;
907 switch (req) {
908 case KAUTH_REQ_DEVICE_BLUETOOTH_BCSP_ADD:
909 case KAUTH_REQ_DEVICE_BLUETOOTH_BTUART_ADD:
910 if (isroot)
911 result = KAUTH_RESULT_ALLOW;
912 break;
913
914 default:
915 break;
916 }
917
918 break;
919 }
920
921 case KAUTH_DEVICE_GPIO_PINSET:
922 /*
923 * root can access gpio pins, secmodel_securlevel can veto
924 * this decision.
925 */
926 if (isroot)
927 result = KAUTH_RESULT_ALLOW;
928 break;
929
930 default:
931 break;
932 }
933
934 return (result);
935 }
936
937 int
938 secmodel_suser_vnode_cb(kauth_cred_t cred, kauth_action_t action,
939 void *cookie, void *arg0, void *arg1, void *arg2, void *arg3)
940 {
941 bool isroot;
942 int result;
943
944 isroot = suser_isroot(cred);
945 result = KAUTH_RESULT_DEFER;
946
947 if (isroot) {
948 /* Superuser can execute only if the file's executable. */
949 if ((action & KAUTH_VNODE_EXECUTE) == 0 ||
950 (action & KAUTH_VNODE_IS_EXEC))
951 result = KAUTH_RESULT_ALLOW;
952 }
953
954 return (result);
955 }
956
957