Granting a capability to a service

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Let's assume I want to start a service as an ordinary user, but allow to
bind it to a privileged port.  The program implementing the service does
not manipulate capabilities in any way.

I came up with with this system unit for testing purposes:

[Unit]
Description=Test unit

[Service]
Type=oneshot
ExecStart=/usr/sbin/getpcaps self
Capabilities=cap_net_bind_service+ep
SecureBits=keep-caps
User=fweimer
StandardOutput=journal

However, this does not work, the capability set remains empty.  Is there
a way to achieve what I want?

The algorithm documented in capabilities(7) suggests that retaining
effective capabilities across an execve system call absolutely requires
file capabilities (the inheritable part).  The only way to bypass that
if you perform the execve call with UID 0 (i.e., the literal UID 0, not
a capability).

This design is really odd because setting file capabilities always
increases the attack surface (even if it is just the inheritable bits),
and the only alternative appears to modify the service so that it is
capability-aware and switches away from UID 0, and grant sufficient
capabilities so that it can do so.  At that point, you can just skip the
configuration in the systemd service and do everything capablity-related
within the program.

What am I missing?

-- 
Florian Weimer / Red Hat Product Security
-- 
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxxx
https://admin.fedoraproject.org/mailman/listinfo/devel
Fedora Code of Conduct: http://fedoraproject.org/code-of-conduct




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Fedora Announce]     [Fedora Kernel]     [Fedora Testing]     [Fedora Formulas]     [Fedora PHP Devel]     [Kernel Development]     [Fedora Legacy]     [Fedora Maintainers]     [Fedora Desktop]     [PAM]     [Red Hat Development]     [Gimp]     [Yosemite News]
  Powered by Linux