Coordinated patches to kernel and glibc so that (optionally) strerror(EPERM) gives useful information on why permission was denied
- Name: Dave Malcolm
- Email: <firstname.lastname@example.org>
- Targeted release: [[Releases/<number> | Fedora <number> ]]
- Last updated: (DATE)
- Percentage of completion: XX%
Traditionally, if a process attempts a forbidded operation, errno for that thread is set to EPERM, and a call to strerror() returns a localized version of "Operation not permitted". This string appears throughout textual UIs. For example, it will show up in command-line tools, in exceptions within scripting languages, etc.
There are an increasing number of ways in which you can fail to have permission to do something:
- classic POSIX discretionary access controls
- Linux security modules (e.g. SELinux mandatory access controls)
- etc (TODO: expand this list)
Under normal deployment situations we don't want to leak information to an attacker as to why permission was denied, but under development situations it's useful to know why a failure happens.
We propose to:
- patch the kernel so that it can optionally provide user-space with a "failure cookie" giving additional information beyond the bare ERRNO (handled at the per-thread level, like strerror, iirc)
- patch glibc's implementation of strerror (and related calls) so that it can use this "failure cookie" to provide a localized extension to the "Operation not permitted" giving additional details.
For example: TODO
The failure cookie would only be exposed to user space for processes with a particular bit set (using prctl), so that you have to opt-in to having this information exposed.
Benefit to Fedora
This feature should significantly simplify debugging permissions issues in Fedora. For example, rather than seeing "Operation not permitted" error and e.g. blindly trying to disable SELinux, a user can see directly whether or not SELinux was involved.
This would require getting a new user-space interface into the kernel, with corresponding changes to the insides of glibc. The precise mechanism has not been decided yet - presumably whatever is acceptable to the upstream kernel/glibc maintainers.