Еще одним важным атрибутом процесса, определяющим его возможности по использованию системных вызовов, являются привилегии процесса cababilities.
Например, обладание привилегией CAP_SYS_PTRACE разрешает процессам трассировщиков strace и ltrace, использующих системный вызов ptrace, трассировать процессы любых пользователей (а не только «свои», EUID которых совладает с EUID трассировщика).
Аналогично, привилегия CAP_SYS_NIСЕ разрешает изменять приоритет, устанавливать привязку к процессорам и назначать алгоритмы планирования процессов и нитей любых пользователей, а привилегия CAP_КILL разрешает посылать сигналы процессам любых пользователей.
Явная привилегия «владельца» CAP_FOWNER позволяет процессам изменять режим и списки доступа, мандатную метку, расширенные атрибуты (см. статью) и флаги любых файлов так, словно процесс выполняется от лица владельца файла.
Привилегия CAP_LINUX_IMMUTABLE разрешает управлять флагами файлов i, immutable и a, append, а привилегия CAP_SETFCAP — устанавливать «файловые» привилегии (см. далее) запускаемых программ.
Необходимо отметить, что именно обладание полным набором привилегий делает пользователя root (UID=0) в Linux — суперпользователем. И наоборот, обычный, непривилегированный пользователь (в смысле UID≠o) не обладает никакими явными привилегиями. Неявно он обладает привилегией владельца для всех своих объектов.
Назначение привилегий процесса происходит при запуске программы при помощи системного вызова exec, исполняемый файл которого помечен «файловыми» привилегиями (здесь допущено намеренное упрощение механизма наследования и назначения привилегий при fork и exec без потери смысла).
В примере из листинга ниже иллюстрируется получение списка привилегий процесса при помощи утилиты getpcaps.
Как и ожидалось, процесс postgres (pid=1427), работающий рт лица обычного (непривилегированного, в смысле UID≠o) псевдопользователя postgres, не имеет никаких.привилегий, а процесс NetworkHanager (pid=1263), работающий от лица суперпользователя root (uid=o), имеет полный набор привилегий.
Однако процесс dhclient (PID=14026) выполняется от лица «суперпользователя», лишенного большинства своих привилегий, т. к. после порождения своего дочернего процесса NetworkManager уменьшил его привилегии до минимально необходимого набора, достаточного для выполнения своих функций, что способствует обеспечению защищенности операционной системы.
Содержимое
Привилегии (capabilities) процесса
fitz@ubuntu:~$ ps fo user,pid,cmd -C NetworkManager,dhclient,postgres
USER PID CMD
root 1263 NetworkManager
root 14026 \_ /sbin/dhclient -d -4 -sf /usr/lib/NetworkManager/nm-dhcp-client…
postgres 1427 /usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.l/main …
postgres 1984 \_ postgres: writer process
postgres 1985 \_ postgres: wal writer process
postgres 1986 \_ postgres: autovacuum launcher process
postgres 1987 \_ postgres: stats collector process
fitz@ubuntu:~$ getpcaps 1427
Capabilities for ‘1427’: =
fitz@ubuntu:~$ getpcaps 1263
Capabilities for ‘1263’: =
cap_chown, cap_dac_override, cap_dac_read_search, cap_fowner, cap_fsetid, cap_kill, cap_setgid, capsetuid, cap_setpcap, cap_linux_immutable, cap_net_bind_service, cap_net_broadcast, cap_net_admin, cap_net_raw, cap_ipc_lock, cap_ipc_owner, cap_sys_module, cap_sys_rawio, cap_sys_chroot, cap_sys_ptrace, cap_sys_pacct, cap_sys_admin, cap_sys_boot, cap_sys_nice, cap_sys_resource, cap_sys_time, cap_sys_tty_config, cap_mknod, cap_lease, cap_audit_write, cap_audit_control, cap_setfcap, cap_mac_override, cap _mac_admin, cap_syslog,35,36+ep
fitz@ubuntu:~$ getpcaps 14026
Capabilities for ‘14026’: =
cap_dac_override,cap_net_bind_service,cap_net_raw,cap_sys_module+ep
В листинге ниже показан типичный пример использования отдельных привилегий там, где классически применяется неявная передача всех полномочий суперпользователя при помощи механизма SUID/SGID.
Например, «обычная» утилита ping для выполнения своей работы должна создать «необработанный» raw сетевой сокет, что является с точки зрения ядра привилегированной операцией.
В большинстве систем программа /bin/ping будет SUID-ной во владении суперпользователем root, чьи права и будут передаваться при ее запуске.
С точки зрения защищенности системы это не соответствует здравому смыслу, подсказывающему наделять программы минимально необходимыми возможностями, достаточными для их функционирования.
Для создания «необработанных» raw и пакетных packet сокетов достаточно только привилегии CAP_NET_RAW, а весь суперпользовательский набор привилегий более чем избыточен.
Делегирование привилегий программе ping
fitz@ubuntu:~$ ls -l /bin/ping
-rwsr-xr-x 1 root root 3474 нояб. 8 2017 /bin/ping
fitz@ubuntu:~$ ping ubuntu
PING ubuntu (127.0.1.1) 56(84) bytes of data.
64 bytes from ubuntu (127.0.1.1): icmp_req=1 ttl=64 time=0.074 ms
^C
— ubuntu ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt wln/avg/max/mdev = 0.074/0.074/0.074/0.000 ms
fitz@ubuntu:~$ sudo chmod u-s /bin/ping
fitz@ubuntu:~$ ping ubuntu
ping: icmp open socket: Operation not permitted
fitz@ubuntu: ~$ sudo setcap cap_net_raw+ep /bin/ping
fitz@ubuntu:~$ ls -l /bin/ping
-rwxr-xr-x 1 root root 34740 нояб. 8 2017 /bin/ping
fitz@ubuntu:~$ getcap /bin/ping
/bin/ping = cap_net_raw+ep ,
fitz@ubuntu:~$ ping ubuntu
PING ubuntu (127.0.1.1) 56(84) bytes of data.
64 bytes from ubuntu (127.0.1.1): icmp_req=1 ttl=64 time=0.142 ms
^D
— ubuntu ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.142/0.142/0.142/0.000 ms
При отключении передачи полномочий программа /bin/ping лишается возможности выполнять свои функции, а при назначении ей при помощи команды setcap «файловой» привилегии CAP_NET_RAW функциональность возвращается в полном объеме, т. к. приводит к установке «процессной» привилегии CAP_NET_RAW при запуске этой программы.
Для просмотра привилегий, делегируемых при запуске программ, используется парная команда getcap.
Аналогично, при использовании анализаторов сетевого трафика tshark и/или wireshark, вызывающих для захвата сетевых пакетов утилиту dumpcap, необходимо открывать как «необработанные» raw, так и пакетные packet сетевые сокеты, что требует той же привилегии CAP_NETJRAW.
Классический способ применения анализаторов пакетов состоит в использовании явной передачи всех полномочий суперпользователя (при помощи su или sudo) при их запуске, что опять не соответствует минимально необходимым и достаточным требованиям к разрешенным возможностям программ.
Делегирование привилегий программе tshark
fitz@ubuntu:~$ tshark
tshark: There are no interfaces on which a capture can be done
fitz@ubuntu:~$ strace -fe execve tshark
execve(«/usr/bin/tshark», [«tshark»], [/* 23 vars */]) = 0
Process 8951 attached
[pid 8951] execve(«/usr/bin/dunpcap», [«/usr/bin/dumpcap», «-D», «-Z», «none»],
[/* 23 vars */]) = 0
Process 8951 detached
— SIGCHLD (Child exited) @ 0 (0) —
tshark: There are no interfaces on which a capture can be done
fitz@ubuntu:~$ sudo setcap cap_net_raw+ep /usr/bin/dumpcap
[sudo] password for fitz:
fitz@ubuntu:~$ getcap /usr/bin/dumpcap
/usr/bin/dunpcap = cap_net_raw+ep
fitz@ubuntu:~$ tshark -i wlanO
Capturing on wlan0
0.307205 fe80: :895d:9d7d:f0b3:a372 -> ff02::l:ff96:2df6 ICMPv6 86 Neighbor Solicitation
0.307460 SuperMic_74: 0e: 90 -> Spanning -1 ree — ( fоr- bridges )_00 STP 60 Conf. Root = 32768/0/00:25:90:74:0e:90 Cost = 0 Port = 0x8001
0.982542 10.2.0.126 -> 10.2.0.255 NBNS 92 Name query NB WPAD<00>
0.982811 04:18:d6:4e:53:88 -> Broadcast ARP 60 Who has 10.2.0.1? Tell 10.2.0.43.
Для эффективного использования анализаторов трафика непривилегированными пользователями достаточно делегировать их процессам захвата пакетов привилегию CAP_NET_RAW при помощи «файловых» привилегии CAP_NET_RAW для программы захвата /usr/bin/dumpcap, что и проиллюстрировано в листинге выше.