В исходных текстах ядра список capabilities определён в файле capabilities.h.
Количество capabilities в современных версиях ядра около 40. Точное количество можно узнать через интерфейс /proc
cat /proc/sys/kernel/cap_last_cap
Список текущих capabilities shell можно получить командой
capsh --print
cat /proc/<pid>/status | grep Cap
Эта команда выведет пять строк со значениями в виде набора двоичных флагов:
Пример вывода для команды ping
(pid 1234):
$ cat /proc/1234/status | grep Cap
CapInh: 0000000000000000
CapPrm: 0000000000003000
CapEff: 0000000000000000
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000
Для декодирования двоичных флагов можно выполнить команду capsh --decode=<bits>
:
$ capsh --decode=0000000000003000
0x0000000000003000=cap_net_admin,cap_net_raw
также можно воспользоваться командой getpcaps <pid>
$ getpcaps 1234
Capabilities for `1234': = cap_net_admin,cap_net_raw+p
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_admin,cap_net_raw+p
$ setcap cap_net_admin,cap_net_raw+p /usr/bin/ping
Формат задания capabilities в getcap/setcap имя1,имя2...<op><set> где
Подробнее этот формат описан в man 3 cap_from_text
capsh
.Без ограничений
$ capsh -- -c "/usr/bin/ping -c 1 localhost"
PING localhost.localdomain (127.0.0.1) 56(84) bytes of data.
...
С отобранными capabilities
$ sudo capsh --drop=cap_net_raw -- -c "/usr/bin/ping -c 1 localhost"
ping: socket: Operation not permitted
Вызов capget для процесса с ping = 1234 (вывод strace)
$ strace -e capget getpcaps 1234
capget({version=_LINUX_CAPABILITY_VERSION_3, pid=1234}, {effective=0, permitted=1<<CAP_NET_ADMIN|1<<CAP_NET_RAW, inheritable=0}) = 0
Установка capabilities делается вызовом capset().