Skip to main content

Linux Capabilities

Updated Mar 11, 2022 ·

Linux Capabilities

Linux capabilities are a security feature in the Linux kernel that enhance security by limiting application privileges and reducing attack surfaces.

  • Traditional Privileges vs. Capabilities

    Traditionally, root processes have full system control. Linux capabilities break these privileges into smaller units, allowing more precise control.

  • Bounding Set

    Each process has a bounding set of capabilities, limiting the privileges it can gain through user or group permissions.

View Linux Capabilities

To check what capabilities is needed by a command, example is ping:

$ which ping
/usr/bin/ping

$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep

To get the capabilities needed by a process, example is ssh:

$ which sshd
/usr/sbin/sshd

$ ps -ef | grep /usr/bin/sshd
joseeden 740 1 0 18:29 ? 00:00:00 /usr/bin/sshd =D

$ getpcaps 740
Capabilities for `740': =cap_net_bind_service,cap_net_raw+ep

Capability Sets

Each process has three sets of capabilities:

SetDescription
PermittedCapabilities a process can potentially use.
InheritableCapabilities retained across an execve() system call.
EffectiveCapabilities currently active for the process.

Dropping Privileges

Processes can drop specific capabilities to reduce their privileges after they have started.

  • The prctl() system call
  • Often used to manipulate capabilities programmatically.

Other Linux Capabilities

CapabilityDescription
CAP_NET_BIND_SERVICEBind to ports <1024 without root.
CAP_DAC_READ_SEARCHBypass file read and directory search permission checks.
CAP_SYS_ADMINPerform various administrative tasks.
CAP_SYS_PTRACETrace and debug arbitrary processes.
CAP_NET_RAWUse raw sockets.

Linux Capabilities in Kubernetes

In Kubernetes, Linux capabilities can be defined in a Pod's security context.

apiVersion: v1
kind: Pod
metadata:
name: time-cap-pod
spec:
containers:
- name: ubuntu-container
image: ubuntu:latest
command: ["sleep", "3600"]
securityContext:
capabilities:
add: ["SYS_TIME"]

Similarly, we can also drop Linux capabilities:

apiVersion: v1
kind: Pod
metadata:
name: time-cap-pod
spec:
containers:
- name: ubuntu-container
image: ubuntu:latest
command: ["sleep", "3600"]
securityContext:
capabilities:
add: ["SYS_TIME"]
drop: ["CHOWN"]

To learn more, check out Set capabilities for a Container.