Home | History | Annotate | Line # | Download | only in sys
      1 /* $NetBSD: kauth.h,v 1.90 2023/10/04 22:17:09 ad Exp $ */
      2 
      3 /*-
      4  * Copyright (c) 2005, 2006 Elad Efrat <elad (at) NetBSD.org>
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  * 3. The name of the author may not be used to endorse or promote products
     16  *    derived from this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28  */
     29 
     30 /*
     31  * This is based on Apple TN2127, available online at
     32  * http://developer.apple.com/technotes/tn2005/tn2127.html
     33  */
     34 
     35 #ifndef _SYS_KAUTH_H_
     36 #define	_SYS_KAUTH_H_
     37 
     38 #include <secmodel/secmodel.h> /* for secmodel_t type */
     39 #include <sys/stat.h> /* for modes */
     40 
     41 struct uucred;
     42 struct ki_ucred;
     43 struct ki_pcred;
     44 struct proc;
     45 struct tty;
     46 struct vnode;
     47 struct cwdinfo;
     48 
     49 enum uio_seg;
     50 
     51 /* Types. */
     52 typedef struct kauth_scope     *kauth_scope_t;
     53 typedef struct kauth_listener  *kauth_listener_t;
     54 typedef uint64_t		kauth_action_t;
     55 typedef int (*kauth_scope_callback_t)(kauth_cred_t, kauth_action_t,
     56 				      void *, void *, void *, void *, void *);
     57 typedef	struct kauth_key       *kauth_key_t;
     58 
     59 #ifdef __KAUTH_PRIVATE	/* For the debugger */
     60 
     61 #include <sys/types.h>
     62 #include <sys/specificdata.h>
     63 
     64 /*
     65  * Credentials.
     66  *
     67  * A subset of this structure is used in kvm(3) (src/lib/libkvm/kvm_proc.c)
     68  * and should be synchronized with this structure when the update is
     69  * relevant.
     70  */
     71 struct kauth_cred {
     72 	/*
     73 	 * Ensure that the first part of the credential resides in its own
     74 	 * cache line.  Due to sharing there aren't many kauth_creds in a
     75 	 * typical system, but the reference counts change very often.
     76 	 * Keeping it separate from the rest of the data prevents false
     77 	 * sharing between CPUs.
     78 	 */
     79 	u_int cr_refcnt;		/* reference count */
     80 #if COHERENCY_UNIT > 4
     81 	uint8_t cr_pad[COHERENCY_UNIT - 4];
     82 #endif
     83 	uid_t cr_uid;			/* user id */
     84 	uid_t cr_euid;			/* effective user id */
     85 	uid_t cr_svuid;			/* saved effective user id */
     86 	gid_t cr_gid;			/* group id */
     87 	gid_t cr_egid;			/* effective group id */
     88 	gid_t cr_svgid;			/* saved effective group id */
     89 	u_int cr_ngroups;		/* number of groups */
     90 	gid_t cr_groups[NGROUPS];	/* group memberships */
     91 	specificdata_reference cr_sd;	/* specific data */
     92 };
     93 
     94 #endif
     95 
     96 /*
     97  * Possible return values for a listener.
     98  */
     99 #define	KAUTH_RESULT_ALLOW	0	/* allow access */
    100 #define	KAUTH_RESULT_DENY	1	/* deny access */
    101 #define	KAUTH_RESULT_DEFER	2	/* let others decide */
    102 
    103 /*
    104  * Scopes.
    105  */
    106 #define	KAUTH_SCOPE_GENERIC	"org.netbsd.kauth.generic"
    107 #define	KAUTH_SCOPE_SYSTEM	"org.netbsd.kauth.system"
    108 #define	KAUTH_SCOPE_PROCESS	"org.netbsd.kauth.process"
    109 #define	KAUTH_SCOPE_NETWORK	"org.netbsd.kauth.network"
    110 #define	KAUTH_SCOPE_MACHDEP	"org.netbsd.kauth.machdep"
    111 #define	KAUTH_SCOPE_DEVICE	"org.netbsd.kauth.device"
    112 #define	KAUTH_SCOPE_CRED	"org.netbsd.kauth.cred"
    113 #define	KAUTH_SCOPE_VNODE	"org.netbsd.kauth.vnode"
    114 
    115 /*
    116  * Generic scope - actions.
    117  */
    118 enum {
    119 	KAUTH_GENERIC_UNUSED1=1,
    120 	KAUTH_GENERIC_ISSUSER,
    121 };
    122 
    123 /*
    124  * System scope - actions.
    125  */
    126 enum {
    127 	KAUTH_SYSTEM_ACCOUNTING=1,
    128 	KAUTH_SYSTEM_CHROOT,
    129 	KAUTH_SYSTEM_CHSYSFLAGS,
    130 	KAUTH_SYSTEM_CPU,
    131 	KAUTH_SYSTEM_DEBUG,
    132 	KAUTH_SYSTEM_FILEHANDLE,
    133 	KAUTH_SYSTEM_MKNOD,
    134 	KAUTH_SYSTEM_MOUNT,
    135 	KAUTH_SYSTEM_PSET,
    136 	KAUTH_SYSTEM_REBOOT,
    137 	KAUTH_SYSTEM_SETIDCORE,
    138 	KAUTH_SYSTEM_SWAPCTL,
    139 	KAUTH_SYSTEM_SYSCTL,
    140 	KAUTH_SYSTEM_TIME,
    141 	KAUTH_SYSTEM_MODULE,
    142 	KAUTH_SYSTEM_FS_RESERVEDSPACE,
    143 	KAUTH_SYSTEM_FS_QUOTA,
    144 	KAUTH_SYSTEM_SEMAPHORE,
    145 	KAUTH_SYSTEM_SYSVIPC,
    146 	KAUTH_SYSTEM_MQUEUE,
    147 	KAUTH_SYSTEM_VERIEXEC,
    148 	KAUTH_SYSTEM_DEVMAPPER,
    149 	KAUTH_SYSTEM_MAP_VA_ZERO,
    150 	KAUTH_SYSTEM_LFS,
    151 	KAUTH_SYSTEM_FS_EXTATTR,
    152 	KAUTH_SYSTEM_FS_SNAPSHOT,
    153 	KAUTH_SYSTEM_INTR,
    154 	KAUTH_SYSTEM_KERNADDR,
    155 };
    156 
    157 /*
    158  * System scope - sub-actions.
    159  */
    160 enum kauth_system_req {
    161 	KAUTH_REQ_SYSTEM_CHROOT_CHROOT=1,
    162 	KAUTH_REQ_SYSTEM_CHROOT_FCHROOT,
    163 	KAUTH_REQ_SYSTEM_CPU_SETSTATE,
    164 	KAUTH_REQ_SYSTEM_MOUNT_GET,
    165 	KAUTH_REQ_SYSTEM_MOUNT_NEW,
    166 	KAUTH_REQ_SYSTEM_MOUNT_UNMOUNT,
    167 	KAUTH_REQ_SYSTEM_MOUNT_UPDATE,
    168 	KAUTH_REQ_SYSTEM_PSET_ASSIGN,
    169 	KAUTH_REQ_SYSTEM_PSET_BIND,
    170 	KAUTH_REQ_SYSTEM_PSET_CREATE,
    171 	KAUTH_REQ_SYSTEM_PSET_DESTROY,
    172 	KAUTH_REQ_SYSTEM_SYSCTL_ADD,
    173 	KAUTH_REQ_SYSTEM_SYSCTL_DELETE,
    174 	KAUTH_REQ_SYSTEM_SYSCTL_DESC,
    175 	KAUTH_REQ_SYSTEM_SYSCTL_MODIFY,
    176 	KAUTH_REQ_SYSTEM_SYSCTL_PRVT,
    177 	KAUTH_REQ_SYSTEM_TIME_ADJTIME,
    178 	KAUTH_REQ_SYSTEM_TIME_NTPADJTIME,
    179 	KAUTH_REQ_SYSTEM_TIME_RTCOFFSET,
    180 	KAUTH_REQ_SYSTEM_TIME_SYSTEM,
    181 	KAUTH_REQ_SYSTEM_TIME_TIMECOUNTERS,
    182 	KAUTH_REQ_SYSTEM_FS_QUOTA_GET,
    183 	KAUTH_REQ_SYSTEM_FS_QUOTA_MANAGE,
    184 	KAUTH_REQ_SYSTEM_FS_QUOTA_NOLIMIT,
    185 	KAUTH_REQ_SYSTEM_FS_QUOTA_ONOFF,
    186 	KAUTH_REQ_SYSTEM_SYSVIPC_BYPASS,
    187 	KAUTH_REQ_SYSTEM_SYSVIPC_SHM_LOCK,
    188 	KAUTH_REQ_SYSTEM_SYSVIPC_SHM_UNLOCK,
    189 	KAUTH_REQ_SYSTEM_SYSVIPC_MSGQ_OVERSIZE,
    190 	KAUTH_REQ_SYSTEM_VERIEXEC_ACCESS,
    191 	KAUTH_REQ_SYSTEM_VERIEXEC_MODIFY,
    192 	KAUTH_REQ_SYSTEM_LFS_MARKV,
    193 	KAUTH_REQ_SYSTEM_LFS_BMAPV,
    194 	KAUTH_REQ_SYSTEM_LFS_SEGCLEAN,
    195 	KAUTH_REQ_SYSTEM_LFS_SEGWAIT,
    196 	KAUTH_REQ_SYSTEM_LFS_FCNTL,
    197 	KAUTH_REQ_SYSTEM_MOUNT_UMAP,
    198 	KAUTH_REQ_SYSTEM_MOUNT_DEVICE,
    199 	KAUTH_REQ_SYSTEM_INTR_AFFINITY,
    200 };
    201 
    202 /*
    203  * Process scope - actions.
    204  */
    205 enum {
    206 	KAUTH_PROCESS_CANSEE=1,
    207 	KAUTH_PROCESS_CORENAME,
    208 	KAUTH_PROCESS_FORK,
    209 	KAUTH_PROCESS_KEVENT_FILTER,
    210 	KAUTH_PROCESS_KTRACE,
    211 	KAUTH_PROCESS_NICE,
    212 	KAUTH_PROCESS_PROCFS,
    213 	KAUTH_PROCESS_PTRACE,
    214 	KAUTH_PROCESS_RLIMIT,
    215 	KAUTH_PROCESS_SCHEDULER_GETAFFINITY,
    216 	KAUTH_PROCESS_SCHEDULER_SETAFFINITY,
    217 	KAUTH_PROCESS_SCHEDULER_GETPARAM,
    218 	KAUTH_PROCESS_SCHEDULER_SETPARAM,
    219 	KAUTH_PROCESS_SETID,
    220 	KAUTH_PROCESS_SIGNAL,
    221 	KAUTH_PROCESS_STOPFLAG
    222 };
    223 
    224 /*
    225  * Process scope - sub-actions.
    226  */
    227 enum kauth_process_req {
    228 	KAUTH_REQ_PROCESS_CANSEE_ARGS=1,
    229 	KAUTH_REQ_PROCESS_CANSEE_ENTRY,
    230 	KAUTH_REQ_PROCESS_CANSEE_ENV,
    231 	KAUTH_REQ_PROCESS_CANSEE_OPENFILES,
    232 	KAUTH_REQ_PROCESS_CORENAME_GET,
    233 	KAUTH_REQ_PROCESS_CORENAME_SET,
    234 	KAUTH_REQ_PROCESS_KTRACE_PERSISTENT,
    235 	KAUTH_REQ_PROCESS_PROCFS_READ,
    236 	KAUTH_REQ_PROCESS_PROCFS_RW,
    237 	KAUTH_REQ_PROCESS_PROCFS_WRITE,
    238 	KAUTH_REQ_PROCESS_RLIMIT_GET,
    239 	KAUTH_REQ_PROCESS_RLIMIT_SET,
    240 	KAUTH_REQ_PROCESS_RLIMIT_BYPASS,
    241 	KAUTH_REQ_PROCESS_CANSEE_EPROC,
    242 	KAUTH_REQ_PROCESS_CANSEE_KPTR
    243 };
    244 
    245 /*
    246  * Network scope - actions.
    247  */
    248 enum {
    249 	KAUTH_NETWORK_ALTQ=1,
    250 	KAUTH_NETWORK_BIND,
    251 	KAUTH_NETWORK_FIREWALL,
    252 	KAUTH_NETWORK_INTERFACE,
    253 	KAUTH_NETWORK_FORWSRCRT,
    254 	KAUTH_NETWORK_NFS,
    255 	KAUTH_NETWORK_ROUTE,
    256 	KAUTH_NETWORK_SOCKET,
    257 	KAUTH_NETWORK_INTERFACE_PPP,
    258 	KAUTH_NETWORK_INTERFACE_SLIP,
    259 	KAUTH_NETWORK_INTERFACE_STRIP,	/* obsolete */
    260 	KAUTH_NETWORK_INTERFACE_TUN,
    261 	KAUTH_NETWORK_INTERFACE_BRIDGE,
    262 	KAUTH_NETWORK_IPSEC,
    263 	KAUTH_NETWORK_INTERFACE_PVC,
    264 	KAUTH_NETWORK_IPV6,
    265 	KAUTH_NETWORK_SMB,
    266 	KAUTH_NETWORK_INTERFACE_WG,
    267 };
    268 
    269 /*
    270  * Network scope - sub-actions.
    271  */
    272 enum kauth_network_req {
    273 	KAUTH_REQ_NETWORK_ALTQ_AFMAP=1,
    274 	KAUTH_REQ_NETWORK_ALTQ_BLUE,
    275 	KAUTH_REQ_NETWORK_ALTQ_CBQ,
    276 	KAUTH_REQ_NETWORK_ALTQ_CDNR,
    277 	KAUTH_REQ_NETWORK_ALTQ_CONF,
    278 	KAUTH_REQ_NETWORK_ALTQ_FIFOQ,
    279 	KAUTH_REQ_NETWORK_ALTQ_HFSC,
    280 	KAUTH_REQ_NETWORK_ALTQ_JOBS,
    281 	KAUTH_REQ_NETWORK_ALTQ_PRIQ,
    282 	KAUTH_REQ_NETWORK_ALTQ_RED,
    283 	KAUTH_REQ_NETWORK_ALTQ_RIO,
    284 	KAUTH_REQ_NETWORK_ALTQ_WFQ,
    285 	KAUTH_REQ_NETWORK_BIND_PORT,
    286 	KAUTH_REQ_NETWORK_BIND_PRIVPORT,
    287 	KAUTH_REQ_NETWORK_FIREWALL_FW,
    288 	KAUTH_REQ_NETWORK_FIREWALL_NAT,
    289 	KAUTH_REQ_NETWORK_INTERFACE_GET,
    290 	KAUTH_REQ_NETWORK_INTERFACE_GETPRIV,
    291 	KAUTH_REQ_NETWORK_INTERFACE_SET,
    292 	KAUTH_REQ_NETWORK_INTERFACE_SETPRIV,
    293 	KAUTH_REQ_NETWORK_NFS_EXPORT,
    294 	KAUTH_REQ_NETWORK_NFS_SVC,
    295 	KAUTH_REQ_NETWORK_SOCKET_OPEN,
    296 	KAUTH_REQ_NETWORK_SOCKET_RAWSOCK,
    297 	KAUTH_REQ_NETWORK_SOCKET_CANSEE,
    298 	KAUTH_REQ_NETWORK_SOCKET_DROP,
    299 	KAUTH_REQ_NETWORK_SOCKET_SETPRIV,
    300 	KAUTH_REQ_NETWORK_INTERFACE_PPP_ADD,
    301 	KAUTH_REQ_NETWORK_INTERFACE_SLIP_ADD,
    302 	KAUTH_REQ_NETWORK_INTERFACE_STRIP_ADD,	/* obsolete */
    303 	KAUTH_REQ_NETWORK_INTERFACE_TUN_ADD,
    304 	KAUTH_REQ_NETWORK_IPV6_HOPBYHOP,
    305 	KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_GETPRIV,
    306 	KAUTH_REQ_NETWORK_INTERFACE_BRIDGE_SETPRIV,
    307 	KAUTH_REQ_NETWORK_IPSEC_BYPASS,
    308 	KAUTH_REQ_NETWORK_IPV6_JOIN_MULTICAST,
    309 	KAUTH_REQ_NETWORK_INTERFACE_PVC_ADD,
    310 	KAUTH_REQ_NETWORK_SMB_SHARE_ACCESS,
    311 	KAUTH_REQ_NETWORK_SMB_SHARE_CREATE,
    312 	KAUTH_REQ_NETWORK_SMB_VC_ACCESS,
    313 	KAUTH_REQ_NETWORK_SMB_VC_CREATE,
    314 	KAUTH_REQ_NETWORK_INTERFACE_FIRMWARE,
    315 	KAUTH_REQ_NETWORK_BIND_ANYADDR,
    316 	KAUTH_REQ_NETWORK_INTERFACE_WG_GETPRIV,
    317 	KAUTH_REQ_NETWORK_INTERFACE_WG_SETPRIV,
    318 };
    319 
    320 /*
    321  * Machdep scope - actions.
    322  */
    323 enum {
    324 	KAUTH_MACHDEP_CACHEFLUSH=1,
    325 	KAUTH_MACHDEP_CPU_UCODE_APPLY,
    326 	KAUTH_MACHDEP_IOPERM_GET,
    327 	KAUTH_MACHDEP_IOPERM_SET,
    328 	KAUTH_MACHDEP_IOPL,
    329 	KAUTH_MACHDEP_LDT_GET,
    330 	KAUTH_MACHDEP_LDT_SET,
    331 	KAUTH_MACHDEP_MTRR_GET,
    332 	KAUTH_MACHDEP_MTRR_SET,
    333 	KAUTH_MACHDEP_NVRAM,
    334 	KAUTH_MACHDEP_UNMANAGEDMEM,
    335 	KAUTH_MACHDEP_PXG,
    336 	KAUTH_MACHDEP_SVS_DISABLE
    337 };
    338 
    339 /*
    340  * Device scope - actions.
    341  */
    342 enum {
    343 	KAUTH_DEVICE_TTY_OPEN=1,
    344 	KAUTH_DEVICE_TTY_PRIVSET,
    345 	KAUTH_DEVICE_TTY_STI,
    346 	KAUTH_DEVICE_RAWIO_SPEC,
    347 	KAUTH_DEVICE_RAWIO_PASSTHRU,
    348 	KAUTH_DEVICE_BLUETOOTH_SETPRIV,
    349 	KAUTH_DEVICE_RND_ADDDATA,
    350 	KAUTH_DEVICE_RND_ADDDATA_ESTIMATE,
    351 	KAUTH_DEVICE_RND_GETPRIV,
    352 	KAUTH_DEVICE_RND_SETPRIV,
    353 	KAUTH_DEVICE_BLUETOOTH_BCSP,
    354 	KAUTH_DEVICE_BLUETOOTH_BTUART,
    355 	KAUTH_DEVICE_GPIO_PINSET,
    356 	KAUTH_DEVICE_BLUETOOTH_SEND,
    357 	KAUTH_DEVICE_BLUETOOTH_RECV,
    358 	KAUTH_DEVICE_TTY_VIRTUAL,
    359 	KAUTH_DEVICE_WSCONS_KEYBOARD_BELL,
    360 	KAUTH_DEVICE_WSCONS_KEYBOARD_KEYREPEAT,
    361 	KAUTH_DEVICE_NVMM_CTL,
    362 };
    363 
    364 /*
    365  * Device scope - sub-actions.
    366  */
    367 enum kauth_device_req {
    368 	KAUTH_REQ_DEVICE_RAWIO_SPEC_READ=1,
    369 	KAUTH_REQ_DEVICE_RAWIO_SPEC_WRITE,
    370 	KAUTH_REQ_DEVICE_RAWIO_SPEC_RW,
    371 	KAUTH_REQ_DEVICE_BLUETOOTH_BCSP_ADD,
    372 	KAUTH_REQ_DEVICE_BLUETOOTH_BTUART_ADD,
    373 };
    374 
    375 /*
    376  * Credentials scope - actions.
    377  */
    378 enum {
    379 	KAUTH_CRED_INIT=1,
    380 	KAUTH_CRED_FORK,
    381 	KAUTH_CRED_COPY,
    382 	KAUTH_CRED_FREE,
    383 	KAUTH_CRED_CHROOT
    384 };
    385 
    386 /*
    387  * Vnode scope - action bits.
    388  */
    389 #define	KAUTH_VNODE_READ_DATA		(1ULL << 0)
    390 #define	KAUTH_VNODE_LIST_DIRECTORY	KAUTH_VNODE_READ_DATA
    391 #define	KAUTH_VNODE_WRITE_DATA		(1ULL << 1)
    392 #define	KAUTH_VNODE_ADD_FILE		KAUTH_VNODE_WRITE_DATA
    393 #define	KAUTH_VNODE_EXECUTE		(1ULL << 2)
    394 #define	KAUTH_VNODE_SEARCH		KAUTH_VNODE_EXECUTE
    395 #define	KAUTH_VNODE_DELETE		(1ULL << 3)
    396 #define	KAUTH_VNODE_APPEND_DATA		(1ULL << 4)
    397 #define	KAUTH_VNODE_ADD_SUBDIRECTORY	KAUTH_VNODE_APPEND_DATA
    398 #define	KAUTH_VNODE_READ_TIMES		(1ULL << 5)
    399 #define	KAUTH_VNODE_WRITE_TIMES		(1ULL << 6)
    400 #define	KAUTH_VNODE_READ_FLAGS		(1ULL << 7)
    401 #define	KAUTH_VNODE_WRITE_FLAGS		(1ULL << 8)
    402 #define	KAUTH_VNODE_READ_SYSFLAGS	(1ULL << 9)
    403 #define	KAUTH_VNODE_WRITE_SYSFLAGS	(1ULL << 10)
    404 #define	KAUTH_VNODE_RENAME		(1ULL << 11)
    405 #define	KAUTH_VNODE_CHANGE_OWNERSHIP	(1ULL << 12)
    406 #define	KAUTH_VNODE_READ_SECURITY	(1ULL << 13)
    407 #define	KAUTH_VNODE_WRITE_SECURITY	(1ULL << 14)
    408 #define	KAUTH_VNODE_READ_ATTRIBUTES	(1ULL << 15)
    409 #define	KAUTH_VNODE_WRITE_ATTRIBUTES	(1ULL << 16)
    410 #define	KAUTH_VNODE_READ_EXTATTRIBUTES	(1ULL << 17)
    411 #define	KAUTH_VNODE_WRITE_EXTATTRIBUTES	(1ULL << 18)
    412 #define	KAUTH_VNODE_RETAIN_SUID		(1ULL << 19)
    413 #define	KAUTH_VNODE_RETAIN_SGID		(1ULL << 20)
    414 #define	KAUTH_VNODE_REVOKE		(1ULL << 21)
    415 
    416 #define	KAUTH_VNODE_IS_EXEC		(1ULL << 29)
    417 #define	KAUTH_VNODE_HAS_SYSFLAGS	(1ULL << 30)
    418 #define	KAUTH_VNODE_ACCESS		(1ULL << 31)
    419 #define	KAUTH_VNODE_ADD_LINK		(1ULL << 32)
    420 
    421 /*
    422  * This is a special fs_decision indication that can be used by file-systems
    423  * that don't support decision-before-action to tell kauth(9) it can only
    424  * short-circuit the operation beforehand.
    425  */
    426 #define	KAUTH_VNODE_REMOTEFS		(-1)
    427 
    428 /*
    429  * Device scope, passthru request - identifiers.
    430  */
    431 #define	KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_READ		0x00000001
    432 #define	KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_WRITE		0x00000002
    433 #define	KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_READCONF	0x00000004
    434 #define	KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_WRITECONF	0x00000008
    435 #define	KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_ALL		0x0000000F
    436 
    437 #define NOCRED ((kauth_cred_t)-1)	/* no credential available */
    438 #define FSCRED ((kauth_cred_t)-2)	/* filesystem credential */
    439 
    440 /* Macro to help passing arguments to authorization wrappers. */
    441 #define	KAUTH_ARG(arg)	((void *)(unsigned long)(arg))
    442 
    443 /*
    444  * A file-system object is determined to be able to execute if it's a
    445  * directory or if the execute bit is present in any of the
    446  * owner/group/other modes.
    447  *
    448  * This helper macro is intended to be used in order to implement a
    449  * policy that maintains the semantics of "a privileged user can enter
    450  * directory, and can execute any file, but only if the file is actually
    451  * executable."
    452  */
    453 #define	FS_OBJECT_CAN_EXEC(vtype, mode)	(((vtype) == VDIR) ||		\
    454 					 ((mode) &			\
    455 					  (S_IXUSR|S_IXGRP|S_IXOTH)))
    456 
    457 /*
    458  * Prototypes.
    459  */
    460 void kauth_init(void);
    461 kauth_scope_t kauth_register_scope(const char *, kauth_scope_callback_t, void *);
    462 void kauth_deregister_scope(kauth_scope_t);
    463 kauth_listener_t kauth_listen_scope(const char *, kauth_scope_callback_t, void *);
    464 void kauth_unlisten_scope(kauth_listener_t);
    465 int kauth_authorize_action(kauth_scope_t, kauth_cred_t, kauth_action_t, void *,
    466     void *, void *, void *);
    467 
    468 /* Authorization wrappers. */
    469 int kauth_authorize_generic(kauth_cred_t, kauth_action_t, void *);
    470 int kauth_authorize_system(kauth_cred_t, kauth_action_t, enum kauth_system_req,
    471     void *, void *, void *);
    472 int kauth_authorize_process(kauth_cred_t, kauth_action_t, struct proc *,
    473     void *, void *, void *);
    474 int kauth_authorize_network(kauth_cred_t, kauth_action_t,
    475     enum kauth_network_req, void *, void *, void *);
    476 int kauth_authorize_machdep(kauth_cred_t, kauth_action_t,
    477     void *, void *, void *, void *);
    478 int kauth_authorize_device(kauth_cred_t, kauth_action_t,
    479     void *, void *, void *, void *);
    480 int kauth_authorize_device_tty(kauth_cred_t, kauth_action_t, struct tty *);
    481 int kauth_authorize_device_spec(kauth_cred_t, enum kauth_device_req,
    482     struct vnode *);
    483 int kauth_authorize_device_passthru(kauth_cred_t, dev_t, u_long, void *);
    484 int kauth_authorize_vnode(kauth_cred_t, kauth_action_t, struct vnode *,
    485     struct vnode *, int);
    486 
    487 /* Kauth credentials management routines. */
    488 kauth_cred_t kauth_cred_alloc(void);
    489 void kauth_cred_free(kauth_cred_t);
    490 void kauth_cred_clone(kauth_cred_t, kauth_cred_t);
    491 kauth_cred_t kauth_cred_dup(kauth_cred_t);
    492 kauth_cred_t kauth_cred_copy(kauth_cred_t);
    493 
    494 uid_t kauth_cred_getuid(kauth_cred_t);
    495 uid_t kauth_cred_geteuid(kauth_cred_t);
    496 uid_t kauth_cred_getsvuid(kauth_cred_t);
    497 gid_t kauth_cred_getgid(kauth_cred_t);
    498 gid_t kauth_cred_getegid(kauth_cred_t);
    499 gid_t kauth_cred_getsvgid(kauth_cred_t);
    500 int kauth_cred_ismember_gid(kauth_cred_t, gid_t, int *);
    501 int kauth_cred_groupmember(kauth_cred_t, gid_t);
    502 u_int kauth_cred_ngroups(kauth_cred_t);
    503 gid_t kauth_cred_group(kauth_cred_t, u_int);
    504 
    505 void kauth_cred_setuid(kauth_cred_t, uid_t);
    506 void kauth_cred_seteuid(kauth_cred_t, uid_t);
    507 void kauth_cred_setsvuid(kauth_cred_t, uid_t);
    508 void kauth_cred_setgid(kauth_cred_t, gid_t);
    509 void kauth_cred_setegid(kauth_cred_t, gid_t);
    510 void kauth_cred_setsvgid(kauth_cred_t, gid_t);
    511 
    512 kauth_cred_t kauth_cred_hold(kauth_cred_t);
    513 u_int kauth_cred_getrefcnt(kauth_cred_t);
    514 
    515 int kauth_cred_setgroups(kauth_cred_t, const gid_t *, size_t, uid_t,
    516     enum uio_seg);
    517 int kauth_cred_getgroups(kauth_cred_t, gid_t *, size_t, enum uio_seg);
    518 
    519 /* This is for sys_setgroups() */
    520 int kauth_proc_setgroups(struct lwp *, kauth_cred_t);
    521 
    522 int kauth_register_key(secmodel_t, kauth_key_t *);
    523 int kauth_deregister_key(kauth_key_t);
    524 void kauth_cred_setdata(kauth_cred_t, kauth_key_t, void *);
    525 void *kauth_cred_getdata(kauth_cred_t, kauth_key_t);
    526 
    527 int kauth_cred_uidmatch(kauth_cred_t, kauth_cred_t);
    528 void kauth_uucred_to_cred(kauth_cred_t, const struct uucred *);
    529 void kauth_cred_to_uucred(struct uucred *, const kauth_cred_t);
    530 int kauth_cred_uucmp(kauth_cred_t, const struct uucred *);
    531 void kauth_cred_toucred(kauth_cred_t, struct ki_ucred *);
    532 void kauth_cred_topcred(kauth_cred_t, struct ki_pcred *);
    533 
    534 kauth_action_t kauth_accmode_to_action(accmode_t);
    535 kauth_action_t kauth_extattr_action(mode_t);
    536 
    537 #define KAUTH_ACCESS_ACTION(access_mode, vn_vtype, file_mode)	\
    538 	(kauth_accmode_to_action(access_mode) |			\
    539 	(FS_OBJECT_CAN_EXEC(vn_vtype, file_mode) ? KAUTH_VNODE_IS_EXEC : 0))
    540 
    541 kauth_cred_t kauth_cred_get(void);
    542 
    543 void kauth_proc_fork(struct proc *, struct proc *);
    544 void kauth_proc_chroot(kauth_cred_t cred, struct cwdinfo *cwdi);
    545 
    546 #endif	/* !_SYS_KAUTH_H_ */
    547