| .TH CAP_IAB 3 "2021-03-10" "" "Linux Programmer's Manual" |
| .SH NAME |
| .nf |
| #include <sys/capability.h> |
| |
| cap_iab_t cap_iab_init(void); |
| |
| cap_iab_t cap_iab_get_proc(void); |
| |
| int cap_iab_set_proc(cap_iab_t iab); |
| |
| char *cap_iab_to_text(cap_iab_t iab); |
| |
| cap_iab_t cap_iab_from_text(const char *text); |
| |
| cap_flag_value_t cap_iab_get_vector(cap_iab_t iab, cap_iab_vector_t vec, |
| cap_value_t val); |
| |
| int cap_iab_set_vector(cap_iab_t iab, cap_iab_vector_t vec, cap_value_t val, |
| cap_flag_value_t enable); |
| |
| int cap_iab_fill(cap_iab_t iab, cap_iab_vector_t vec, |
| cap_t set, cap_flag_t flag); |
| |
| .fi |
| .sp |
| Link with \fI\-lcap\fP. |
| .SH "DESCRIPTION" |
| The functions defined in this man page concern the three naively |
| inheritable process capability vectors: Inh, Amb and Bound. This |
| \fIIAB\fP 3-tuple of capability vectors, captured in type |
| \fIcap_iab_t\fP combine to pass capabilities from one process to |
| another through |
| .BR execve (2) |
| system calls. The convolution rules using the IAB set are a fail over |
| set of rules when the executed file has no configured |
| \fIfile-capabilities\fP. |
| .PP |
| There are some constraints enforced by the kernel with respect to the |
| three components of an IAB set and the Permitted process capability |
| flag. They are: the Inh vector is entirely equal to the process |
| Inheritable flag at all times; the the Amb vector contains no more |
| capability values than the intersection of the Inh vector and the |
| Permitted flag for the process; no Amb value blocked in the Bound |
| Vector will survive |
| .BR execve (2); |
| and the Bound (or \fIblocked\fP) vector is the twos-complement of the |
| process bounding set. |
| .PP |
| In some environments, it is considered desirable to naively inherit |
| capabilities. That is pass capabilities, independent of the status of |
| the executed binary, from parent to child through exec* system |
| calls. The surviving capabilities become the Permitted flag for the |
| post-exec process. This method of inheritance differs significantly |
| from the handshake inheritance between pre-exec* process and |
| file-capability bestowed executable of the traditional capability |
| mechanism. |
| .PP |
| The convolution rules for IAB style inheritance are: I'=I; A'= A & ~B; |
| P'=A & ~B. Where P etc are the pre-exec values and P' etc are the |
| post-exec values. |
| .PP |
| With an understanding of these convolution rules, we can explain how |
| .BR libcap (3) |
| support for the IAB set is managed: the IAB API. |
| .PP |
| .BR cap_iab_init () |
| returns an empty IAB value. That is a \fImostly-harmless\fP tuple. It |
| will not block and capabilities through exec, but it won't bestow any |
| either. The returned cap_iab_t should be freed with |
| .BR cap_free (3). |
| .sp |
| .BR cap_iab_get_proc () |
| returns a copy of the IAB value for the current process. The returned |
| cap_iab_t should be freed with |
| .BR cap_free (3). |
| .sp |
| .BR cap_iab_set_proc () |
| can be used to set the IAB value carried by the current process. Such |
| a setting will fail if the process is insufficiently capable. The |
| process requires CAP_SETPCAP and a superset of P values over the A and |
| I vectors. |
| .sp |
| .BR cap_iab_to_text () |
| will convert an IAB set to a canonical text representation. The |
| representation is slightly redundant but libcap will try to generate |
| as short a representation as it is able. |
| .sp |
| .BR cap_iab_from_text () |
| generates an IAB set from a text string (likely generated by the |
| previous function). The returned IAB set should be freed with |
| .BR cap_free (3). |
| .sp |
| The text format accepted by |
| .BR cap_iab_from_text () |
| is a comma separated list of capability values. Each capability is |
| prefixed by nothing (or %) (Inh); ! (Bound); ^ (Amb). Or, some |
| combination thereof. Since the Amb vector is constrained to be no |
| greater than the Inh set, ^ is equivalent to %^. Further, unless B is |
| non-zero, % can be omitted. The following are legal text |
| representations: "!%cap_chown" (Bound but Inh), |
| "!cap_setuid,^cap_chown" (Bound, Inh+Amb). "cap_setuid,!cap_chown" |
| (Inh, Bound). As noted above, this text representation is the syntax |
| for the \fIpam_cap.so\fP config file. |
| .sp |
| .BR cap_iab_get_vector () |
| can be used to determine the specific capability value of an IAB |
| vector. |
| .sp |
| .BR cap_iab_set_vector () |
| can be used to set a specific vector value to the enable setting. |
| .BR cap_iab_fill () |
| can be used to wholesale copy a cap_t flag value into the vec vector |
| of the IAB set. Copying into Amb in this way may implicitly raise Inh |
| values in the IAB set. Similarly copying into the Inh vector may |
| implicitly lower Amb values that are not present in the resulting Inh |
| vector. |
| .SH "ERRORS" |
| The functions returning \fIcap_iab_t\fP values or allocated memory in |
| the form of a string return NULL on error. |
| |
| Integer return values are -1 on error and 0 on success. |
| |
| In the case of error consult \fIerrno\fP. |
| .SH "NOTES" |
| .PP |
| Unlike the traditional \fIcap_t\fP capability set, the |
| IAB set, taken together, is incompatible with filesystem capabilities |
| created via tools like |
| .BR setcap (8). |
| That is, the Amb vector of the IAB set is rendered moot when an |
| executable with a file capability is executed. |
| .PP |
| Further, there are libcap |
| .BR cap_mode (3)s |
| that render the Amb vector and its method of process inheritance |
| disabled. |
| |
| .SH "HISTORY" |
| The IAB format for inheritable variants of capabilities was first |
| developed as the configuration syntax for the \fIpam_cap.so\fP |
| Linux-PAM module in libcap-2.29. It was introduced to extend the |
| \fIsimple\fP comma separated list of process Inheritable capabilities, |
| that the module could besow on an authenticated process tree, to |
| include enforced limits on the Bounding set and introduce support for |
| the Amibient set of capability bits. |
| |
| While the Inheritable and Bounding sets were anticipated by the |
| POSIX.1e draft that introduced capabilities, the Ambient set is a |
| Linux invention, and incompatible with the POSIX.1e file capability |
| model. As such, it was felt that trying to meld together all of the 5 |
| capability vectors into one text representation was not going to |
| work. Instead the \fIpam_cap.so\fP config syntax was generalized into |
| a whole set of libcap functions for bundling together all three |
| naively inheritable capabilities: the IAB set. The support for this |
| debuted in libcap-2.33. |
| |
| .SH "SEE ALSO" |
| .BR libcap (3), |
| .BR cap_launch (3), |
| .BR cap_init (3), |
| .BR capabilities (7) |
| and |
| .BR errno (3). |