Module Name: src Committed By: elad Date: Sat Nov 14 18:36:57 UTC 2009
Modified Files: src/sys/kern: init_main.c src/sys/miscfs/specfs: spec_vnops.c specdev.h src/sys/secmodel/suser: secmodel_suser.c Log Message: - Move kauth_init() a little bit higher. - Add spec_init() to authorize special device actions (and passthru too for the time being). Move policy out of secmodel_suser. To generate a diff of this commit: cvs rdiff -u -r1.408 -r1.409 src/sys/kern/init_main.c cvs rdiff -u -r1.126 -r1.127 src/sys/miscfs/specfs/spec_vnops.c cvs rdiff -u -r1.38 -r1.39 src/sys/miscfs/specfs/specdev.h cvs rdiff -u -r1.30 -r1.31 src/sys/secmodel/suser/secmodel_suser.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/init_main.c diff -u src/sys/kern/init_main.c:1.408 src/sys/kern/init_main.c:1.409 --- src/sys/kern/init_main.c:1.408 Tue Nov 3 05:23:28 2009 +++ src/sys/kern/init_main.c Sat Nov 14 18:36:57 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: init_main.c,v 1.408 2009/11/03 05:23:28 dyoung Exp $ */ +/* $NetBSD: init_main.c,v 1.409 2009/11/14 18:36:57 elad Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -97,7 +97,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.408 2009/11/03 05:23:28 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.409 2009/11/14 18:36:57 elad Exp $"); #include "opt_ddb.h" #include "opt_ipsec.h" @@ -338,6 +338,11 @@ /* Initialize callouts, part 1. */ callout_startup(); + /* Initialize the kernel authorization subsystem. */ + kauth_init(); + + spec_init(); + /* Start module system. */ module_init(); @@ -349,7 +354,6 @@ * credential inheritance policy, it is needed at least before * any process is created, specifically proc0. */ - kauth_init(); module_init_class(MODULE_CLASS_SECMODEL); /* Initialize the buffer cache */ Index: src/sys/miscfs/specfs/spec_vnops.c diff -u src/sys/miscfs/specfs/spec_vnops.c:1.126 src/sys/miscfs/specfs/spec_vnops.c:1.127 --- src/sys/miscfs/specfs/spec_vnops.c:1.126 Tue Oct 6 04:28:10 2009 +++ src/sys/miscfs/specfs/spec_vnops.c Sat Nov 14 18:36:57 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: spec_vnops.c,v 1.126 2009/10/06 04:28:10 elad Exp $ */ +/* $NetBSD: spec_vnops.c,v 1.127 2009/11/14 18:36:57 elad Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.126 2009/10/06 04:28:10 elad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.127 2009/11/14 18:36:57 elad Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -151,6 +151,8 @@ const struct vnodeopv_desc spec_vnodeop_opv_desc = { &spec_vnodeop_p, spec_vnodeop_entries }; +static kauth_listener_t rawio_listener; + /* Returns true if vnode is /dev/mem or /dev/kmem. */ bool iskmemvp(struct vnode *vp) @@ -171,6 +173,32 @@ return (major(dev) == mem_no && (minor(dev) < 2 || minor(dev) == 14)); } +static int +rawio_listener_cb(kauth_cred_t cred, kauth_action_t action, void *cookie, + void *arg0, void *arg1, void *arg2, void *arg3) +{ + int result; + + result = KAUTH_RESULT_DEFER; + + if ((action != KAUTH_DEVICE_RAWIO_SPEC) && + (action != KAUTH_DEVICE_RAWIO_PASSTHRU)) + return result; + + /* Access is mandated by permissions. */ + result = KAUTH_RESULT_ALLOW; + + return result; +} + +void +spec_init(void) +{ + + rawio_listener = kauth_listen_scope(KAUTH_SCOPE_DEVICE, + rawio_listener_cb, NULL); +} + /* * Initialize a vnode that represents a device. */ Index: src/sys/miscfs/specfs/specdev.h diff -u src/sys/miscfs/specfs/specdev.h:1.38 src/sys/miscfs/specfs/specdev.h:1.39 --- src/sys/miscfs/specfs/specdev.h:1.38 Tue Oct 6 04:28:11 2009 +++ src/sys/miscfs/specfs/specdev.h Sat Nov 14 18:36:57 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: specdev.h,v 1.38 2009/10/06 04:28:11 elad Exp $ */ +/* $NetBSD: specdev.h,v 1.39 2009/11/14 18:36:57 elad Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -156,5 +156,6 @@ #define spec_putpages genfs_putpages bool iskmemvp(struct vnode *); +void spec_init(void); #endif /* _MISCFS_SPECFS_SPECDEV_H_ */ Index: src/sys/secmodel/suser/secmodel_suser.c diff -u src/sys/secmodel/suser/secmodel_suser.c:1.30 src/sys/secmodel/suser/secmodel_suser.c:1.31 --- src/sys/secmodel/suser/secmodel_suser.c:1.30 Wed Oct 7 01:31:41 2009 +++ src/sys/secmodel/suser/secmodel_suser.c Sat Nov 14 18:36:56 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: secmodel_suser.c,v 1.30 2009/10/07 01:31:41 elad Exp $ */ +/* $NetBSD: secmodel_suser.c,v 1.31 2009/11/14 18:36:56 elad Exp $ */ /*- * Copyright (c) 2006 Elad Efrat <e...@netbsd.org> * All rights reserved. @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: secmodel_suser.c,v 1.30 2009/10/07 01:31:41 elad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: secmodel_suser.c,v 1.31 2009/11/14 18:36:56 elad Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -873,17 +873,6 @@ break; } - case KAUTH_DEVICE_RAWIO_SPEC: - case KAUTH_DEVICE_RAWIO_PASSTHRU: - /* - * Decision is root-agnostic. - * - * Both requests can be issued on devices subject to their - * permission bits. - */ - result = KAUTH_RESULT_ALLOW; - break; - case KAUTH_DEVICE_GPIO_PINSET: /* * root can access gpio pins, secmodel_securlevel can veto