Difference between revisions of "Capabilities"

From ArchWiki
Jump to: navigation, search
(Other programs that benefit from capabilities: Adde mii-tool.)
m (See also: style)
 
(38 intermediate revisions by 17 users not shown)
Line 1: Line 1:
 
[[Category:Security]]
 
[[Category:Security]]
The intention of this article is to remove the setuid attribute in the binaries that require certain root-privileges.
+
[[ja:ケイパビリティ]]
In this way, it eliminates the need for "all or nothing", using a fine grained control with POSIX 1003.1e capabilities.
+
[[zh-hans:Capabilities]]
 +
Capabilities (POSIX 1003.1e, {{man|7|capabilities}}) provide fine-grained control over superuser permissions, allowing use of the root user to be avoided. Software developers are encouraged to replace uses of the powerful [[wikipedia:Setuid|setuid]] attribute in a system binary with a more minimal set of capabilities. Many packages make use of capabilities, such as {{ic|CAP_NET_RAW}} being used for the {{ic|ping}} binary provided by {{pkg|iputils}}. This enables e.g. {{ic|ping}} to be run by a normal user (as with the '''setuid''' method), while at the same time limiting the security consequences of a potential vulnerability in {{ic|ping}}.
  
'''Use with caution, some programs do not know about file capabilities. It apparently works correctly, but have some unexpected side effects (see for example [[#util-linux-ng]])'''
+
== Implementation ==
  
==Prerequisites==
+
Capabilities are implemented on Linux using [[extended attributes]] ({{man|7|xattr}}) in the ''security'' namespace. Extended attributes are supported by all major Linux [[file systems]], including Ext2, Ext3, Ext4, Btrfs, JFS, XFS, and Reiserfs. The following example prints the capabilities of ping with {{ic|getcap}}, and then prints the same data in its encoded form using {{ic|getfattr}}:
You need libcap, for setting file capabalities that are extended attributes, with the utility setcap.
 
# pacman -S libcap
 
  
==Setuid-root files by package==
+
{{hc|$ getcap /usr/bin/ping|2=
 +
/usr/bin/ping = cap_net_raw+ep
 +
}}
  
===coreutils===
+
{{hc|$ getfattr -d -m "^security\\." /usr/bin/ping|2=
 +
# file: usr/bin/ping
 +
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
 +
}}
  
{{Note|Warning: Do not use it, because su will return incorrect password.}}
+
Extended attributes are copied automatically by {{ic|cp -a}}, but some other programs require a special flag: {{ic|rsync -X}}.
  
# chmod u-s /bin/su
+
Capabilities are set by package install scripts on Arch (e.g. {{ic|iputils.install}}).
# setcap cap_setgid,cap_setuid+ep /bin/su
 
  
===dcron===
+
== Administration and maintenance ==
  
# chmod u-s /usr/bin/crontab
+
It is considered a bug if a package has overly permissive capabilities, so these cases should be reported rather than listed here. A capability essentially equivalent to root access ({{ic|CAP_SYS_ADMIN}}) or trivially allowing root access ({{ic|CAP_DAC_OVERRIDE}}) does not count as a bug since Arch does not support any [[Security#Mandatory access control|MAC/RBAC]] systems.
# setcap cap_dac_override,cap_setgid+ep /usr/bin/crontab
 
  
===inetutils===
+
{{Warning|Many capabilities enable trivial privilege escalation. For examples and explanations see Brad Spengler's post [http://forums.grsecurity.net/viewtopic.php?f=7&t=2522&sid=c6fbcf62fd5d3472562540a7e608ce4e#p10271 False Boundaries and Arbitrary Code Execution].}}
  
# chmod u-s /usr/bin/rsh
+
== Other programs that benefit from capabilities ==
# setcap cap_net_bind_service+ep /usr/bin/rsh
 
  
# chmod u-s /usr/bin/rcp
+
The following packages do not have files with the setuid attribute but require root privileges to work. By enabling some capabilities, regular users can use the program without privilege elevation.
# setcap cap_net_bind_service+ep /usr/bin/rcp
 
  
# chmod u-s /usr/bin/rlogin
+
=== beep ===
# setcap cap_net_bind_service+ep /usr/bin/rlogin
 
  
===iputils===
+
# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep
  
# chmod u-s /bin/ping
+
=== chvt ===
# setcap cap_net_raw+ep /bin/ping
 
  
# chmod u-s /bin/ping6
+
  # setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt
# setcap cap_net_raw+ep /bin/ping6
 
 
 
# chmod u-s /bin/traceroute
 
# setcap cap_net_raw+ep /bin/traceroute
 
 
 
# chmod u-s /bin/traceroute6
 
# setcap cap_net_raw+ep /bin/traceroute6
 
 
 
===pam===
 
 
 
# chmod u-s /sbin/unix_chkpwd
 
# setcap cap_dac_read_search+ep /sbin/unix_chkpwd
 
 
 
===pmount===
 
 
 
Does not work without setuid.
 
 
 
===pulseaudio===
 
 
 
# chmod u-s /usr/lib/pulse/proximity-helper
 
# setcap cap_net_raw+ep /usr/lib/pulse/proximity-helper
 
 
 
===screen===
 
 
 
Needs setuid for multiuser sessions, but if you don't need that feature, you can safely turn off setuid.
 
 
 
===shadow===
 
 
 
# chmod u-s /usr/bin/chage
 
  # setcap cap_dac_read_search+ep /usr/bin/chage
 
 
 
# chmod u-s /usr/bin/chfn
 
# setcap cap_chown,cap_setuid+ep /usr/bin/chfn
 
 
 
# chmod u-s /usr/bin/chsh
 
# setcap cap_chown,cap_setuid+ep /usr/bin/chsh
 
 
 
# chmod u-s /usr/bin/expiry
 
# setcap cap_dac_override,cap_setgid+ep /usr/bin/expiry
 
  
# chmod u-s /usr/bin/gpasswd
+
=== iftop ===
# setcap cap_chown,cap_dac_override,cap_setuid+ep /usr/bin/gpasswd
 
  
# chmod u-s /usr/bin/newgrp
+
  # setcap cap_net_raw+ep /usr/bin/iftop
  # setcap cap_dac_override,cap_setgid+ep /usr/bin/newgrp
 
  
# chmod u-s /usr/bin/passwd
+
=== mii-tool ===
# setcap cap_chown,cap_dac_override,cap_fowner+ep /usr/bin/passwd
 
  
===sudo===
+
  # setcap cap_net_admin+ep /usr/bin/mii-tool
 
 
Sudo does not work without setuid.
 
 
 
===util-linux-ng===
 
 
 
{{Note|Warning: Do not use it, because mount and umount can not do some checks, then users can mount/umount filesystems that do not have permission.}}
 
 
 
# chmod u-s /bin/mount
 
  # setcap cap_dac_override,cap_sys_admin+ep /bin/mount
 
 
 
# chmod u-s /bin/umount
 
# setcap cap_dac_override,cap_sys_admin+ep /bin/umount
 
 
 
===xorg-xserver===
 
 
 
# chmod u-s /usr/bin/Xorg
 
# setcap cap_chown,cap_dac_override,cap_sys_rawio,cap_sys_admin+ep /usr/bin/Xorg
 
 
 
==Other programs that benefit from capabilities==
 
 
 
The following packages do not have files with the setuid attribute but require root privileges to work. By enabling some capabilities, regular users can use the program without privilege elevation.
 
 
 
===beep===
 
 
 
# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep
 
 
 
===chvt===
 
 
 
# setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt
 
  
===iftop===
+
== Useful commands ==
  
# setcap cap_net_raw+ep /usr/sbin/iftop
+
Find setuid-root files:
  
===mii-tool===
+
$ find /usr/bin /usr/lib -perm /4000 -user root
  
# setcap cap_net_admin+ep /sbin/mii-tool
+
Find setgid-root files:
  
==Useful commands==
+
  $ find /usr/bin /usr/lib -perm /2000 -group root
Find setuid-root files
 
  $ find /bin /sbin /lib /usr/bin /usr/sbin /usr/lib -perm /4000 -user root
 
  
Find setgid-root files
+
== See also ==
$ find /bin /sbin /lib /usr/bin /usr/sbin /usr/lib -perm /2000 -group root
 
  
==Additional Resources==
+
* Man pages: {{man|7|capabilities}}, {{man|8|setcap}}, {{man|8|getcap}}
* Man Page capabilities(7) setcap(8) getcap(8)
+
* [https://en.wikibooks.org/wiki/Grsecurity/Appendix/Capability_Names_and_Descriptions Grsecurity Appendix: Capability Names and Descriptions]
 +
* [https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt The Linux Kernel Archives: SECure COMPuting with filters]

Latest revision as of 17:44, 1 October 2017

Capabilities (POSIX 1003.1e, capabilities(7)) provide fine-grained control over superuser permissions, allowing use of the root user to be avoided. Software developers are encouraged to replace uses of the powerful setuid attribute in a system binary with a more minimal set of capabilities. Many packages make use of capabilities, such as CAP_NET_RAW being used for the ping binary provided by iputils. This enables e.g. ping to be run by a normal user (as with the setuid method), while at the same time limiting the security consequences of a potential vulnerability in ping.

Implementation

Capabilities are implemented on Linux using extended attributes (xattr(7)) in the security namespace. Extended attributes are supported by all major Linux file systems, including Ext2, Ext3, Ext4, Btrfs, JFS, XFS, and Reiserfs. The following example prints the capabilities of ping with getcap, and then prints the same data in its encoded form using getfattr:

$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
$ getfattr -d -m "^security\\." /usr/bin/ping
# file: usr/bin/ping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=

Extended attributes are copied automatically by cp -a, but some other programs require a special flag: rsync -X.

Capabilities are set by package install scripts on Arch (e.g. iputils.install).

Administration and maintenance

It is considered a bug if a package has overly permissive capabilities, so these cases should be reported rather than listed here. A capability essentially equivalent to root access (CAP_SYS_ADMIN) or trivially allowing root access (CAP_DAC_OVERRIDE) does not count as a bug since Arch does not support any MAC/RBAC systems.

Warning: Many capabilities enable trivial privilege escalation. For examples and explanations see Brad Spengler's post False Boundaries and Arbitrary Code Execution.

Other programs that benefit from capabilities

The following packages do not have files with the setuid attribute but require root privileges to work. By enabling some capabilities, regular users can use the program without privilege elevation.

beep

# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep

chvt

# setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt

iftop

# setcap cap_net_raw+ep /usr/bin/iftop

mii-tool

# setcap cap_net_admin+ep /usr/bin/mii-tool

Useful commands

Find setuid-root files:

$ find /usr/bin /usr/lib -perm /4000 -user root

Find setgid-root files:

$ find /usr/bin /usr/lib -perm /2000 -group root

See also