1ddcdf265SRobert Watson /*- 2ddcdf265SRobert Watson * Copyright (c) 1999, 2000, 2001, 2002 Robert N. M. Watson 3ddcdf265SRobert Watson * Copyright (c) 2001, 2002 Networks Associates Technology, Inc. 4ddcdf265SRobert Watson * All rights reserved. 5ddcdf265SRobert Watson * 6ddcdf265SRobert Watson * This software was developed by Robert Watson for the TrustedBSD Project. 7ddcdf265SRobert Watson * 8ddcdf265SRobert Watson * This software was developed for the FreeBSD Project in part by NAI Labs, 9ddcdf265SRobert Watson * the Security Research Division of Network Associates, Inc. under 10ddcdf265SRobert Watson * DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA 11ddcdf265SRobert Watson * CHATS research program. 12ddcdf265SRobert Watson * 13ddcdf265SRobert Watson * Redistribution and use in source and binary forms, with or without 14ddcdf265SRobert Watson * modification, are permitted provided that the following conditions 15ddcdf265SRobert Watson * are met: 16ddcdf265SRobert Watson * 1. Redistributions of source code must retain the above copyright 17ddcdf265SRobert Watson * notice, this list of conditions and the following disclaimer. 18ddcdf265SRobert Watson * 2. Redistributions in binary form must reproduce the above copyright 19ddcdf265SRobert Watson * notice, this list of conditions and the following disclaimer in the 20ddcdf265SRobert Watson * documentation and/or other materials provided with the distribution. 21ddcdf265SRobert Watson * 3. The names of the authors may not be used to endorse or promote 22ddcdf265SRobert Watson * products derived from this software without specific prior written 23ddcdf265SRobert Watson * permission. 24ddcdf265SRobert Watson * 25ddcdf265SRobert Watson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 26ddcdf265SRobert Watson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27ddcdf265SRobert Watson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28ddcdf265SRobert Watson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 29ddcdf265SRobert Watson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30ddcdf265SRobert Watson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31ddcdf265SRobert Watson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32ddcdf265SRobert Watson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33ddcdf265SRobert Watson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34ddcdf265SRobert Watson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35ddcdf265SRobert Watson * SUCH DAMAGE. 36ddcdf265SRobert Watson * 37ddcdf265SRobert Watson * $FreeBSD$ 38ddcdf265SRobert Watson */ 39ddcdf265SRobert Watson /* 40ddcdf265SRobert Watson * Kernel interface for MAC policy modules. 41ddcdf265SRobert Watson */ 42ddcdf265SRobert Watson #ifndef _SYS_MAC_POLICY_H 43ddcdf265SRobert Watson #define _SYS_MAC_POLICY_H 44ddcdf265SRobert Watson 45ddcdf265SRobert Watson /*- 46ddcdf265SRobert Watson * Pluggable access control policy definition structure. 47ddcdf265SRobert Watson * 48ddcdf265SRobert Watson * List of operations that are performed as part of the implementation 49ddcdf265SRobert Watson * of a MAC policy. Policy implementors declare operations with a 50ddcdf265SRobert Watson * mac_policy_ops structure, and using the MAC_POLICY_SET() macro. 51ddcdf265SRobert Watson * If an entry point is not declared, then then the policy will be ignored 52ddcdf265SRobert Watson * during evaluation of that event or check. 53ddcdf265SRobert Watson * 54ddcdf265SRobert Watson * Operations are sorted first by general class of operation, then 55ddcdf265SRobert Watson * alphabetically. 56ddcdf265SRobert Watson */ 57ddcdf265SRobert Watson struct mac_policy_conf; 58ddcdf265SRobert Watson struct mac_policy_ops { 59ddcdf265SRobert Watson /* 60ddcdf265SRobert Watson * Policy module operations. 61ddcdf265SRobert Watson */ 62ddcdf265SRobert Watson void (*mpo_destroy)(struct mac_policy_conf *mpc); 63ddcdf265SRobert Watson void (*mpo_init)(struct mac_policy_conf *mpc); 64ddcdf265SRobert Watson 65ddcdf265SRobert Watson /* 6627f2eac7SRobert Watson * General policy-directed security system call so that policies 6727f2eac7SRobert Watson * may implement new services without reserving explicit 6827f2eac7SRobert Watson * system call numbers. 6927f2eac7SRobert Watson */ 7027f2eac7SRobert Watson int (*mpo_syscall)(struct thread *td, int call, void *arg); 7127f2eac7SRobert Watson 7227f2eac7SRobert Watson /* 73ddcdf265SRobert Watson * Label operations. 74ddcdf265SRobert Watson */ 75ddcdf265SRobert Watson void (*mpo_init_bpfdesc)(struct bpf_d *, struct label *label); 76ddcdf265SRobert Watson void (*mpo_init_cred)(struct ucred *, struct label *label); 77ddcdf265SRobert Watson void (*mpo_init_devfsdirent)(struct devfs_dirent *, 78ddcdf265SRobert Watson struct label *label); 79ddcdf265SRobert Watson void (*mpo_init_ifnet)(struct ifnet *, struct label *label); 80ddcdf265SRobert Watson void (*mpo_init_ipq)(struct ipq *ipq, struct label *label); 81ddcdf265SRobert Watson int (*mpo_init_mbuf)(struct mbuf *, int how, struct label *label); 82ddcdf265SRobert Watson void (*mpo_init_mount)(struct mount *, struct label *mntlabel, 83ddcdf265SRobert Watson struct label *fslabel); 84ddcdf265SRobert Watson void (*mpo_init_socket)(struct socket *so, struct label *label, 85ddcdf265SRobert Watson struct label *peerlabel); 86ddcdf265SRobert Watson void (*mpo_init_pipe)(struct pipe *pipe, struct label *label); 87ddcdf265SRobert Watson void (*mpo_init_temp)(struct label *label); 88ddcdf265SRobert Watson void (*mpo_init_vnode)(struct vnode *, struct label *label); 89ddcdf265SRobert Watson void (*mpo_destroy_bpfdesc)(struct bpf_d *, struct label *label); 90ddcdf265SRobert Watson void (*mpo_destroy_cred)(struct ucred *, struct label *label); 91ddcdf265SRobert Watson void (*mpo_destroy_devfsdirent)(struct devfs_dirent *de, 92ddcdf265SRobert Watson struct label *label); 93ddcdf265SRobert Watson void (*mpo_destroy_ifnet)(struct ifnet *, struct label *label); 94ddcdf265SRobert Watson void (*mpo_destroy_ipq)(struct ipq *ipq, struct label *label); 95ddcdf265SRobert Watson void (*mpo_destroy_mbuf)(struct mbuf *, struct label *label); 96ddcdf265SRobert Watson void (*mpo_destroy_mount)(struct mount *, struct label *mntlabel, 97ddcdf265SRobert Watson struct label *fslabel); 98ddcdf265SRobert Watson void (*mpo_destroy_socket)(struct socket *so, struct label *label, 99ddcdf265SRobert Watson struct label *peerlabel); 100ddcdf265SRobert Watson void (*mpo_destroy_pipe)(struct pipe *pipe, struct label *label); 101ddcdf265SRobert Watson void (*mpo_destroy_temp)(struct label *label); 102ddcdf265SRobert Watson void (*mpo_destroy_vnode)(struct vnode *, struct label *label); 103ddcdf265SRobert Watson int (*mpo_externalize)(struct label *label, struct mac *extmac); 104ddcdf265SRobert Watson int (*mpo_internalize)(struct label *label, struct mac *extmac); 105ddcdf265SRobert Watson 106ddcdf265SRobert Watson /* 107ddcdf265SRobert Watson * Labeling event operations: file system objects, and things that 108ddcdf265SRobert Watson * look a lot like file system objects. 109ddcdf265SRobert Watson */ 110ddcdf265SRobert Watson void (*mpo_create_devfs_device)(dev_t dev, struct devfs_dirent *de, 111ddcdf265SRobert Watson struct label *label); 112ddcdf265SRobert Watson void (*mpo_create_devfs_directory)(char *dirname, int dirnamelen, 113ddcdf265SRobert Watson struct devfs_dirent *de, struct label *label); 114ddcdf265SRobert Watson void (*mpo_create_devfs_vnode)(struct devfs_dirent *de, 115ddcdf265SRobert Watson struct label *direntlabel, struct vnode *vp, 116ddcdf265SRobert Watson struct label *vnodelabel); 117ddcdf265SRobert Watson void (*mpo_create_vnode)(struct ucred *cred, struct vnode *parent, 118ddcdf265SRobert Watson struct label *parentlabel, struct vnode *child, 119ddcdf265SRobert Watson struct label *childlabel); 120ddcdf265SRobert Watson void (*mpo_create_mount)(struct ucred *cred, struct mount *mp, 121ddcdf265SRobert Watson struct label *mntlabel, struct label *fslabel); 122ddcdf265SRobert Watson void (*mpo_create_root_mount)(struct ucred *cred, struct mount *mp, 123ddcdf265SRobert Watson struct label *mountlabel, struct label *fslabel); 124ddcdf265SRobert Watson void (*mpo_relabel_vnode)(struct ucred *cred, struct vnode *vp, 125ddcdf265SRobert Watson struct label *vnodelabel, struct label *label); 126ddcdf265SRobert Watson int (*mpo_stdcreatevnode_ea)(struct vnode *vp, 127ddcdf265SRobert Watson struct label *vnodelabel); 128ddcdf265SRobert Watson void (*mpo_update_devfsdirent)(struct devfs_dirent *devfs_dirent, 129ddcdf265SRobert Watson struct label *direntlabel, struct vnode *vp, 130ddcdf265SRobert Watson struct label *vnodelabel); 131ddcdf265SRobert Watson void (*mpo_update_procfsvnode)(struct vnode *vp, 132ddcdf265SRobert Watson struct label *vnodelabel, struct ucred *cred); 133ddcdf265SRobert Watson int (*mpo_update_vnode_from_extattr)(struct vnode *vp, 134ddcdf265SRobert Watson struct label *vnodelabel, struct mount *mp, 135ddcdf265SRobert Watson struct label *fslabel); 136ddcdf265SRobert Watson int (*mpo_update_vnode_from_externalized)(struct vnode *vp, 137ddcdf265SRobert Watson struct label *vnodelabel, struct mac *mac); 138ddcdf265SRobert Watson void (*mpo_update_vnode_from_mount)(struct vnode *vp, 139ddcdf265SRobert Watson struct label *vnodelabel, struct mount *mp, 140ddcdf265SRobert Watson struct label *fslabel); 141ddcdf265SRobert Watson 142ddcdf265SRobert Watson /* 143ddcdf265SRobert Watson * Labeling event operations: IPC objects. 144ddcdf265SRobert Watson */ 145ddcdf265SRobert Watson void (*mpo_create_mbuf_from_socket)(struct socket *so, 146ddcdf265SRobert Watson struct label *socketlabel, struct mbuf *m, 147ddcdf265SRobert Watson struct label *mbuflabel); 148ddcdf265SRobert Watson void (*mpo_create_socket)(struct ucred *cred, struct socket *so, 149ddcdf265SRobert Watson struct label *socketlabel); 150ddcdf265SRobert Watson void (*mpo_create_socket_from_socket)(struct socket *oldsocket, 151ddcdf265SRobert Watson struct label *oldsocketlabel, struct socket *newsocket, 152ddcdf265SRobert Watson struct label *newsocketlabel); 153ddcdf265SRobert Watson void (*mpo_relabel_socket)(struct ucred *cred, struct socket *so, 154ddcdf265SRobert Watson struct label *oldlabel, struct label *newlabel); 155ddcdf265SRobert Watson void (*mpo_relabel_pipe)(struct ucred *cred, struct pipe *pipe, 156ddcdf265SRobert Watson struct label *oldlabel, struct label *newlabel); 157ddcdf265SRobert Watson void (*mpo_set_socket_peer_from_mbuf)(struct mbuf *mbuf, 158ddcdf265SRobert Watson struct label *mbuflabel, struct socket *so, 159ddcdf265SRobert Watson struct label *socketpeerlabel); 160ddcdf265SRobert Watson void (*mpo_set_socket_peer_from_socket)(struct socket *oldsocket, 161ddcdf265SRobert Watson struct label *oldsocketlabel, struct socket *newsocket, 162ddcdf265SRobert Watson struct label *newsocketpeerlabel); 163ddcdf265SRobert Watson void (*mpo_create_pipe)(struct ucred *cred, struct pipe *pipe, 164ddcdf265SRobert Watson struct label *pipelabel); 165ddcdf265SRobert Watson 166ddcdf265SRobert Watson /* 167ddcdf265SRobert Watson * Labeling event operations: network objects. 168ddcdf265SRobert Watson */ 169ddcdf265SRobert Watson void (*mpo_create_bpfdesc)(struct ucred *cred, struct bpf_d *bpf_d, 170ddcdf265SRobert Watson struct label *bpflabel); 171ddcdf265SRobert Watson void (*mpo_create_ifnet)(struct ifnet *ifnet, 172ddcdf265SRobert Watson struct label *ifnetlabel); 173ddcdf265SRobert Watson void (*mpo_create_ipq)(struct mbuf *fragment, 174ddcdf265SRobert Watson struct label *fragmentlabel, struct ipq *ipq, 175ddcdf265SRobert Watson struct label *ipqlabel); 176ddcdf265SRobert Watson void (*mpo_create_datagram_from_ipq) 177ddcdf265SRobert Watson (struct ipq *ipq, struct label *ipqlabel, 178ddcdf265SRobert Watson struct mbuf *datagram, struct label *datagramlabel); 179ddcdf265SRobert Watson void (*mpo_create_fragment)(struct mbuf *datagram, 180ddcdf265SRobert Watson struct label *datagramlabel, struct mbuf *fragment, 181ddcdf265SRobert Watson struct label *fragmentlabel); 182ddcdf265SRobert Watson void (*mpo_create_mbuf_from_mbuf)(struct mbuf *oldmbuf, 183ddcdf265SRobert Watson struct label *oldlabel, struct mbuf *newmbuf, 184ddcdf265SRobert Watson struct label *newlabel); 185ddcdf265SRobert Watson void (*mpo_create_mbuf_linklayer)(struct ifnet *ifnet, 186ddcdf265SRobert Watson struct label *ifnetlabel, struct mbuf *mbuf, 187ddcdf265SRobert Watson struct label *mbuflabel); 188ddcdf265SRobert Watson void (*mpo_create_mbuf_from_bpfdesc)(struct bpf_d *bpf_d, 189ddcdf265SRobert Watson struct label *bpflabel, struct mbuf *mbuf, 190ddcdf265SRobert Watson struct label *mbuflabel); 191ddcdf265SRobert Watson void (*mpo_create_mbuf_from_ifnet)(struct ifnet *ifnet, 192ddcdf265SRobert Watson struct label *ifnetlabel, struct mbuf *mbuf, 193ddcdf265SRobert Watson struct label *mbuflabel); 194ddcdf265SRobert Watson void (*mpo_create_mbuf_multicast_encap)(struct mbuf *oldmbuf, 195ddcdf265SRobert Watson struct label *oldmbuflabel, struct ifnet *ifnet, 196ddcdf265SRobert Watson struct label *ifnetlabel, struct mbuf *newmbuf, 197ddcdf265SRobert Watson struct label *newmbuflabel); 198ddcdf265SRobert Watson void (*mpo_create_mbuf_netlayer)(struct mbuf *oldmbuf, 199ddcdf265SRobert Watson struct label *oldmbuflabel, struct mbuf *newmbuf, 200ddcdf265SRobert Watson struct label *newmbuflabel); 201ddcdf265SRobert Watson int (*mpo_fragment_match)(struct mbuf *fragment, 202ddcdf265SRobert Watson struct label *fragmentlabel, struct ipq *ipq, 203ddcdf265SRobert Watson struct label *ipqlabel); 204ddcdf265SRobert Watson void (*mpo_relabel_ifnet)(struct ucred *cred, struct ifnet *ifnet, 205ddcdf265SRobert Watson struct label *ifnetlabel, struct label *newlabel); 206ddcdf265SRobert Watson void (*mpo_update_ipq)(struct mbuf *fragment, 207ddcdf265SRobert Watson struct label *fragmentlabel, struct ipq *ipq, 208ddcdf265SRobert Watson struct label *ipqlabel); 209ddcdf265SRobert Watson 210ddcdf265SRobert Watson /* 211ddcdf265SRobert Watson * Labeling event operations: processes. 212ddcdf265SRobert Watson */ 213ddcdf265SRobert Watson void (*mpo_create_cred)(struct ucred *parent_cred, 214ddcdf265SRobert Watson struct ucred *child_cred); 215ddcdf265SRobert Watson void (*mpo_execve_transition)(struct ucred *old, struct ucred *new, 216ddcdf265SRobert Watson struct vnode *vp, struct label *vnodelabel); 217ddcdf265SRobert Watson int (*mpo_execve_will_transition)(struct ucred *old, 218ddcdf265SRobert Watson struct vnode *vp, struct label *vnodelabel); 219ddcdf265SRobert Watson void (*mpo_create_proc0)(struct ucred *cred); 220ddcdf265SRobert Watson void (*mpo_create_proc1)(struct ucred *cred); 221ddcdf265SRobert Watson void (*mpo_relabel_cred)(struct ucred *cred, 222ddcdf265SRobert Watson struct label *newlabel); 223ddcdf265SRobert Watson 224ddcdf265SRobert Watson /* 225ddcdf265SRobert Watson * Access control checks. 226ddcdf265SRobert Watson */ 227ddcdf265SRobert Watson int (*mpo_check_bpfdesc_receive)(struct bpf_d *bpf_d, 228ddcdf265SRobert Watson struct label *bpflabel, struct ifnet *ifnet, 229ddcdf265SRobert Watson struct label *ifnetlabel); 230ddcdf265SRobert Watson int (*mpo_check_cred_relabel)(struct ucred *cred, 231ddcdf265SRobert Watson struct label *newlabel); 232ddcdf265SRobert Watson int (*mpo_check_cred_visible)(struct ucred *u1, struct ucred *u2); 233ddcdf265SRobert Watson int (*mpo_check_ifnet_relabel)(struct ucred *cred, 234ddcdf265SRobert Watson struct ifnet *ifnet, struct label *ifnetlabel, 235ddcdf265SRobert Watson struct label *newlabel); 236ddcdf265SRobert Watson int (*mpo_check_ifnet_transmit)(struct ifnet *ifnet, 237ddcdf265SRobert Watson struct label *ifnetlabel, struct mbuf *m, 238ddcdf265SRobert Watson struct label *mbuflabel); 239ddcdf265SRobert Watson int (*mpo_check_mount_stat)(struct ucred *cred, struct mount *mp, 240ddcdf265SRobert Watson struct label *mntlabel); 241ddcdf265SRobert Watson int (*mpo_check_pipe_ioctl)(struct ucred *cred, struct pipe *pipe, 242ddcdf265SRobert Watson struct label *pipelabel, unsigned long cmd, void *data); 243c024c3eeSRobert Watson int (*mpo_check_pipe_poll)(struct ucred *cred, struct pipe *pipe, 244c024c3eeSRobert Watson struct label *pipelabel); 245c024c3eeSRobert Watson int (*mpo_check_pipe_read)(struct ucred *cred, struct pipe *pipe, 246c024c3eeSRobert Watson struct label *pipelabel); 247ddcdf265SRobert Watson int (*mpo_check_pipe_relabel)(struct ucred *cred, 248ddcdf265SRobert Watson struct pipe *pipe, struct label *pipelabel, 249ddcdf265SRobert Watson struct label *newlabel); 250c024c3eeSRobert Watson int (*mpo_check_pipe_stat)(struct ucred *cred, struct pipe *pipe, 251c024c3eeSRobert Watson struct label *pipelabel); 252c024c3eeSRobert Watson int (*mpo_check_pipe_write)(struct ucred *cred, struct pipe *pipe, 253c024c3eeSRobert Watson struct label *pipelabel); 254ddcdf265SRobert Watson int (*mpo_check_proc_debug)(struct ucred *cred, 255ddcdf265SRobert Watson struct proc *proc); 256ddcdf265SRobert Watson int (*mpo_check_proc_sched)(struct ucred *cred, 257ddcdf265SRobert Watson struct proc *proc); 258ddcdf265SRobert Watson int (*mpo_check_proc_signal)(struct ucred *cred, 259ddcdf265SRobert Watson struct proc *proc, int signum); 260ddcdf265SRobert Watson int (*mpo_check_socket_bind)(struct ucred *cred, 261ddcdf265SRobert Watson struct socket *so, struct label *socketlabel, 262ddcdf265SRobert Watson struct sockaddr *sockaddr); 263ddcdf265SRobert Watson int (*mpo_check_socket_connect)(struct ucred *cred, 264ddcdf265SRobert Watson struct socket *so, struct label *socketlabel, 265ddcdf265SRobert Watson struct sockaddr *sockaddr); 266fb95b5d3SRobert Watson int (*mpo_check_socket_deliver)(struct socket *so, 267ddcdf265SRobert Watson struct label *socketlabel, struct mbuf *m, 268ddcdf265SRobert Watson struct label *mbuflabel); 269fb95b5d3SRobert Watson int (*mpo_check_socket_listen)(struct ucred *cred, 270fb95b5d3SRobert Watson struct socket *so, struct label *socketlabel); 271ddcdf265SRobert Watson int (*mpo_check_socket_relabel)(struct ucred *cred, 272ddcdf265SRobert Watson struct socket *so, struct label *socketlabel, 273ddcdf265SRobert Watson struct label *newlabel); 274ddcdf265SRobert Watson int (*mpo_check_socket_visible)(struct ucred *cred, 275ddcdf265SRobert Watson struct socket *so, struct label *socketlabel); 276ddcdf265SRobert Watson int (*mpo_check_vnode_access)(struct ucred *cred, 277ddcdf265SRobert Watson struct vnode *vp, struct label *label, int flags); 278ddcdf265SRobert Watson int (*mpo_check_vnode_chdir)(struct ucred *cred, 279ddcdf265SRobert Watson struct vnode *dvp, struct label *dlabel); 280ddcdf265SRobert Watson int (*mpo_check_vnode_chroot)(struct ucred *cred, 281ddcdf265SRobert Watson struct vnode *dvp, struct label *dlabel); 282ddcdf265SRobert Watson int (*mpo_check_vnode_create)(struct ucred *cred, 283ddcdf265SRobert Watson struct vnode *dvp, struct label *dlabel, 284ddcdf265SRobert Watson struct componentname *cnp, struct vattr *vap); 285ddcdf265SRobert Watson int (*mpo_check_vnode_delete)(struct ucred *cred, 286ddcdf265SRobert Watson struct vnode *dvp, struct label *dlabel, 287ddcdf265SRobert Watson struct vnode *vp, void *label, struct componentname *cnp); 288ddcdf265SRobert Watson int (*mpo_check_vnode_deleteacl)(struct ucred *cred, 289ddcdf265SRobert Watson struct vnode *vp, struct label *label, acl_type_t type); 290ddcdf265SRobert Watson int (*mpo_check_vnode_exec)(struct ucred *cred, struct vnode *vp, 291ddcdf265SRobert Watson struct label *label); 292ddcdf265SRobert Watson int (*mpo_check_vnode_getacl)(struct ucred *cred, 293ddcdf265SRobert Watson struct vnode *vp, struct label *label, acl_type_t type); 294ddcdf265SRobert Watson int (*mpo_check_vnode_getextattr)(struct ucred *cred, 295ddcdf265SRobert Watson struct vnode *vp, struct label *label, int attrnamespace, 296ddcdf265SRobert Watson const char *name, struct uio *uio); 297ddcdf265SRobert Watson int (*mpo_check_vnode_lookup)(struct ucred *cred, 298ddcdf265SRobert Watson struct vnode *dvp, struct label *dlabel, 299ddcdf265SRobert Watson struct componentname *cnp); 30001e990beSRobert Watson vm_prot_t (*mpo_check_vnode_mmap_perms)(struct ucred *cred, 30101e990beSRobert Watson struct vnode *vp, struct label *label, int newmapping); 302ddcdf265SRobert Watson int (*mpo_check_vnode_open)(struct ucred *cred, struct vnode *vp, 303ddcdf265SRobert Watson struct label *label, mode_t acc_mode); 304177142e4SRobert Watson int (*mpo_check_vnode_poll)(struct ucred *active_cred, 305177142e4SRobert Watson struct ucred *file_cred, struct vnode *vp, 3067f724f8bSRobert Watson struct label *label); 307177142e4SRobert Watson int (*mpo_check_vnode_read)(struct ucred *active_cred, 308177142e4SRobert Watson struct ucred *file_cred, struct vnode *vp, 3097f724f8bSRobert Watson struct label *label); 310ddcdf265SRobert Watson int (*mpo_check_vnode_readdir)(struct ucred *cred, 311ddcdf265SRobert Watson struct vnode *dvp, struct label *dlabel); 312ddcdf265SRobert Watson int (*mpo_check_vnode_readlink)(struct ucred *cred, 313ddcdf265SRobert Watson struct vnode *vp, struct label *label); 314ddcdf265SRobert Watson int (*mpo_check_vnode_relabel)(struct ucred *cred, 315ddcdf265SRobert Watson struct vnode *vp, struct label *vnodelabel, 316ddcdf265SRobert Watson struct label *newlabel); 317ddcdf265SRobert Watson int (*mpo_check_vnode_rename_from)(struct ucred *cred, 318ddcdf265SRobert Watson struct vnode *dvp, struct label *dlabel, struct vnode *vp, 319ddcdf265SRobert Watson struct label *label, struct componentname *cnp); 320ddcdf265SRobert Watson int (*mpo_check_vnode_rename_to)(struct ucred *cred, 321ddcdf265SRobert Watson struct vnode *dvp, struct label *dlabel, struct vnode *vp, 322ddcdf265SRobert Watson struct label *label, int samedir, 323ddcdf265SRobert Watson struct componentname *cnp); 324ddcdf265SRobert Watson int (*mpo_check_vnode_revoke)(struct ucred *cred, 325ddcdf265SRobert Watson struct vnode *vp, struct label *label); 326ddcdf265SRobert Watson int (*mpo_check_vnode_setacl)(struct ucred *cred, 327ddcdf265SRobert Watson struct vnode *vp, struct label *label, acl_type_t type, 328ddcdf265SRobert Watson struct acl *acl); 329ddcdf265SRobert Watson int (*mpo_check_vnode_setextattr)(struct ucred *cred, 330ddcdf265SRobert Watson struct vnode *vp, struct label *label, int attrnamespace, 331ddcdf265SRobert Watson const char *name, struct uio *uio); 332ddcdf265SRobert Watson int (*mpo_check_vnode_setflags)(struct ucred *cred, 333ddcdf265SRobert Watson struct vnode *vp, struct label *label, u_long flags); 334ddcdf265SRobert Watson int (*mpo_check_vnode_setmode)(struct ucred *cred, 335ddcdf265SRobert Watson struct vnode *vp, struct label *label, mode_t mode); 336ddcdf265SRobert Watson int (*mpo_check_vnode_setowner)(struct ucred *cred, 337ddcdf265SRobert Watson struct vnode *vp, struct label *label, uid_t uid, 338ddcdf265SRobert Watson gid_t gid); 339ddcdf265SRobert Watson int (*mpo_check_vnode_setutimes)(struct ucred *cred, 340ddcdf265SRobert Watson struct vnode *vp, struct label *label, 341ddcdf265SRobert Watson struct timespec atime, struct timespec mtime); 342177142e4SRobert Watson int (*mpo_check_vnode_stat)(struct ucred *active_cred, 343177142e4SRobert Watson struct ucred *file_cred, struct vnode *vp, 344ddcdf265SRobert Watson struct label *label); 345177142e4SRobert Watson int (*mpo_check_vnode_write)(struct ucred *active_cred, 346177142e4SRobert Watson struct ucred *file_cred, struct vnode *vp, 3477f724f8bSRobert Watson struct label *label); 348ddcdf265SRobert Watson }; 349ddcdf265SRobert Watson 3504b826b4cSRobert Watson typedef const void *macop_t; 351ddcdf265SRobert Watson 352ddcdf265SRobert Watson enum mac_op_constant { 353ddcdf265SRobert Watson MAC_OP_LAST, 354ddcdf265SRobert Watson MAC_DESTROY, 355ddcdf265SRobert Watson MAC_INIT, 35627f2eac7SRobert Watson MAC_SYSCALL, 357ddcdf265SRobert Watson MAC_INIT_BPFDESC, 358ddcdf265SRobert Watson MAC_INIT_CRED, 359ddcdf265SRobert Watson MAC_INIT_DEVFSDIRENT, 360ddcdf265SRobert Watson MAC_INIT_IFNET, 361ddcdf265SRobert Watson MAC_INIT_IPQ, 362ddcdf265SRobert Watson MAC_INIT_MBUF, 363ddcdf265SRobert Watson MAC_INIT_MOUNT, 364ddcdf265SRobert Watson MAC_INIT_PIPE, 365ddcdf265SRobert Watson MAC_INIT_SOCKET, 366ddcdf265SRobert Watson MAC_INIT_TEMP, 367ddcdf265SRobert Watson MAC_INIT_VNODE, 368ddcdf265SRobert Watson MAC_DESTROY_BPFDESC, 369ddcdf265SRobert Watson MAC_DESTROY_CRED, 370ddcdf265SRobert Watson MAC_DESTROY_DEVFSDIRENT, 371ddcdf265SRobert Watson MAC_DESTROY_IFNET, 372ddcdf265SRobert Watson MAC_DESTROY_IPQ, 373ddcdf265SRobert Watson MAC_DESTROY_MBUF, 374ddcdf265SRobert Watson MAC_DESTROY_MOUNT, 375ddcdf265SRobert Watson MAC_DESTROY_PIPE, 376ddcdf265SRobert Watson MAC_DESTROY_SOCKET, 377ddcdf265SRobert Watson MAC_DESTROY_TEMP, 378ddcdf265SRobert Watson MAC_DESTROY_VNODE, 379ddcdf265SRobert Watson MAC_EXTERNALIZE, 380ddcdf265SRobert Watson MAC_INTERNALIZE, 381ddcdf265SRobert Watson MAC_CREATE_DEVFS_DEVICE, 382ddcdf265SRobert Watson MAC_CREATE_DEVFS_DIRECTORY, 383ddcdf265SRobert Watson MAC_CREATE_DEVFS_VNODE, 384ddcdf265SRobert Watson MAC_CREATE_VNODE, 385ddcdf265SRobert Watson MAC_CREATE_MOUNT, 386ddcdf265SRobert Watson MAC_CREATE_ROOT_MOUNT, 387ddcdf265SRobert Watson MAC_RELABEL_VNODE, 388ddcdf265SRobert Watson MAC_STDCREATEVNODE_EA, 389ddcdf265SRobert Watson MAC_UPDATE_DEVFSDIRENT, 390ddcdf265SRobert Watson MAC_UPDATE_PROCFSVNODE, 391ddcdf265SRobert Watson MAC_UPDATE_VNODE_FROM_EXTATTR, 392ddcdf265SRobert Watson MAC_UPDATE_VNODE_FROM_EXTERNALIZED, 393ddcdf265SRobert Watson MAC_UPDATE_VNODE_FROM_MOUNT, 394ddcdf265SRobert Watson MAC_CREATE_MBUF_FROM_SOCKET, 395ddcdf265SRobert Watson MAC_CREATE_PIPE, 396ddcdf265SRobert Watson MAC_CREATE_SOCKET, 397ddcdf265SRobert Watson MAC_CREATE_SOCKET_FROM_SOCKET, 398ddcdf265SRobert Watson MAC_RELABEL_PIPE, 399ddcdf265SRobert Watson MAC_RELABEL_SOCKET, 400ddcdf265SRobert Watson MAC_SET_SOCKET_PEER_FROM_MBUF, 401ddcdf265SRobert Watson MAC_SET_SOCKET_PEER_FROM_SOCKET, 402ddcdf265SRobert Watson MAC_CREATE_BPFDESC, 403ddcdf265SRobert Watson MAC_CREATE_DATAGRAM_FROM_IPQ, 404ddcdf265SRobert Watson MAC_CREATE_IFNET, 405ddcdf265SRobert Watson MAC_CREATE_IPQ, 406ddcdf265SRobert Watson MAC_CREATE_FRAGMENT, 407ddcdf265SRobert Watson MAC_CREATE_MBUF_FROM_MBUF, 408ddcdf265SRobert Watson MAC_CREATE_MBUF_LINKLAYER, 409ddcdf265SRobert Watson MAC_CREATE_MBUF_FROM_BPFDESC, 410ddcdf265SRobert Watson MAC_CREATE_MBUF_FROM_IFNET, 411ddcdf265SRobert Watson MAC_CREATE_MBUF_MULTICAST_ENCAP, 412ddcdf265SRobert Watson MAC_CREATE_MBUF_NETLAYER, 413ddcdf265SRobert Watson MAC_FRAGMENT_MATCH, 414ddcdf265SRobert Watson MAC_RELABEL_IFNET, 415ddcdf265SRobert Watson MAC_UPDATE_IPQ, 416ddcdf265SRobert Watson MAC_CREATE_CRED, 417ddcdf265SRobert Watson MAC_EXECVE_TRANSITION, 418ddcdf265SRobert Watson MAC_EXECVE_WILL_TRANSITION, 419ddcdf265SRobert Watson MAC_CREATE_PROC0, 420ddcdf265SRobert Watson MAC_CREATE_PROC1, 421ddcdf265SRobert Watson MAC_RELABEL_CRED, 422ddcdf265SRobert Watson MAC_CHECK_BPFDESC_RECEIVE, 423ddcdf265SRobert Watson MAC_CHECK_CRED_RELABEL, 424ddcdf265SRobert Watson MAC_CHECK_CRED_VISIBLE, 425ddcdf265SRobert Watson MAC_CHECK_IFNET_RELABEL, 426ddcdf265SRobert Watson MAC_CHECK_IFNET_TRANSMIT, 427ddcdf265SRobert Watson MAC_CHECK_MOUNT_STAT, 428ddcdf265SRobert Watson MAC_CHECK_PIPE_IOCTL, 429c024c3eeSRobert Watson MAC_CHECK_PIPE_POLL, 430c024c3eeSRobert Watson MAC_CHECK_PIPE_READ, 431ddcdf265SRobert Watson MAC_CHECK_PIPE_RELABEL, 432c024c3eeSRobert Watson MAC_CHECK_PIPE_STAT, 433c024c3eeSRobert Watson MAC_CHECK_PIPE_WRITE, 434ddcdf265SRobert Watson MAC_CHECK_PROC_DEBUG, 435ddcdf265SRobert Watson MAC_CHECK_PROC_SCHED, 436ddcdf265SRobert Watson MAC_CHECK_PROC_SIGNAL, 437ddcdf265SRobert Watson MAC_CHECK_SOCKET_BIND, 438ddcdf265SRobert Watson MAC_CHECK_SOCKET_CONNECT, 439fb95b5d3SRobert Watson MAC_CHECK_SOCKET_DELIVER, 440ddcdf265SRobert Watson MAC_CHECK_SOCKET_LISTEN, 441ddcdf265SRobert Watson MAC_CHECK_SOCKET_RELABEL, 442ddcdf265SRobert Watson MAC_CHECK_SOCKET_VISIBLE, 443ddcdf265SRobert Watson MAC_CHECK_VNODE_ACCESS, 444ddcdf265SRobert Watson MAC_CHECK_VNODE_CHDIR, 445ddcdf265SRobert Watson MAC_CHECK_VNODE_CHROOT, 446ddcdf265SRobert Watson MAC_CHECK_VNODE_CREATE, 447ddcdf265SRobert Watson MAC_CHECK_VNODE_DELETE, 448ddcdf265SRobert Watson MAC_CHECK_VNODE_DELETEACL, 449ddcdf265SRobert Watson MAC_CHECK_VNODE_EXEC, 450ddcdf265SRobert Watson MAC_CHECK_VNODE_GETACL, 451ddcdf265SRobert Watson MAC_CHECK_VNODE_GETEXTATTR, 452ddcdf265SRobert Watson MAC_CHECK_VNODE_LOOKUP, 45301e990beSRobert Watson MAC_CHECK_VNODE_MMAP_PERMS, 454ddcdf265SRobert Watson MAC_CHECK_VNODE_OPEN, 4557f724f8bSRobert Watson MAC_CHECK_VNODE_POLL, 4567f724f8bSRobert Watson MAC_CHECK_VNODE_READ, 457ddcdf265SRobert Watson MAC_CHECK_VNODE_READDIR, 458ddcdf265SRobert Watson MAC_CHECK_VNODE_READLINK, 459ddcdf265SRobert Watson MAC_CHECK_VNODE_RELABEL, 460ddcdf265SRobert Watson MAC_CHECK_VNODE_RENAME_FROM, 461ddcdf265SRobert Watson MAC_CHECK_VNODE_RENAME_TO, 462ddcdf265SRobert Watson MAC_CHECK_VNODE_REVOKE, 463ddcdf265SRobert Watson MAC_CHECK_VNODE_SETACL, 464ddcdf265SRobert Watson MAC_CHECK_VNODE_SETEXTATTR, 465ddcdf265SRobert Watson MAC_CHECK_VNODE_SETFLAGS, 466ddcdf265SRobert Watson MAC_CHECK_VNODE_SETMODE, 467ddcdf265SRobert Watson MAC_CHECK_VNODE_SETOWNER, 468ddcdf265SRobert Watson MAC_CHECK_VNODE_SETUTIMES, 469ddcdf265SRobert Watson MAC_CHECK_VNODE_STAT, 4707f724f8bSRobert Watson MAC_CHECK_VNODE_WRITE, 471ddcdf265SRobert Watson }; 472ddcdf265SRobert Watson 473ddcdf265SRobert Watson struct mac_policy_op_entry { 474ddcdf265SRobert Watson enum mac_op_constant mpe_constant; /* what this hook implements */ 4754b826b4cSRobert Watson macop_t mpe_function; /* hook's implementation */ 476ddcdf265SRobert Watson }; 477ddcdf265SRobert Watson 478ddcdf265SRobert Watson struct mac_policy_conf { 479ddcdf265SRobert Watson char *mpc_name; /* policy name */ 480ddcdf265SRobert Watson char *mpc_fullname; /* policy full name */ 481ddcdf265SRobert Watson struct mac_policy_ops *mpc_ops; /* policy operations */ 482ddcdf265SRobert Watson struct mac_policy_op_entry *mpc_entries; /* ops to fill in */ 483ddcdf265SRobert Watson int mpc_loadtime_flags; /* flags */ 484ddcdf265SRobert Watson int *mpc_field_off; /* security field */ 485ddcdf265SRobert Watson int mpc_runtime_flags; /* flags */ 486ddcdf265SRobert Watson LIST_ENTRY(mac_policy_conf) mpc_list; /* global list */ 487ddcdf265SRobert Watson }; 488ddcdf265SRobert Watson 489ddcdf265SRobert Watson /* Flags for the mpc_loadtime_flags field. */ 490ddcdf265SRobert Watson #define MPC_LOADTIME_FLAG_NOTLATE 0x00000001 491ddcdf265SRobert Watson #define MPC_LOADTIME_FLAG_UNLOADOK 0x00000002 492ddcdf265SRobert Watson 493ddcdf265SRobert Watson /* Flags for the mpc_runtime_flags field. */ 494ddcdf265SRobert Watson #define MPC_RUNTIME_FLAG_REGISTERED 0x00000001 495ddcdf265SRobert Watson 496ddcdf265SRobert Watson #define MAC_POLICY_SET(mpents, mpname, mpfullname, mpflags, privdata_wanted) \ 497ddcdf265SRobert Watson static struct mac_policy_conf mpname##_mac_policy_conf = { \ 498ddcdf265SRobert Watson #mpname, \ 499ddcdf265SRobert Watson mpfullname, \ 500ddcdf265SRobert Watson NULL, \ 501ddcdf265SRobert Watson mpents, \ 502ddcdf265SRobert Watson mpflags, \ 503ddcdf265SRobert Watson privdata_wanted, \ 504ddcdf265SRobert Watson 0, \ 505ddcdf265SRobert Watson }; \ 506ddcdf265SRobert Watson static moduledata_t mpname##_mod = { \ 507ddcdf265SRobert Watson #mpname, \ 508ddcdf265SRobert Watson mac_policy_modevent, \ 509ddcdf265SRobert Watson &mpname##_mac_policy_conf \ 510ddcdf265SRobert Watson }; \ 5117ba28492SRobert Watson MODULE_DEPEND(mpname, kernel_mac_support, 1, 1, 1); \ 512ddcdf265SRobert Watson DECLARE_MODULE(mpname, mpname##_mod, SI_SUB_MAC_POLICY, \ 513ddcdf265SRobert Watson SI_ORDER_MIDDLE) 514ddcdf265SRobert Watson 515ddcdf265SRobert Watson int mac_policy_modevent(module_t mod, int type, void *data); 516ddcdf265SRobert Watson 517ddcdf265SRobert Watson #define LABEL_TO_SLOT(l, s) (l)->l_perpolicy[s] 518ddcdf265SRobert Watson 519ddcdf265SRobert Watson #endif /* !_SYS_MAC_POLICY_H */ 520