DCMD_PROC_ABILITIES

Updated: April 19, 2023

Return all the abilities and ability ranges of a specified process

#include <sys/procfs.h>

#define DCMD_PROC_ABILITIES  __DIOF(_DCMD_PROC, __PROC_SUBCMD_PROCFS + 35, procfs_abilities)

The arguments to devctl() are:

Argument Value
filedes A file descriptor for the process.
dcmd DCMD_PROC_ABILITIES
dev_data_ptr A pointer to a procfs_abilities structure
n_bytes PROCFS_ABLE_TOTAL_SIZE(n, r)
dev_info_ptr NULL

The argument to this command is a procfs_abilities structure that returns all of the abilities and ability ranges of the specified process. For example:

procfs_abilities my_abilities;

devctl(fd, DCMD_PROC_ABILITIES, &my_abilities, PROCFS_ABLE_TOTAL_SIZE(n, r), NULL)

The minimum size of the buffer depends on the number of abilities (n) and the number of ability ranges (r). As these values are likely not known, a conservative estimate is 150 abilities and 50 ability ranges. If the size is too small, the function will fail with an errno of ENOSPC and the n_bytesfield of the structure will have been updated with the required size.

See Abilities in the System Security Guide for the table detailing the abilities and their names.

The return data consists of the following items: a fixed header, an array containing ability information, and an array containing ability range information.

The fixed header is of type procfs_abilities with the following members:
nbytes
The total size of the return data. If the function fails with an error of ENOSPC, this contains the total required size.
snables
The number of static abilities in the ability information array. The ability IDs from 0 to (snables - 1) are static abilities. The DEFINE_ABILITIES macro defined in sys/procmgr.h may be used to define a mapping between the static ability IDs and the associated ability names.
dnables
The number of custom (dynamic) abilities in the ability information array. The function procmgr_ability_name() may be used to translate the ability IDs from snables to (snables + dnables - 1) to the associated ability names.
nranges
The number of ranges in the ability range information array.
eol_flags
A set of flags that defines the configurations of the process for any ability that might be defined in the future.
The ability information array provides the configurations of each ability of the process. The number of array elements is the sum of snables + dnables. Each element is of type uint16_t and is indexed by ability ID. The eol_flags member of the procfs_abilities header above and each element of the ability array is comprised of the following flags:
PROCFS_ABLE_ALLOW_ROOT
PROCFS_ABLE_ALLOW_NONROOT
The ability is granted to root or non-root.
PROCFS_ABLE_DEFAULT_ROOT
PROCFS_ABLE_DEFAULT_NONROOT
Applicable only for custom abilities that haven't yet been created (i.e., procmgr_ability_create() hasn't been called).
The process will be granted the ability for root or non-root based on the default privileges granted when procmgr_ability_create() is called for the ability.
PROCFS_ABLE_LOCK
The ability is locked.
PROCFS_ABLE_INHERIT
The ability is inherited after a call from exec*(), posix_spawn*(), or spawn*().
PROCFS_ABLE_SUBRANGE
The array of ranges includes one or more ranges for this ability.
PROCFS_ABLE_UNCREATED
The ability hasn't yet been created (i.e., procmgr_ability_create() hasn't been called).
The ability range information array provides the list of ability ranges of the process. The number of array elements is equal to nranges. Each element is of type procfs_ability_range with the following members:
lo
The lower bound of the range.
hi
The upper bound of the range.
id
The ability ID this range pertains to.
able
A set of two possible flags, PROCFS_ABLE_ALLOW_ROOT and PROCFS_ABLE_ALLOW_NONROOT, which indicates that the range has been granted to root or non-root, respectively.