| Demonstrations of capable, the Linux eBPF/bcc version. |
| |
| |
| capable traces calls to the kernel cap_capable() function, which does security |
| capability checks, and prints details for each call. For example: |
| |
| # ./capable.py |
| TIME UID PID COMM CAP NAME AUDIT |
| 22:11:23 114 2676 snmpd 12 CAP_NET_ADMIN 1 |
| 22:11:23 0 6990 run 24 CAP_SYS_RESOURCE 1 |
| 22:11:23 0 7003 chmod 3 CAP_FOWNER 1 |
| 22:11:23 0 7003 chmod 4 CAP_FSETID 1 |
| 22:11:23 0 7005 chmod 4 CAP_FSETID 1 |
| 22:11:23 0 7005 chmod 4 CAP_FSETID 1 |
| 22:11:23 0 7006 chown 4 CAP_FSETID 1 |
| 22:11:23 0 7006 chown 4 CAP_FSETID 1 |
| 22:11:23 0 6990 setuidgid 6 CAP_SETGID 1 |
| 22:11:23 0 6990 setuidgid 6 CAP_SETGID 1 |
| 22:11:23 0 6990 setuidgid 7 CAP_SETUID 1 |
| 22:11:24 0 7013 run 24 CAP_SYS_RESOURCE 1 |
| 22:11:24 0 7026 chmod 3 CAP_FOWNER 1 |
| 22:11:24 0 7026 chmod 4 CAP_FSETID 1 |
| 22:11:24 0 7028 chmod 4 CAP_FSETID 1 |
| 22:11:24 0 7028 chmod 4 CAP_FSETID 1 |
| 22:11:24 0 7029 chown 4 CAP_FSETID 1 |
| 22:11:24 0 7029 chown 4 CAP_FSETID 1 |
| 22:11:24 0 7013 setuidgid 6 CAP_SETGID 1 |
| 22:11:24 0 7013 setuidgid 6 CAP_SETGID 1 |
| 22:11:24 0 7013 setuidgid 7 CAP_SETUID 1 |
| 22:11:25 0 7036 run 24 CAP_SYS_RESOURCE 1 |
| 22:11:25 0 7049 chmod 3 CAP_FOWNER 1 |
| 22:11:25 0 7049 chmod 4 CAP_FSETID 1 |
| 22:11:25 0 7051 chmod 4 CAP_FSETID 1 |
| 22:11:25 0 7051 chmod 4 CAP_FSETID 1 |
| [...] |
| |
| This can be useful for general debugging, and also security enforcement: |
| determining a whitelist of capabilities an application needs. |
| |
| The output above includes various capability checks: snmpd checking |
| CAP_NET_ADMIN, run checking CAP_SYS_RESOURCES, then some short-lived processes |
| checking CAP_FOWNER, CAP_FSETID, etc. |
| |
| To see what each of these capabilities does, check the capabilities(7) man |
| page and the kernel source. |
| |
| |
| Sometimes capable catches itself starting up: |
| |
| # ./capable.py |
| TIME UID PID COMM CAP NAME AUDIT |
| 22:22:19 0 21949 capable.py 21 CAP_SYS_ADMIN 1 |
| 22:22:19 0 21949 capable.py 21 CAP_SYS_ADMIN 1 |
| 22:22:19 0 21949 capable.py 21 CAP_SYS_ADMIN 1 |
| 22:22:19 0 21949 capable.py 21 CAP_SYS_ADMIN 1 |
| 22:22:19 0 21949 capable.py 21 CAP_SYS_ADMIN 1 |
| 22:22:19 0 21949 capable.py 21 CAP_SYS_ADMIN 1 |
| 22:22:19 0 21952 run 24 CAP_SYS_RESOURCE 1 |
| [...] |
| |
| These are capability checks from BPF and perf_events syscalls. |
| |
| |
| USAGE: |
| |
| # ./capable.py -h |
| usage: capable.py [-h] [-v] [-p PID] |
| |
| Trace security capability checks |
| |
| optional arguments: |
| -h, --help show this help message and exit |
| -v, --verbose include non-audit checks |
| -p PID, --pid PID trace this PID only |
| |
| examples: |
| ./capable # trace capability checks |
| ./capable -v # verbose: include non-audit checks |
| ./capable -p 181 # only trace PID 181 |