Namespaced file capabilities
As of this past week, namespaced file capabilities are available in the upstream kernel. (Thanks to Eric Biederman for many review cycles and for the final pull request)
Some packages install binaries with file capabilities, and fail to install if you cannot set the file capabilities. Such packages could not be installed from inside a user namespace. With this feature, that problem is fixed.
What are they?
POSIX capabilities are pieces of root’s privilege which can be individually used.
File capabilites are POSIX capability sets attached to files. When files with associated capabilities are executed, the resulting task may end up with privilege even if the calling user was unprivileged.
What’s the problem
In single-user-namespace days, POSIX capabilities were completely orthogonal to userids. You can be a non-root user with CAP_SYS_ADMIN, for instance. This can happen by starting as root, setting PR_SET_KEEPCAPS through prctl(2), and dropping the capabilities you don’t want and changing your uid. Or, it can happen by a non-root user executing a file with file capabilities. In order to append such a capability to a file, you require the CAP_SETFCAP capability.
User namespaces had several requirements, including:
- an unprivileged user should be able to create a user namespace
- root in a user namespace should be privileged against its resources
- root in a user namespace should be unprivileged against any resources which it does not own.
So in a post-user-namespace age, unprivileged user can “have privilege” with respect to files they own. However if we allow them to write a file capability on one of their files, then they can execute that file as an unprivileged user on the host, thereby gaining that privilege. This violates the third user namespace requirement, and is therefore not allowed.
Unfortunately – and fortunately – some software wants to be installed with file capabilities. On the one hand that is great, but on the other hand, if the package installer isn’t able to handle the failure to set file capabilities, then package installs are broken. This was the case for some common packages – for instance httpd on centos.
With namespaced file capabilities, file capabilities continue to be orthogonal with respect to userids mapped into the namespace. However they capabilities are tagged as belonging to the host uid mapped to the container’s root id (0). (If uid 0 is not mapped, then file capabilities cannot be assigned) This prevents the namespace owner from gaining privilege in a namespace against which they should not be privileged.
The opinions expressed in this blog are my own views and not those of Cisco.