Capabilities (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Capabilities
. Дата последней синхронизации: 22 сентября 2023. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Привилегии (POSIX 1003.1e,
capabilities(7)
) позволяют предоставить программам доступ к определённым возможностям, которые обычно есть только у суперпользователя, позволяя избежать запуска программ от имени root. Разработчикам программ рекомендуется заменить использование мощного атрибута
setuid
в системных исполняемых файлах на минимально необходимый программе набор привилегий. Многие пакеты используют привилегии; например, привилегия
CAP_NET_RAW
используется в
fping
. Это позволяет запускать
fping
от имени обычного пользователя (как при использовании метода
setuid
), но при этом процесс не получает root-права, что ограничивает возможность эксплуатации потенциальных уязвимостей в
fping
.
Реализация
Для реализации привилегий в Linux используются
расширенные атрибуты
(
xattr(7)
) в пространстве имён
security
. Расширенные атрибуты поддерживаются всеми основными
файловыми системами
Linux, в том числе Ext2, Ext3, Ext4, Btrfs, JFS, XFS и Reiserfs. Следующий пример выводит привилегии fping с помощью
getcap
, а затем выводит те же данные в закодированном виде с помощью
getfattr
:
$ getcap /usr/bin/fping
/usr/bin/fping cap_net_raw=ep
$ getfattr -d -m "^security\\." /usr/bin/fping
# file: usr/bin/fping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
Расширенные атрибуты копируются автоматически при использовании
cp -a
, но некоторые другие программы требуют специального флага: например,
rsync -X
.
Привилегии устанавливаются install-скриптами в пакетах Arch (например,
fping.install
).
Администрирование и обслуживание
Если у пакета слишком много ненужных привилегий — это считается ошибкой, о которой стоит сообщить. Использование привилегий, фактически эквивалентных root-доступу (
CAP_SYS_ADMIN
) или позволяющих легко получить root-доступ (
CAP_DAC_OVERRIDE
), ошибкой не считается, так как Arch не поддерживает какую-либо систему
мандатного управления доступом
.
Важно
Многие привилегии позволяют тривиально получить root-доступ. Примеры и объяснения можно посмотреть в сообщении Брэда Шпенглера:
False Boundaries and Arbitrary Code Execution
.
Программы, для которых удобно использовать привилегии
Перечисленные ниже пакеты не имеют файлов с атрибутом setuid и для работы требуют права root. Для них можно добавить привилегии, чтобы обычные пользователи могли использовать программу без получения root-доступа.
Символы
+ep
означают «effective permitted», подробнее в man-странице
capabilities(7) § File capabilities
.
beep
# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep
chvt
# setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt
iftop
# setcap cap_net_raw+ep /usr/bin/iftop
mii-tool
# setcap cap_net_admin+ep /usr/bin/mii-tool
mtr
# setcap cap_net_raw+ep /usr/bin/mtr-packet
nethogs
# setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs
wavemon
# setcap cap_net_admin+ep /usr/bin/wavemon
Полезные команды
Поиск файлов с setuid-root:
$ find /usr/bin /usr/lib -perm /4000 -user root
Поиск файлов с setgid-root:
$ find /usr/bin /usr/lib -perm /2000 -group root
Временная выдача привилегий
С помощью
capsh(1)
можно запустить программу с указанными привилегиями без редактирования расширенных атрибутов исполняемого файла.
Следующий пример демонстрирует, как подключиться к процессу через
GDB
с помощью привилегии
CAP_SYS_PTRACE
:
$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid>
Пример прослушивания привилегированного порта с помощью
netcat
:
$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123
Listening on 0.0.0.0 123
Смотрите также
Man-страницы:
capabilities(7)
,
setcap(8)
,
getcap(8)
Wikibooks:Grsecurity/Appendix/Capability Names and Descriptions
Seccomp BPF (SECure COMPuting with filters)