Привилегии как атрибуты процесса Linux

Еще одним важным атрибутом процесса, определяющим его возможности по использованию системных вызовов, являются привилегии процесса 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, что и проиллюстрировано в листинге выше.

 

Добавить комментарий