Provided by: freebsd-manpages_12.2-1_all 

NAME
mac — TrustedBSD Mandatory Access Control framework
SYNOPSIS
#include <sys/types.h>
#include <sys/mac.h>
In the kernel configuration file:
options MAC
options MAC_DEBUG
DESCRIPTION
Introduction
The TrustedBSD mandatory access control framework permits dynamically introduced system security modules
to modify system security functionality. This can be used to support a variety of new security services,
including traditional labeled mandatory access control models. The framework provides a series of entry
points which must be called by code supporting various kernel services, especially with respects to
access control points and object creation. The framework then calls out to security modules to offer
them the opportunity to modify security behavior at those MAC API entry points. Both consumers of the
API (normal kernel services) and security modules must be aware of the semantics of the API calls,
particularly with respect to synchronization primitives (such as locking).
Kernel Objects Supported by the Framework
The MAC framework manages labels on a variety of types of in-kernel objects, including process
credentials, vnodes, devfs_dirents, mount points, sockets, mbufs, bpf descriptors, network interfaces, IP
fragment queues, and pipes. Label data on kernel objects, represented by struct label, is policy-
unaware, and may be used in the manner seen fit by policy modules.
API for Consumers
The MAC API provides a large set of entry points, too broad to specifically document here. In general,
these entry points represent an access control check or other MAC-relevant operations, accept one or more
subjects (credentials) authorizing the activity, a set of objects on which the operation is to be
performed, and a set of operation arguments providing information about the type of operation being
requested.
Locking for Consumers
Consumers of the MAC API must be aware of the locking requirements for each API entry point: generally,
appropriate locks must be held over each subject or object being passed into the call, so that MAC
modules may make use of various aspects of the object for access control purposes. For example, vnode
locks are frequently required in order that the MAC framework and modules may retrieve security labels
and attributes from the vnodes for the purposes of access control. Similarly, the caller must be aware
of the reference counting semantics of any subject or object passed into the MAC API: all calls require
that a valid reference to the object be held for the duration of the (potentially lengthy) MAC API call.
Under some circumstances, objects must be held in either a shared or exclusive manner.
API for Module Writers
Each module exports a structure describing the MAC API operations that the module chooses to implement,
including initialization and destruction API entry points, a variety of object creation and destruction
calls, and a large set of access control check points. In the future, additional audit entry points will
also be present. Module authors may choose to only implement a subset of the entry points, setting API
function pointers in the description structure to NULL, permitting the framework to avoid calling into
the module.
Locking for Module Writers
Module writers must be aware of the locking semantics of entry points that they implement: MAC API entry
points will have specific locking or reference counting semantics for each argument, and modules must
follow the locking and reference counting protocol or risk a variety of failure modes (including race
conditions, inappropriate pointer dereferences, etc).
MAC module writers must also be aware that MAC API entry points will frequently be invoked from deep in a
kernel stack, and as such must be careful to avoid violating more global locking requirements, such as
global lock order requirements. For example, it may be inappropriate to lock additional objects not
specifically maintained and ordered by the policy module, or the policy module might violate a global
ordering requirement relating to those additional objects.
Finally, MAC API module implementors must be careful to avoid inappropriately calling back into the MAC
framework: the framework makes use of locking to prevent inconsistencies during policy module attachment
and detachment. MAC API modules should avoid producing scenarios in which deadlocks or inconsistencies
might occur.
Adding New MAC Entry Points
The MAC API is intended to be easily expandable as new services are added to the kernel. In order that
policies may be guaranteed the opportunity to ubiquitously protect system subjects and objects, it is
important that kernel developers maintain awareness of when security checks or relevant subject or object
operations occur in newly written or modified kernel code. New entry points must be carefully documented
so as to prevent any confusion regarding lock orders and semantics. Introducing new entry points
requires four distinct pieces of work: introducing new MAC API entries reflecting the operation
arguments, scattering these MAC API entry points throughout the new or modified kernel service, extending
the front-end implementation of the MAC API framework, and modifying appropriate modules to take
advantage of the new entry points so that they may consistently enforce their policies.
ENTRY POINTS
System service and module authors should reference the FreeBSD Architecture Handbook for information on
the MAC Framework APIs.
SEE ALSO
acl(3), mac(3), posix1e(3), mac_biba(4), mac_bsdextended(4), mac_ifoff(4), mac_lomac(4), mac_mls(4),
mac_none(4), mac_partition(4), mac_seeotheruids(4), mac_test(4), ucred(9), vaccess(9),
vaccess_acl_posix1e(9), VFS(9)
The FreeBSD Architecture Handbook, https://www.FreeBSD.org/doc/en_US.ISO8859-1/books/arch-handbook/.
HISTORY
The TrustedBSD MAC Framework first appeared in FreeBSD 5.0.
AUTHORS
This manual page was written by Robert Watson. This software was contributed to the FreeBSD Project by
Network Associates Laboratories, the Security Research Division of Network Associates Inc. under
DARPA/SPAWAR contract N66001-01-C-8035 (“CBOSS”), as part of the DARPA CHATS research program.
The TrustedBSD MAC Framework was designed by Robert Watson, and implemented by the Network Associates
Laboratories Network Security (NETSEC), Secure Execution Environment (SEE), and Adaptive Network Defense
research groups. Network Associates Laboratory staff contributing to the CBOSS Project include (in
alphabetical order): Lee Badger, Brian Feldman, Hrishikesh Dandekar, Tim Fraser, Doug Kilpatrick, Suresh
Krishnaswamy, Adam Migus, Wayne Morrison, Andrew Reisse, Chris Vance, and Robert Watson.
Sub-contracted staff include: Chris Costello, Poul-Henning Kamp, Jonathan Lemon, Kirk McKusick,
Dag-Erling Smørgrav.
Additional contributors include: Pawel Dawidek, Chris Faulhaber, Ilmar Habibulin, Mike Halderman, Bosko
Milekic, Thomas Moestl, Andrew Reiter, and Tim Robbins.
BUGS
While the MAC Framework design is intended to support the containment of the root user, not all attack
channels are currently protected by entry point checks. As such, MAC Framework policies should not be
relied on, in isolation, to protect against a malicious privileged user.
Debian July 25, 2015 MAC(9)