171088Sjasone/*- 271088Sjasone * Copyright (c) 1999-2002, 2007-2011 Robert N. M. Watson 371088Sjasone * Copyright (c) 2001-2005 Networks Associates Technology, Inc. 471088Sjasone * Copyright (c) 2005-2006 SPARTA, Inc. 571088Sjasone * All rights reserved. 671088Sjasone * 771088Sjasone * This software was developed by Robert Watson for the TrustedBSD Project. 871088Sjasone * 971088Sjasone * This software was developed for the FreeBSD Project in part by Network 1071088Sjasone * Associates Laboratories, the Security Research Division of Network 1171088Sjasone * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), 1271088Sjasone * as part of the DARPA CHATS research program. 1371088Sjasone * 1471088Sjasone * This software was enhanced by SPARTA ISSO under SPAWAR contract 1571088Sjasone * N66001-04-C-6019 ("SEFOS"). 1671088Sjasone * 1771088Sjasone * This software was developed at the University of Cambridge Computer 1871088Sjasone * Laboratory with support from a grant from Google, Inc. 1971088Sjasone * 2071088Sjasone * Redistribution and use in source and binary forms, with or without 2171088Sjasone * modification, are permitted provided that the following conditions 2271088Sjasone * are met: 2371088Sjasone * 1. Redistributions of source code must retain the above copyright 2471088Sjasone * notice, this list of conditions and the following disclaimer. 2571088Sjasone * 2. Redistributions in binary form must reproduce the above copyright 2671088Sjasone * notice, this list of conditions and the following disclaimer in the 2771088Sjasone * documentation and/or other materials provided with the distribution. 2871088Sjasone * 2971088Sjasone * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 3071088Sjasone * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 3171088Sjasone * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 3271088Sjasone * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 3371088Sjasone * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3471088Sjasone * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3571088Sjasone * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3671088Sjasone * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3771088Sjasone * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3871088Sjasone * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3971088Sjasone * SUCH DAMAGE. 4071088Sjasone */ 4171088Sjasone 4271088Sjasone/* 4371088Sjasone * Kernel interface for Mandatory Access Control -- how kernel services 4471088Sjasone * interact with the TrustedBSD MAC Framework. 4571088Sjasone */ 4671088Sjasone 4771088Sjasone#ifndef _SECURITY_MAC_MAC_FRAMEWORK_H_ 4871088Sjasone#define _SECURITY_MAC_MAC_FRAMEWORK_H_ 4971088Sjasone 5071088Sjasone#ifndef _KERNEL 5171088Sjasone#error "no user-serviceable parts inside" 5271088Sjasone#endif 5371088Sjasone 5471088Sjasonestruct auditinfo; 5571088Sjasonestruct auditinfo_addr; 5671088Sjasonestruct bpf_d; 5771088Sjasonestruct cdev; 5871088Sjasonestruct componentname; 5971088Sjasonestruct devfs_dirent; 6071088Sjasonestruct ifnet; 6171088Sjasonestruct ifreq; 6271088Sjasonestruct image_params; 6371088Sjasonestruct inpcb; 6471088Sjasonestruct ip6q; 6571088Sjasonestruct ipq; 6671088Sjasonestruct kdb_dbbe; 6771088Sjasonestruct ksem; 6871088Sjasonestruct label; 6971088Sjasonestruct m_tag; 7071088Sjasonestruct mac; 7171088Sjasonestruct mbuf; 7271088Sjasonestruct mount; 7371088Sjasonestruct msg; 7471088Sjasonestruct msqid_kernel; 7571088Sjasonestruct proc; 7671088Sjasonestruct semid_kernel; 7771088Sjasonestruct shmfd; 7871088Sjasonestruct shmid_kernel; 7971088Sjasonestruct sockaddr; 8071088Sjasonestruct socket; 8171088Sjasonestruct sysctl_oid; 8271088Sjasonestruct sysctl_req; 8371088Sjasonestruct pipepair; 8471088Sjasonestruct thread; 8571088Sjasonestruct timespec; 8671088Sjasonestruct ucred; 8771088Sjasonestruct vattr; 8871088Sjasonestruct vnode; 8971088Sjasonestruct vop_setlabel_args; 9071088Sjasone 9171088Sjasonestruct in_addr; 9271088Sjasonestruct in6_addr; 9371088Sjasone 9471088Sjasone#include <sys/acl.h> /* XXX acl_type_t */ 9571088Sjasone#include <sys/types.h> /* accmode_t */ 9671088Sjasone 9771088Sjasone#include <ddb/ddb.h> /* db_expr_t */ 9871088Sjasone 9971088Sjasone/* 10071088Sjasone * Entry points to the TrustedBSD MAC Framework from the remainder of the 10171088Sjasone * kernel: entry points are named based on a principle object type and an 10271088Sjasone * action relating to it. They are sorted alphabetically first by object 10371088Sjasone * type and then action. In some situations, the principle object type is 10471088Sjasone * obvious, and in other cases, less so as multiple objects may be inolved 10571088Sjasone * in the operation. 10671088Sjasone */ 10771088Sjasoneint mac_bpfdesc_check_receive(struct bpf_d *d, struct ifnet *ifp); 10871088Sjasonevoid mac_bpfdesc_create(struct ucred *cred, struct bpf_d *d); 10971088Sjasonevoid mac_bpfdesc_create_mbuf(struct bpf_d *d, struct mbuf *m); 11071088Sjasonevoid mac_bpfdesc_destroy(struct bpf_d *); 11171088Sjasonevoid mac_bpfdesc_init(struct bpf_d *); 11271088Sjasone 11371088Sjasonevoid mac_cred_associate_nfsd(struct ucred *cred); 11471088Sjasoneint mac_cred_check_setaudit(struct ucred *cred, struct auditinfo *ai); 11571088Sjasoneint mac_cred_check_setaudit_addr(struct ucred *cred, 11671088Sjasone struct auditinfo_addr *aia); 11771088Sjasoneint mac_cred_check_setauid(struct ucred *cred, uid_t auid); 11871088Sjasoneint mac_cred_check_setegid(struct ucred *cred, gid_t egid); 11971088Sjasoneint mac_cred_check_seteuid(struct ucred *cred, uid_t euid); 12071088Sjasoneint mac_cred_check_setgid(struct ucred *cred, gid_t gid); 12171088Sjasoneint mac_cred_check_setgroups(struct ucred *cred, int ngroups, 12271088Sjasone gid_t *gidset); 12371088Sjasoneint mac_cred_check_setregid(struct ucred *cred, gid_t rgid, gid_t egid); 12471088Sjasoneint mac_cred_check_setresgid(struct ucred *cred, gid_t rgid, gid_t egid, 12571088Sjasone gid_t sgid); 12671088Sjasoneint mac_cred_check_setresuid(struct ucred *cred, uid_t ruid, uid_t euid, 12771088Sjasone uid_t suid); 12871088Sjasoneint mac_cred_check_setreuid(struct ucred *cred, uid_t ruid, uid_t euid); 12971088Sjasoneint mac_cred_check_setuid(struct ucred *cred, uid_t uid); 13071088Sjasoneint mac_cred_check_visible(struct ucred *cr1, struct ucred *cr2); 13171088Sjasonevoid mac_cred_copy(struct ucred *cr1, struct ucred *cr2); 13271088Sjasonevoid mac_cred_create_init(struct ucred *cred); 13371088Sjasonevoid mac_cred_create_swapper(struct ucred *cred); 13471088Sjasonevoid mac_cred_destroy(struct ucred *); 13571088Sjasonevoid mac_cred_init(struct ucred *); 13671088Sjasone 13771088Sjasoneint mac_ddb_command_register(struct db_command_table *table, 13871088Sjasone struct db_command *cmd); 13971088Sjasoneint mac_ddb_command_exec(struct db_command *cmd, db_expr_t addr, 14071088Sjasone bool have_addr, db_expr_t count, char *modif); 14171088Sjasone 14271088Sjasonevoid mac_devfs_create_device(struct ucred *cred, struct mount *mp, 14371088Sjasone struct cdev *dev, struct devfs_dirent *de); 14471088Sjasonevoid mac_devfs_create_directory(struct mount *mp, char *dirname, 14571088Sjasone int dirnamelen, struct devfs_dirent *de); 14671088Sjasonevoid mac_devfs_create_symlink(struct ucred *cred, struct mount *mp, 14771088Sjasone struct devfs_dirent *dd, struct devfs_dirent *de); 14871088Sjasonevoid mac_devfs_destroy(struct devfs_dirent *); 14971088Sjasonevoid mac_devfs_init(struct devfs_dirent *); 15071088Sjasonevoid mac_devfs_update(struct mount *mp, struct devfs_dirent *de, 15171088Sjasone struct vnode *vp); 15271088Sjasonevoid mac_devfs_vnode_associate(struct mount *mp, struct devfs_dirent *de, 15371088Sjasone struct vnode *vp); 15471088Sjasone 15571088Sjasoneint mac_ifnet_check_transmit_impl(struct ifnet *ifp, struct mbuf *m); 15671088Sjasone#ifdef MAC 15771088Sjasoneextern bool mac_ifnet_check_transmit_fp_flag; 15871088Sjasone#else 15971088Sjasone#define mac_ifnet_check_transmit_fp_flag false 16071088Sjasone#endif 16171088Sjasone#define mac_ifnet_check_transmit_enabled() __predict_false(mac_ifnet_check_transmit_fp_flag) 16271088Sjasonestatic inline int 16371088Sjasonemac_ifnet_check_transmit(struct ifnet *ifp, struct mbuf *m) 16471088Sjasone{ 16571088Sjasone 16671088Sjasone if (mac_ifnet_check_transmit_enabled()) 16771088Sjasone return (mac_ifnet_check_transmit_impl(ifp, m)); 16871088Sjasone return (0); 16971088Sjasone} 17071088Sjasone 17171088Sjasonevoid mac_ifnet_create(struct ifnet *ifp); 17271088Sjasone 17371088Sjasonevoid mac_ifnet_create_mbuf_impl(struct ifnet *ifp, struct mbuf *m); 17471088Sjasone#ifdef MAC 17571088Sjasoneextern bool mac_ifnet_create_mbuf_fp_flag; 17671088Sjasone#else 17771088Sjasone#define mac_ifnet_create_mbuf_fp_flag false 17871088Sjasone#endif 17971088Sjasone#define mac_ifnet_create_mbuf_enabled() __predict_false(mac_ifnet_create_mbuf_fp_flag) 18071088Sjasonestatic inline void 18171088Sjasonemac_ifnet_create_mbuf(struct ifnet *ifp, struct mbuf *m) 18271088Sjasone{ 18371088Sjasone 18471088Sjasone if (mac_ifnet_create_mbuf_enabled()) 18571088Sjasone mac_ifnet_create_mbuf_impl(ifp, m); 18671088Sjasone} 18771088Sjasone 18871088Sjasonevoid mac_ifnet_destroy(struct ifnet *); 18971088Sjasonevoid mac_ifnet_init(struct ifnet *); 19071088Sjasoneint mac_ifnet_ioctl_get(struct ucred *cred, struct ifreq *ifr, 19171088Sjasone struct ifnet *ifp); 19271088Sjasoneint mac_ifnet_ioctl_set(struct ucred *cred, struct ifreq *ifr, 19371088Sjasone struct ifnet *ifp); 19471088Sjasone 19571088Sjasone/* Check if the IP address is allowed for the interface. */ 19671088Sjasoneint mac_inet_check_add_addr(struct ucred *cred, 19771088Sjasone const struct in_addr *ia, struct ifnet *ifp); 19871088Sjasoneint mac_inet6_check_add_addr(struct ucred *cred, 19971088Sjasone const struct in6_addr *ia6, struct ifnet *ifp); 20071088Sjasone 20171088Sjasoneint mac_inpcb_check_deliver(struct inpcb *inp, struct mbuf *m); 20271088Sjasoneint mac_inpcb_check_visible(struct ucred *cred, struct inpcb *inp); 20371088Sjasonevoid mac_inpcb_create(struct socket *so, struct inpcb *inp); 20471088Sjasonevoid mac_inpcb_create_mbuf(struct inpcb *inp, struct mbuf *m); 20571088Sjasonevoid mac_inpcb_destroy(struct inpcb *); 20671088Sjasoneint mac_inpcb_init(struct inpcb *, int); 20771088Sjasonevoid mac_inpcb_sosetlabel(struct socket *so, struct inpcb *inp); 20871088Sjasone 20971088Sjasonevoid mac_ip6q_create(struct mbuf *m, struct ip6q *q6); 21071088Sjasonevoid mac_ip6q_destroy(struct ip6q *q6); 21171088Sjasoneint mac_ip6q_init(struct ip6q *q6, int); 21271088Sjasoneint mac_ip6q_match(struct mbuf *m, struct ip6q *q6); 21371088Sjasonevoid mac_ip6q_reassemble(struct ip6q *q6, struct mbuf *m); 21471088Sjasonevoid mac_ip6q_update(struct mbuf *m, struct ip6q *q6); 21571088Sjasone 21671088Sjasonevoid mac_ipq_create(struct mbuf *m, struct ipq *q); 21771088Sjasonevoid mac_ipq_destroy(struct ipq *q); 21871088Sjasoneint mac_ipq_init(struct ipq *q, int); 21971088Sjasoneint mac_ipq_match(struct mbuf *m, struct ipq *q); 22071088Sjasonevoid mac_ipq_reassemble(struct ipq *q, struct mbuf *m); 22171088Sjasonevoid mac_ipq_update(struct mbuf *m, struct ipq *q); 22271088Sjasone 22371088Sjasoneint mac_kdb_check_backend(struct kdb_dbbe *be); 22471088Sjasoneint mac_kdb_grant_backend(struct kdb_dbbe *be); 22571088Sjasone 22671088Sjasoneint mac_kenv_check_dump(struct ucred *cred); 22771088Sjasoneint mac_kenv_check_get(struct ucred *cred, char *name); 22871088Sjasoneint mac_kenv_check_set(struct ucred *cred, char *name, char *value); 22971088Sjasoneint mac_kenv_check_unset(struct ucred *cred, char *name); 23071088Sjasone 23171088Sjasoneint mac_kld_check_load(struct ucred *cred, struct vnode *vp); 23271088Sjasoneint mac_kld_check_stat(struct ucred *cred); 23371088Sjasone 23471088Sjasonevoid mac_mbuf_copy(struct mbuf *, struct mbuf *); 23571088Sjasoneint mac_mbuf_init(struct mbuf *, int); 23671088Sjasone 23771088Sjasonevoid mac_mbuf_tag_copy(struct m_tag *, struct m_tag *); 23871088Sjasonevoid mac_mbuf_tag_destroy(struct m_tag *); 23971088Sjasoneint mac_mbuf_tag_init(struct m_tag *, int); 24071088Sjasone 24171088Sjasoneint mac_mount_check_stat(struct ucred *cred, struct mount *mp); 24271088Sjasonevoid mac_mount_create(struct ucred *cred, struct mount *mp); 24371088Sjasonevoid mac_mount_destroy(struct mount *); 24471088Sjasonevoid mac_mount_init(struct mount *); 24571088Sjasone 24671088Sjasonevoid mac_netinet_arp_send(struct ifnet *ifp, struct mbuf *m); 24771088Sjasonevoid mac_netinet_firewall_reply(struct mbuf *mrecv, struct mbuf *msend); 24871088Sjasonevoid mac_netinet_firewall_send(struct mbuf *m); 24971088Sjasonevoid mac_netinet_fragment(struct mbuf *m, struct mbuf *frag); 25071088Sjasonevoid mac_netinet_icmp_reply(struct mbuf *mrecv, struct mbuf *msend); 25171088Sjasonevoid mac_netinet_icmp_replyinplace(struct mbuf *m); 25271088Sjasonevoid mac_netinet_igmp_send(struct ifnet *ifp, struct mbuf *m); 25371088Sjasonevoid mac_netinet_tcp_reply(struct mbuf *m); 25471088Sjasone 25571088Sjasonevoid mac_netinet6_nd6_send(struct ifnet *ifp, struct mbuf *m); 25671088Sjasone 25771088Sjasoneint mac_pipe_check_ioctl(struct ucred *cred, struct pipepair *pp, 25871088Sjasone unsigned long cmd, void *data); 25971088Sjasoneint mac_pipe_check_poll_impl(struct ucred *cred, struct pipepair *pp); 26071088Sjasone#ifdef MAC 26171088Sjasoneextern bool mac_pipe_check_poll_fp_flag; 26271088Sjasone#else 26371088Sjasone#define mac_pipe_check_poll_fp_flag false 26471088Sjasone#endif 26571088Sjasone#define mac_pipe_check_poll_enabled() __predict_false(mac_pipe_check_poll_fp_flag) 26671088Sjasonestatic inline int 26771088Sjasonemac_pipe_check_poll(struct ucred *cred, struct pipepair *pp) 26871088Sjasone{ 26971088Sjasone 27071088Sjasone if (mac_pipe_check_poll_enabled()) 27171088Sjasone return (mac_pipe_check_poll_impl(cred, pp)); 27271088Sjasone return (0); 27371088Sjasone} 27471088Sjasone 27571088Sjasone#ifdef MAC 27671088Sjasoneextern bool mac_pipe_check_stat_fp_flag; 27771088Sjasone#else 27871088Sjasone#define mac_pipe_check_stat_fp_flag false 27971088Sjasone#endif 28071088Sjasone#define mac_pipe_check_stat_enabled() __predict_false(mac_pipe_check_stat_fp_flag) 28171088Sjasoneint mac_pipe_check_stat(struct ucred *cred, struct pipepair *pp); 28271088Sjasoneint mac_pipe_check_read_impl(struct ucred *cred, struct pipepair *pp); 28371088Sjasone#ifdef MAC 28471088Sjasoneextern bool mac_pipe_check_read_fp_flag; 28571088Sjasone#else 28671088Sjasone#define mac_pipe_check_read_fp_flag false 28771088Sjasone#endif 28871088Sjasone#define mac_pipe_check_read_enabled() __predict_false(mac_pipe_check_read_fp_flag) 28971088Sjasonestatic inline int 29071088Sjasonemac_pipe_check_read(struct ucred *cred, struct pipepair *pp) 29171088Sjasone{ 29271088Sjasone 29371088Sjasone if (mac_pipe_check_read_enabled()) 29471088Sjasone return (mac_pipe_check_read_impl(cred, pp)); 29571088Sjasone return (0); 29671088Sjasone} 29771088Sjasone 29871088Sjasoneint mac_pipe_check_write(struct ucred *cred, struct pipepair *pp); 29971088Sjasonevoid mac_pipe_create(struct ucred *cred, struct pipepair *pp); 30071088Sjasonevoid mac_pipe_destroy(struct pipepair *); 30171088Sjasonevoid mac_pipe_init(struct pipepair *); 30271088Sjasoneint mac_pipe_label_set(struct ucred *cred, struct pipepair *pp, 30371088Sjasone struct label *label); 30471088Sjasone 30571088Sjasoneint mac_posixsem_check_getvalue(struct ucred *active_cred, 30671088Sjasone struct ucred *file_cred, struct ksem *ks); 30771088Sjasoneint mac_posixsem_check_open(struct ucred *cred, struct ksem *ks); 30871088Sjasoneint mac_posixsem_check_post(struct ucred *active_cred, 30971088Sjasone struct ucred *file_cred, struct ksem *ks); 31071088Sjasoneint mac_posixsem_check_setmode(struct ucred *cred, struct ksem *ks, 31171088Sjasone mode_t mode); 31271088Sjasoneint mac_posixsem_check_setowner(struct ucred *cred, struct ksem *ks, 31371088Sjasone uid_t uid, gid_t gid); 31471088Sjasoneint mac_posixsem_check_stat(struct ucred *active_cred, 31571088Sjasone struct ucred *file_cred, struct ksem *ks); 31671088Sjasoneint mac_posixsem_check_unlink(struct ucred *cred, struct ksem *ks); 31771088Sjasoneint mac_posixsem_check_wait(struct ucred *active_cred, 31871088Sjasone struct ucred *file_cred, struct ksem *ks); 31971088Sjasonevoid mac_posixsem_create(struct ucred *cred, struct ksem *ks); 32071088Sjasonevoid mac_posixsem_destroy(struct ksem *); 32171088Sjasonevoid mac_posixsem_init(struct ksem *); 32271088Sjasone 32371088Sjasoneint mac_posixshm_check_create(struct ucred *cred, const char *path); 32471088Sjasoneint mac_posixshm_check_mmap(struct ucred *cred, struct shmfd *shmfd, 32571088Sjasone int prot, int flags); 32671088Sjasoneint mac_posixshm_check_open(struct ucred *cred, struct shmfd *shmfd, 32771088Sjasone accmode_t accmode); 32871088Sjasoneint mac_posixshm_check_read(struct ucred *active_cred, 32971088Sjasone struct ucred *file_cred, struct shmfd *shmfd); 33071088Sjasoneint mac_posixshm_check_setmode(struct ucred *cred, struct shmfd *shmfd, 33171088Sjasone mode_t mode); 33271088Sjasoneint mac_posixshm_check_setowner(struct ucred *cred, struct shmfd *shmfd, 33371088Sjasone uid_t uid, gid_t gid); 33471088Sjasoneint mac_posixshm_check_stat(struct ucred *active_cred, 33571088Sjasone struct ucred *file_cred, struct shmfd *shmfd); 33671088Sjasoneint mac_posixshm_check_truncate(struct ucred *active_cred, 33771088Sjasone struct ucred *file_cred, struct shmfd *shmfd); 33871088Sjasoneint mac_posixshm_check_unlink(struct ucred *cred, struct shmfd *shmfd); 33971088Sjasoneint mac_posixshm_check_write(struct ucred *active_cred, 34071088Sjasone struct ucred *file_cred, struct shmfd *shmfd); 34171088Sjasonevoid mac_posixshm_create(struct ucred *cred, struct shmfd *shmfd); 34271088Sjasonevoid mac_posixshm_destroy(struct shmfd *); 34371088Sjasonevoid mac_posixshm_init(struct shmfd *); 34471088Sjasone 34571088Sjasoneint mac_priv_check_impl(struct ucred *cred, int priv); 34671088Sjasone#ifdef MAC 34771088Sjasoneextern bool mac_priv_check_fp_flag; 34871088Sjasone#else 34971088Sjasone#define mac_priv_check_fp_flag false 35071088Sjasone#endif 35171088Sjasone#define mac_priv_check_enabled() __predict_false(mac_priv_check_fp_flag) 35271088Sjasonestatic inline int 35371088Sjasonemac_priv_check(struct ucred *cred, int priv) 35471088Sjasone{ 35571088Sjasone 35671088Sjasone if (mac_priv_check_enabled()) 35771088Sjasone return (mac_priv_check_impl(cred, priv)); 35871088Sjasone return (0); 35971088Sjasone} 36071088Sjasone 36171088Sjasoneint mac_priv_grant_impl(struct ucred *cred, int priv); 36271088Sjasone#ifdef MAC 36371088Sjasoneextern bool mac_priv_grant_fp_flag; 36471088Sjasone#else 36571088Sjasone#define mac_priv_grant_fp_flag false 36671088Sjasone#endif 36771088Sjasone#define mac_priv_grant_enabled() __predict_false(mac_priv_grant_fp_flag) 36871088Sjasonestatic inline int 36971088Sjasonemac_priv_grant(struct ucred *cred, int priv) 37071088Sjasone{ 37171088Sjasone 37271088Sjasone if (mac_priv_grant_enabled()) 37371088Sjasone return (mac_priv_grant_impl(cred, priv)); 37471088Sjasone return (EPERM); 37571088Sjasone} 37671088Sjasone 37771088Sjasoneint mac_proc_check_debug(struct ucred *cred, struct proc *p); 37871088Sjasoneint mac_proc_check_sched(struct ucred *cred, struct proc *p); 37971088Sjasoneint mac_proc_check_signal(struct ucred *cred, struct proc *p, 38071088Sjasone int signum); 38171088Sjasoneint mac_proc_check_wait(struct ucred *cred, struct proc *p); 38271088Sjasonevoid mac_proc_destroy(struct proc *); 38371088Sjasonevoid mac_proc_init(struct proc *); 38471088Sjasonevoid mac_proc_vm_revoke(struct thread *td); 38571088Sjasoneint mac_execve_enter(struct image_params *imgp, struct mac *mac_p); 38671088Sjasonevoid mac_execve_exit(struct image_params *imgp); 38771088Sjasonevoid mac_execve_interpreter_enter(struct vnode *interpvp, 38871088Sjasone struct label **interplabel); 38971088Sjasonevoid mac_execve_interpreter_exit(struct label *interpvplabel); 39071088Sjasone 39171088Sjasoneint mac_socket_check_accept(struct ucred *cred, struct socket *so); 39271088Sjasoneint mac_socket_check_bind(struct ucred *cred, struct socket *so, 39371088Sjasone struct sockaddr *sa); 39471088Sjasoneint mac_socket_check_connect(struct ucred *cred, struct socket *so, 39571088Sjasone struct sockaddr *sa); 39671088Sjasoneint mac_socket_check_create(struct ucred *cred, int domain, int type, 39771088Sjasone int proto); 39871088Sjasoneint mac_socket_check_deliver(struct socket *so, struct mbuf *m); 39971088Sjasoneint mac_socket_check_listen(struct ucred *cred, struct socket *so); 40071088Sjasoneint mac_socket_check_poll(struct ucred *cred, struct socket *so); 40171088Sjasoneint mac_socket_check_receive(struct ucred *cred, struct socket *so); 40271088Sjasoneint mac_socket_check_send(struct ucred *cred, struct socket *so); 40371088Sjasoneint mac_socket_check_stat(struct ucred *cred, struct socket *so); 40471088Sjasoneint mac_socket_check_visible(struct ucred *cred, struct socket *so); 40571088Sjasonevoid mac_socket_create_mbuf(struct socket *so, struct mbuf *m); 40671088Sjasonevoid mac_socket_create(struct ucred *cred, struct socket *so); 40771088Sjasonevoid mac_socket_destroy(struct socket *); 40871088Sjasoneint mac_socket_init(struct socket *, int); 40971088Sjasonevoid mac_socket_newconn(struct socket *oldso, struct socket *newso); 41071088Sjasoneint mac_getsockopt_label(struct ucred *cred, struct socket *so, 41171088Sjasone const struct mac *extmac); 41271088Sjasoneint mac_getsockopt_peerlabel(struct ucred *cred, struct socket *so, 41371088Sjasone const struct mac *extmac); 41471088Sjasoneint mac_setsockopt_label(struct ucred *cred, struct socket *so, 41571088Sjasone const struct mac *extmac); 41671088Sjasone 41771088Sjasonevoid mac_socketpeer_set_from_mbuf(struct mbuf *m, struct socket *so); 41871088Sjasonevoid mac_socketpeer_set_from_socket(struct socket *oldso, 41971088Sjasone struct socket *newso); 42071088Sjasone 42171088Sjasonevoid mac_syncache_create(struct label *l, struct inpcb *inp); 42271088Sjasonevoid mac_syncache_create_mbuf(struct label *l, struct mbuf *m); 42371088Sjasonevoid mac_syncache_destroy(struct label **l); 42471088Sjasoneint mac_syncache_init(struct label **l); 42571088Sjasone 42671088Sjasoneint mac_system_check_acct(struct ucred *cred, struct vnode *vp); 42771088Sjasoneint mac_system_check_audit(struct ucred *cred, void *record, int length); 42871088Sjasoneint mac_system_check_auditctl(struct ucred *cred, struct vnode *vp); 42971088Sjasoneint mac_system_check_auditon(struct ucred *cred, int cmd); 43071088Sjasoneint mac_system_check_reboot(struct ucred *cred, int howto); 43171088Sjasoneint mac_system_check_swapon(struct ucred *cred, struct vnode *vp); 43271088Sjasoneint mac_system_check_swapoff(struct ucred *cred, struct vnode *vp); 43371088Sjasoneint mac_system_check_sysctl(struct ucred *cred, struct sysctl_oid *oidp, 43471088Sjasone void *arg1, int arg2, struct sysctl_req *req); 43571088Sjasone 43671088Sjasonevoid mac_sysvmsg_cleanup(struct msg *msgptr); 43771088Sjasonevoid mac_sysvmsg_create(struct ucred *cred, struct msqid_kernel *msqkptr, 43871088Sjasone struct msg *msgptr); 43971088Sjasonevoid mac_sysvmsg_destroy(struct msg *); 44071088Sjasonevoid mac_sysvmsg_init(struct msg *); 44171088Sjasone 44271088Sjasoneint mac_sysvmsq_check_msgmsq(struct ucred *cred, struct msg *msgptr, 44371088Sjasone struct msqid_kernel *msqkptr); 44471088Sjasoneint mac_sysvmsq_check_msgrcv(struct ucred *cred, struct msg *msgptr); 44571088Sjasoneint mac_sysvmsq_check_msgrmid(struct ucred *cred, struct msg *msgptr); 44671088Sjasoneint mac_sysvmsq_check_msqctl(struct ucred *cred, 44771088Sjasone struct msqid_kernel *msqkptr, int cmd); 44871088Sjasoneint mac_sysvmsq_check_msqget(struct ucred *cred, 44971088Sjasone struct msqid_kernel *msqkptr); 45071088Sjasoneint mac_sysvmsq_check_msqrcv(struct ucred *cred, 45171088Sjasone struct msqid_kernel *msqkptr); 45271088Sjasoneint mac_sysvmsq_check_msqsnd(struct ucred *cred, 45371088Sjasone struct msqid_kernel *msqkptr); 45471088Sjasonevoid mac_sysvmsq_cleanup(struct msqid_kernel *msqkptr); 45571088Sjasonevoid mac_sysvmsq_create(struct ucred *cred, struct msqid_kernel *msqkptr); 45671088Sjasonevoid mac_sysvmsq_destroy(struct msqid_kernel *); 45771088Sjasonevoid mac_sysvmsq_init(struct msqid_kernel *); 45871088Sjasone 45971088Sjasoneint mac_sysvsem_check_semctl(struct ucred *cred, 46071088Sjasone struct semid_kernel *semakptr, int cmd); 46171088Sjasoneint mac_sysvsem_check_semget(struct ucred *cred, 46271088Sjasone struct semid_kernel *semakptr); 46371088Sjasoneint mac_sysvsem_check_semop(struct ucred *cred, 46471088Sjasone struct semid_kernel *semakptr, size_t accesstype); 46571088Sjasonevoid mac_sysvsem_cleanup(struct semid_kernel *semakptr); 46671088Sjasonevoid mac_sysvsem_create(struct ucred *cred, 46771088Sjasone struct semid_kernel *semakptr); 46871088Sjasonevoid mac_sysvsem_destroy(struct semid_kernel *); 46971088Sjasonevoid mac_sysvsem_init(struct semid_kernel *); 47071088Sjasone 47171088Sjasoneint mac_sysvshm_check_shmat(struct ucred *cred, 47271088Sjasone struct shmid_kernel *shmsegptr, int shmflg); 47371088Sjasoneint mac_sysvshm_check_shmctl(struct ucred *cred, 47471088Sjasone struct shmid_kernel *shmsegptr, int cmd); 47571088Sjasoneint mac_sysvshm_check_shmdt(struct ucred *cred, 47671088Sjasone struct shmid_kernel *shmsegptr); 47771088Sjasoneint mac_sysvshm_check_shmget(struct ucred *cred, 47871088Sjasone struct shmid_kernel *shmsegptr, int shmflg); 47971088Sjasonevoid mac_sysvshm_cleanup(struct shmid_kernel *shmsegptr); 48071088Sjasonevoid mac_sysvshm_create(struct ucred *cred, 48171088Sjasone struct shmid_kernel *shmsegptr); 48271088Sjasonevoid mac_sysvshm_destroy(struct shmid_kernel *); 48371088Sjasonevoid mac_sysvshm_init(struct shmid_kernel *); 48471088Sjasone 48571088Sjasonevoid mac_thread_userret(struct thread *td); 48671088Sjasone 48771088Sjasone#if defined(MAC) && defined(DEBUG_VFS_LOCKS) 48871088Sjasonevoid mac_vnode_assert_locked(struct vnode *vp, const char *func); 48971088Sjasone#else 49071088Sjasone#define mac_vnode_assert_locked(vp, func) do { } while (0) 49171088Sjasone#endif 49271088Sjasone 49371088Sjasoneint mac_vnode_associate_extattr(struct mount *mp, struct vnode *vp); 49471088Sjasonevoid mac_vnode_associate_singlelabel(struct mount *mp, struct vnode *vp); 49571088Sjasoneint mac_vnode_check_access_impl(struct ucred *cred, struct vnode *dvp, 49671088Sjasone accmode_t accmode); 49771088Sjasoneextern bool mac_vnode_check_access_fp_flag; 49871088Sjasone#define mac_vnode_check_access_enabled() __predict_false(mac_vnode_check_access_fp_flag) 49971088Sjasonestatic inline int 50071088Sjasonemac_vnode_check_access(struct ucred *cred, struct vnode *dvp, 50171088Sjasone accmode_t accmode) 50271088Sjasone{ 50371088Sjasone 50471088Sjasone mac_vnode_assert_locked(dvp, "mac_vnode_check_access"); 50571088Sjasone if (mac_vnode_check_access_enabled()) 50671088Sjasone return (mac_vnode_check_access_impl(cred, dvp, accmode)); 50771088Sjasone return (0); 50871088Sjasone} 50971088Sjasoneint mac_vnode_check_chdir(struct ucred *cred, struct vnode *dvp); 51071088Sjasoneint mac_vnode_check_chroot(struct ucred *cred, struct vnode *dvp); 51171088Sjasoneint mac_vnode_check_create(struct ucred *cred, struct vnode *dvp, 51271088Sjasone struct componentname *cnp, struct vattr *vap); 51371088Sjasoneint mac_vnode_check_deleteacl(struct ucred *cred, struct vnode *vp, 51471088Sjasone acl_type_t type); 51571088Sjasoneint mac_vnode_check_deleteextattr(struct ucred *cred, struct vnode *vp, 51671088Sjasone int attrnamespace, const char *name); 51771088Sjasoneint mac_vnode_check_exec(struct ucred *cred, struct vnode *vp, 51871088Sjasone struct image_params *imgp); 51971088Sjasoneint mac_vnode_check_getacl(struct ucred *cred, struct vnode *vp, 52071088Sjasone acl_type_t type); 52171088Sjasoneint mac_vnode_check_getextattr(struct ucred *cred, struct vnode *vp, 52271088Sjasone int attrnamespace, const char *name); 52371088Sjasoneint mac_vnode_check_link(struct ucred *cred, struct vnode *dvp, 52471088Sjasone struct vnode *vp, struct componentname *cnp); 52571088Sjasoneint mac_vnode_check_listextattr(struct ucred *cred, struct vnode *vp, 52671088Sjasone int attrnamespace); 52771088Sjasone 52871088Sjasoneint mac_vnode_check_lookup_impl(struct ucred *cred, struct vnode *dvp, 52971088Sjasone struct componentname *cnp); 53071088Sjasone#ifdef MAC 53171088Sjasoneextern bool mac_vnode_check_lookup_fp_flag; 53271088Sjasone#else 53371088Sjasone#define mac_vnode_check_lookup_fp_flag false 53471088Sjasone#endif 53571088Sjasone#define mac_vnode_check_lookup_enabled() __predict_false(mac_vnode_check_lookup_fp_flag) 53671088Sjasonestatic inline int 53771088Sjasonemac_vnode_check_lookup(struct ucred *cred, struct vnode *dvp, 53871088Sjasone struct componentname *cnp) 53971088Sjasone{ 54071088Sjasone 54171088Sjasone mac_vnode_assert_locked(dvp, "mac_vnode_check_lookup"); 54271088Sjasone if (mac_vnode_check_lookup_enabled()) 54371088Sjasone return (mac_vnode_check_lookup_impl(cred, dvp, cnp)); 54471088Sjasone return (0); 54571088Sjasone} 54671088Sjasone 54771088Sjasoneint mac_vnode_check_mmap_impl(struct ucred *cred, struct vnode *vp, int prot, 548 int flags); 549#ifdef MAC 550extern bool mac_vnode_check_mmap_fp_flag; 551#else 552#define mac_vnode_check_mmap_fp_flag false 553#endif 554#define mac_vnode_check_mmap_enabled() __predict_false(mac_vnode_check_mmap_fp_flag) 555static inline int 556mac_vnode_check_mmap(struct ucred *cred, struct vnode *vp, int prot, 557 int flags) 558{ 559 560 mac_vnode_assert_locked(vp, "mac_vnode_check_mmap"); 561 if (mac_vnode_check_mmap_enabled()) 562 return (mac_vnode_check_mmap_impl(cred, vp, prot, flags)); 563 return (0); 564} 565 566int mac_vnode_check_open_impl(struct ucred *cred, struct vnode *vp, 567 accmode_t accmode); 568#ifdef MAC 569extern bool mac_vnode_check_open_fp_flag; 570#else 571#define mac_vnode_check_open_fp_flag false 572#endif 573#define mac_vnode_check_open_enabled() __predict_false(mac_vnode_check_open_fp_flag) 574static inline int 575mac_vnode_check_open(struct ucred *cred, struct vnode *vp, 576 accmode_t accmode) 577{ 578 579 mac_vnode_assert_locked(vp, "mac_vnode_check_open"); 580 if (mac_vnode_check_open_enabled()) 581 return (mac_vnode_check_open_impl(cred, vp, accmode)); 582 return (0); 583} 584 585int mac_vnode_check_mprotect(struct ucred *cred, struct vnode *vp, 586 int prot); 587 588#define mac_vnode_check_poll_enabled() __predict_false(mac_vnode_check_poll_fp_flag) 589#ifdef MAC 590extern bool mac_vnode_check_poll_fp_flag; 591int mac_vnode_check_poll(struct ucred *active_cred, 592 struct ucred *file_cred, struct vnode *vp); 593#else 594#define mac_vnode_check_poll_fp_flag false 595static inline int 596mac_vnode_check_poll(struct ucred *active_cred, struct ucred *file_cred, 597 struct vnode *vp) 598{ 599 600 return (0); 601} 602#endif 603int mac_vnode_check_readdir(struct ucred *cred, struct vnode *vp); 604int mac_vnode_check_readlink_impl(struct ucred *cred, struct vnode *dvp); 605#ifdef MAC 606extern bool mac_vnode_check_readlink_fp_flag; 607#else 608#define mac_vnode_check_readlink_fp_flag false 609#endif 610#define mac_vnode_check_readlink_enabled() __predict_false(mac_vnode_check_readlink_fp_flag) 611static inline int 612mac_vnode_check_readlink(struct ucred *cred, struct vnode *vp) 613{ 614 615 mac_vnode_assert_locked(vp, "mac_vnode_check_readlink"); 616 if (mac_vnode_check_readlink_enabled()) 617 return (mac_vnode_check_readlink_impl(cred, vp)); 618 return (0); 619} 620#define mac_vnode_check_rename_from_enabled() __predict_false(mac_vnode_check_rename_from_fp_flag) 621#ifdef MAC 622extern bool mac_vnode_check_rename_from_fp_flag; 623#endif 624int mac_vnode_check_rename_from(struct ucred *cred, struct vnode *dvp, 625 struct vnode *vp, struct componentname *cnp); 626int mac_vnode_check_rename_to(struct ucred *cred, struct vnode *dvp, 627 struct vnode *vp, int samedir, struct componentname *cnp); 628int mac_vnode_check_revoke(struct ucred *cred, struct vnode *vp); 629int mac_vnode_check_setacl(struct ucred *cred, struct vnode *vp, 630 acl_type_t type, struct acl *acl); 631int mac_vnode_check_setextattr(struct ucred *cred, struct vnode *vp, 632 int attrnamespace, const char *name); 633int mac_vnode_check_setflags(struct ucred *cred, struct vnode *vp, 634 u_long flags); 635int mac_vnode_check_setmode(struct ucred *cred, struct vnode *vp, 636 mode_t mode); 637int mac_vnode_check_setowner(struct ucred *cred, struct vnode *vp, 638 uid_t uid, gid_t gid); 639int mac_vnode_check_setutimes(struct ucred *cred, struct vnode *vp, 640 struct timespec atime, struct timespec mtime); 641 642int mac_vnode_check_stat_impl(struct ucred *active_cred, 643 struct ucred *file_cred, struct vnode *vp); 644#ifdef MAC 645extern bool mac_vnode_check_stat_fp_flag; 646#else 647#define mac_vnode_check_stat_fp_flag false 648#endif 649#define mac_vnode_check_stat_enabled() __predict_false(mac_vnode_check_stat_fp_flag) 650static inline int 651mac_vnode_check_stat(struct ucred *active_cred, struct ucred *file_cred, 652 struct vnode *vp) 653{ 654 655 mac_vnode_assert_locked(vp, "mac_vnode_check_stat"); 656 if (mac_vnode_check_stat_enabled()) 657 return (mac_vnode_check_stat_impl(active_cred, file_cred, vp)); 658 return (0); 659} 660 661int mac_vnode_check_read_impl(struct ucred *active_cred, 662 struct ucred *file_cred, struct vnode *vp); 663#ifdef MAC 664extern bool mac_vnode_check_read_fp_flag; 665#else 666#define mac_vnode_check_read_fp_flag false 667#endif 668#define mac_vnode_check_read_enabled() __predict_false(mac_vnode_check_read_fp_flag) 669static inline int 670mac_vnode_check_read(struct ucred *active_cred, struct ucred *file_cred, 671 struct vnode *vp) 672{ 673 674 mac_vnode_assert_locked(vp, "mac_vnode_check_read"); 675 if (mac_vnode_check_read_enabled()) 676 return (mac_vnode_check_read_impl(active_cred, file_cred, vp)); 677 return (0); 678} 679 680int mac_vnode_check_write_impl(struct ucred *active_cred, 681 struct ucred *file_cred, struct vnode *vp); 682#ifdef MAC 683extern bool mac_vnode_check_write_fp_flag; 684#else 685#define mac_vnode_check_write_fp_flag false 686#endif 687#define mac_vnode_check_write_enabled() __predict_false(mac_vnode_check_write_fp_flag) 688static inline int 689mac_vnode_check_write(struct ucred *active_cred, struct ucred *file_cred, 690 struct vnode *vp) 691{ 692 693 mac_vnode_assert_locked(vp, "mac_vnode_check_write"); 694 if (mac_vnode_check_write_enabled()) 695 return (mac_vnode_check_write_impl(active_cred, file_cred, vp)); 696 return (0); 697} 698 699int mac_vnode_check_unlink(struct ucred *cred, struct vnode *dvp, 700 struct vnode *vp, struct componentname *cnp); 701void mac_vnode_copy_label(struct label *, struct label *); 702void mac_vnode_init(struct vnode *); 703int mac_vnode_create_extattr(struct ucred *cred, struct mount *mp, 704 struct vnode *dvp, struct vnode *vp, struct componentname *cnp); 705void mac_vnode_destroy(struct vnode *); 706void mac_vnode_execve_transition(struct ucred *oldcred, 707 struct ucred *newcred, struct vnode *vp, 708 struct label *interpvplabel, struct image_params *imgp); 709int mac_vnode_execve_will_transition(struct ucred *cred, 710 struct vnode *vp, struct label *interpvplabel, 711 struct image_params *imgp); 712void mac_vnode_relabel(struct ucred *cred, struct vnode *vp, 713 struct label *newlabel); 714 715/* 716 * Calls to help various file systems implement labeling functionality using 717 * their existing EA implementation. 718 */ 719int vop_stdsetlabel_ea(struct vop_setlabel_args *ap); 720 721#endif /* !_SECURITY_MAC_MAC_FRAMEWORK_H_ */ 722