/* $NetBSD: kauth.h,v 1.52 2008/02/28 17:07:49 elad Exp $ */ /*- * Copyright (c) 2005, 2006 Elad Efrat <elad@NetBSD.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * This is based on Apple TN2127, available online at * http://developer.apple.com/technotes/tn2005/tn2127.html */ #ifndef _SYS_KAUTH_H_ #define _SYS_KAUTH_H_ struct uucred; struct ki_ucred; struct ki_pcred; struct proc; struct tty; struct vnode; /* Types. */ typedef struct kauth_scope *kauth_scope_t; typedef struct kauth_listener *kauth_listener_t; typedef uint32_t kauth_action_t; typedef int (*kauth_scope_callback_t)(kauth_cred_t, kauth_action_t, void *, void *, void *, void *, void *); typedef struct kauth_key *kauth_key_t; /* * Possible return values for a listener. */ #define KAUTH_RESULT_ALLOW 0 /* allow access */ #define KAUTH_RESULT_DENY 1 /* deny access */ #define KAUTH_RESULT_DEFER 2 /* let others decide */ /* * Scopes. */ #define KAUTH_SCOPE_GENERIC "org.netbsd.kauth.generic" #define KAUTH_SCOPE_SYSTEM "org.netbsd.kauth.system" #define KAUTH_SCOPE_PROCESS "org.netbsd.kauth.process" #define KAUTH_SCOPE_NETWORK "org.netbsd.kauth.network" #define KAUTH_SCOPE_MACHDEP "org.netbsd.kauth.machdep" #define KAUTH_SCOPE_DEVICE "org.netbsd.kauth.device" #define KAUTH_SCOPE_CRED "org.netbsd.kauth.cred" /* * Generic scope - actions. */ enum { KAUTH_GENERIC_CANSEE=1, KAUTH_GENERIC_ISSUSER }; /* * System scope - actions. */ enum { KAUTH_SYSTEM_ACCOUNTING=1, KAUTH_SYSTEM_CHROOT, KAUTH_SYSTEM_CHSYSFLAGS, KAUTH_SYSTEM_CPU, KAUTH_SYSTEM_DEBUG, KAUTH_SYSTEM_FILEHANDLE, KAUTH_SYSTEM_LKM, KAUTH_SYSTEM_MKNOD, KAUTH_SYSTEM_MOUNT, KAUTH_SYSTEM_PSET, KAUTH_SYSTEM_REBOOT, KAUTH_SYSTEM_SETIDCORE, KAUTH_SYSTEM_SWAPCTL, KAUTH_SYSTEM_SYSCTL, KAUTH_SYSTEM_TIME, KAUTH_SYSTEM_MODULE }; /* * System scope - sub-actions. */ enum kauth_system_req { KAUTH_REQ_SYSTEM_CHROOT_CHROOT=1, KAUTH_REQ_SYSTEM_CHROOT_FCHROOT, KAUTH_REQ_SYSTEM_CPU_SETSTATE, KAUTH_REQ_SYSTEM_DEBUG_IPKDB, KAUTH_REQ_SYSTEM_MOUNT_GET, KAUTH_REQ_SYSTEM_MOUNT_NEW, KAUTH_REQ_SYSTEM_MOUNT_UNMOUNT, KAUTH_REQ_SYSTEM_MOUNT_UPDATE, KAUTH_REQ_SYSTEM_PSET_ASSIGN, KAUTH_REQ_SYSTEM_PSET_BIND, KAUTH_REQ_SYSTEM_PSET_CREATE, KAUTH_REQ_SYSTEM_PSET_DESTROY, KAUTH_REQ_SYSTEM_SYSCTL_ADD, KAUTH_REQ_SYSTEM_SYSCTL_DELETE, KAUTH_REQ_SYSTEM_SYSCTL_DESC, KAUTH_REQ_SYSTEM_SYSCTL_PRVT, KAUTH_REQ_SYSTEM_TIME_ADJTIME, KAUTH_REQ_SYSTEM_TIME_NTPADJTIME, KAUTH_REQ_SYSTEM_TIME_RTCOFFSET, KAUTH_REQ_SYSTEM_TIME_SYSTEM, KAUTH_REQ_SYSTEM_TIME_TIMECOUNTERS }; /* * Process scope - actions. */ enum { KAUTH_PROCESS_CANSEE=1, KAUTH_PROCESS_CORENAME, KAUTH_PROCESS_FORK, KAUTH_PROCESS_KEVENT_FILTER, KAUTH_PROCESS_KTRACE, KAUTH_PROCESS_NICE, KAUTH_PROCESS_PROCFS, KAUTH_PROCESS_PTRACE, KAUTH_PROCESS_RLIMIT, KAUTH_PROCESS_SCHEDULER_GETAFFINITY, KAUTH_PROCESS_SCHEDULER_SETAFFINITY, KAUTH_PROCESS_SCHEDULER_GETPARAM, KAUTH_PROCESS_SCHEDULER_SETPARAM, KAUTH_PROCESS_SETID, KAUTH_PROCESS_SIGNAL, KAUTH_PROCESS_STOPFLAG }; /* * Process scope - sub-actions. */ enum kauth_process_req { KAUTH_REQ_PROCESS_CANSEE_ARGS=1, KAUTH_REQ_PROCESS_CANSEE_ENTRY, KAUTH_REQ_PROCESS_CANSEE_ENV, KAUTH_REQ_PROCESS_CANSEE_OPENFILES, KAUTH_REQ_PROCESS_CORENAME_GET, KAUTH_REQ_PROCESS_CORENAME_SET, KAUTH_REQ_PROCESS_KTRACE_PERSISTENT, KAUTH_REQ_PROCESS_PROCFS_CTL, KAUTH_REQ_PROCESS_PROCFS_READ, KAUTH_REQ_PROCESS_PROCFS_RW, KAUTH_REQ_PROCESS_PROCFS_WRITE, KAUTH_REQ_PROCESS_RLIMIT_GET, KAUTH_REQ_PROCESS_RLIMIT_SET }; /* * Network scope - actions. */ enum { KAUTH_NETWORK_ALTQ=1, KAUTH_NETWORK_BIND, KAUTH_NETWORK_FIREWALL, KAUTH_NETWORK_INTERFACE, KAUTH_NETWORK_FORWSRCRT, KAUTH_NETWORK_NFS, KAUTH_NETWORK_ROUTE, KAUTH_NETWORK_SOCKET }; /* * Network scope - sub-actions. */ enum kauth_network_req { KAUTH_REQ_NETWORK_ALTQ_AFMAP=1, KAUTH_REQ_NETWORK_ALTQ_BLUE, KAUTH_REQ_NETWORK_ALTQ_CBQ, KAUTH_REQ_NETWORK_ALTQ_CDNR, KAUTH_REQ_NETWORK_ALTQ_CONF, KAUTH_REQ_NETWORK_ALTQ_FIFOQ, KAUTH_REQ_NETWORK_ALTQ_HFSC, KAUTH_REQ_NETWORK_ALTQ_JOBS, KAUTH_REQ_NETWORK_ALTQ_PRIQ, KAUTH_REQ_NETWORK_ALTQ_RED, KAUTH_REQ_NETWORK_ALTQ_RIO, KAUTH_REQ_NETWORK_ALTQ_WFQ, KAUTH_REQ_NETWORK_BIND_PORT, KAUTH_REQ_NETWORK_BIND_PRIVPORT, KAUTH_REQ_NETWORK_FIREWALL_FW, KAUTH_REQ_NETWORK_FIREWALL_NAT, KAUTH_REQ_NETWORK_INTERFACE_GET, KAUTH_REQ_NETWORK_INTERFACE_GETPRIV, KAUTH_REQ_NETWORK_INTERFACE_SET, KAUTH_REQ_NETWORK_INTERFACE_SETPRIV, KAUTH_REQ_NETWORK_NFS_EXPORT, KAUTH_REQ_NETWORK_NFS_SVC, KAUTH_REQ_NETWORK_SOCKET_OPEN, KAUTH_REQ_NETWORK_SOCKET_RAWSOCK, KAUTH_REQ_NETWORK_SOCKET_CANSEE }; /* * Machdep scope - actions. */ enum { KAUTH_MACHDEP_IOPERM_GET=1, KAUTH_MACHDEP_IOPERM_SET, KAUTH_MACHDEP_IOPL, KAUTH_MACHDEP_LDT_GET, KAUTH_MACHDEP_LDT_SET, KAUTH_MACHDEP_MTRR_GET, KAUTH_MACHDEP_MTRR_SET, KAUTH_MACHDEP_UNMANAGEDMEM }; /* * Device scope - actions. */ enum { KAUTH_DEVICE_TTY_OPEN=1, KAUTH_DEVICE_TTY_PRIVSET, KAUTH_DEVICE_TTY_STI, KAUTH_DEVICE_RAWIO_SPEC, KAUTH_DEVICE_RAWIO_PASSTHRU }; /* * Device scope - sub-actions. */ enum kauth_device_req { KAUTH_REQ_DEVICE_RAWIO_SPEC_READ=1, KAUTH_REQ_DEVICE_RAWIO_SPEC_WRITE, KAUTH_REQ_DEVICE_RAWIO_SPEC_RW, }; /* * Credentials scope - actions. */ enum { KAUTH_CRED_INIT=1, KAUTH_CRED_FORK, KAUTH_CRED_COPY, KAUTH_CRED_FREE }; /* * Device scope, passthru request - identifiers. */ #define KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_READ 0x00000001 #define KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_WRITE 0x00000002 #define KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_READCONF 0x00000004 #define KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_WRITECONF 0x00000008 #define KAUTH_REQ_DEVICE_RAWIO_PASSTHRU_ALL 0x0000000F #define NOCRED ((kauth_cred_t)-1) /* no credential available */ #define FSCRED ((kauth_cred_t)-2) /* filesystem credential */ /* Macro to help passing arguments to authorization wrappers. */ #define KAUTH_ARG(arg) ((void *)(unsigned long)(arg)) /* * Prototypes. */ void kauth_init(void); kauth_scope_t kauth_register_scope(const char *, kauth_scope_callback_t, void *); void kauth_deregister_scope(kauth_scope_t); kauth_listener_t kauth_listen_scope(const char *, kauth_scope_callback_t, void *); void kauth_unlisten_scope(kauth_listener_t); int kauth_authorize_action(kauth_scope_t, kauth_cred_t, kauth_action_t, void *, void *, void *, void *); /* Authorization wrappers. */ int kauth_authorize_generic(kauth_cred_t, kauth_action_t, void *); int kauth_authorize_system(kauth_cred_t, kauth_action_t, enum kauth_system_req, void *, void *, void *); int kauth_authorize_process(kauth_cred_t, kauth_action_t, struct proc *, void *, void *, void *); int kauth_authorize_network(kauth_cred_t, kauth_action_t, enum kauth_network_req, void *, void *, void *); int kauth_authorize_machdep(kauth_cred_t, kauth_action_t, void *, void *, void *, void *); int kauth_authorize_device(kauth_cred_t, kauth_action_t, void *, void *, void *, void *); int kauth_authorize_device_tty(kauth_cred_t, kauth_action_t, struct tty *); int kauth_authorize_device_spec(kauth_cred_t, enum kauth_device_req, struct vnode *); int kauth_authorize_device_passthru(kauth_cred_t, dev_t, u_long, void *); /* Kauth credentials management routines. */ kauth_cred_t kauth_cred_alloc(void); void kauth_cred_free(kauth_cred_t); void kauth_cred_clone(kauth_cred_t, kauth_cred_t); kauth_cred_t kauth_cred_dup(kauth_cred_t); kauth_cred_t kauth_cred_copy(kauth_cred_t); uid_t kauth_cred_getuid(kauth_cred_t); uid_t kauth_cred_geteuid(kauth_cred_t); uid_t kauth_cred_getsvuid(kauth_cred_t); gid_t kauth_cred_getgid(kauth_cred_t); gid_t kauth_cred_getegid(kauth_cred_t); gid_t kauth_cred_getsvgid(kauth_cred_t); int kauth_cred_ismember_gid(kauth_cred_t, gid_t, int *); u_int kauth_cred_ngroups(kauth_cred_t); gid_t kauth_cred_group(kauth_cred_t, u_int); void kauth_cred_setuid(kauth_cred_t, uid_t); void kauth_cred_seteuid(kauth_cred_t, uid_t); void kauth_cred_setsvuid(kauth_cred_t, uid_t); void kauth_cred_setgid(kauth_cred_t, gid_t); void kauth_cred_setegid(kauth_cred_t, gid_t); void kauth_cred_setsvgid(kauth_cred_t, gid_t); void kauth_cred_hold(kauth_cred_t); u_int kauth_cred_getrefcnt(kauth_cred_t); int kauth_cred_setgroups(kauth_cred_t, const gid_t *, size_t, uid_t, enum uio_seg); int kauth_cred_getgroups(kauth_cred_t, gid_t *, size_t, enum uio_seg); /* This is for sys_setgroups() */ int kauth_proc_setgroups(struct lwp *, kauth_cred_t); int kauth_register_key(const char *, kauth_key_t *); int kauth_deregister_key(kauth_key_t); void kauth_cred_setdata(kauth_cred_t, kauth_key_t, void *); void *kauth_cred_getdata(kauth_cred_t, kauth_key_t); int kauth_cred_uidmatch(kauth_cred_t, kauth_cred_t); void kauth_uucred_to_cred(kauth_cred_t, const struct uucred *); void kauth_cred_to_uucred(struct uucred *, const kauth_cred_t); int kauth_cred_uucmp(kauth_cred_t, const struct uucred *); void kauth_cred_toucred(kauth_cred_t, struct ki_ucred *); void kauth_cred_topcred(kauth_cred_t, struct ki_pcred *); kauth_cred_t kauth_cred_get(void); void kauth_proc_fork(struct proc *, struct proc *); void secmodel_register(void); void secmodel_deregister(void); #endif /* !_SYS_KAUTH_H_ */