LINUX.ORG.RU

Проблема с capabilities и exec

 , , ,


0

1

Здравствуйте, Гугл и ChatGPT не помогли решить следующую проблему.

У нас на работе есть модуль (назовем его myctl), который запускает другие модули подобно systemd, по конфигу при помощи fork/execvpe.

Этому модулю myctl я выдаю setcap при установке deb:

setcap "cap_sys_nice=ep cap_sys_resource=ep" /bin/myctl

Ему они нужны чтобы назначать планировщики/лимиты процессов.

Ок, запуская из myctl модуль (пусть будет aggregator), у которого тоже свои capabilities, у него не получается создать TUN интерфейс (EPERM) – значит ошибка в capabilities, однако:

getcap /bin/aggregator
/bin/aggregator = cap_net_admin,cap_net_raw,cap_sys_rawio,cap_sys_admin+eip

REM: Нужен cap_net_admin

Если запускать с консоли модуль вручную, то всё нормально.

Я так понимаю, что ошибка возникает где-то после fork/execvpe в myctl. То есть что то не то с наследованием capabilities.

Пробовал prctl(PR_SET_KEEPCAPS, 1) перед и после fork() – не помогает.

Так же пробовал выдавать myctl те же capabilities, что и у aggregator – это сработало, но такой вариант не устраивает.

В гугле особо больше информации нету, GPT тоже ничего годного больше не посоветовал.

Прошу помочь кто знает что, так и так надо будет читать исходники ядра и написать тестовый модуль чтобы распечатывал свои capabilities. Но это потом.

UPD1: Ошибку устранил, myctl использует ptrace, чтобы отслеживать состояние процессов-потомков, убрав эти вызовы ошибки в aggregator не появляются.

Значит что-то с ptrace и capabilities не то, если их использовать вместе, может быть даже баг какой, точно пока не знаю.



Последнее исправление: OlegUP (всего исправлений: 4)

Значит что-то с ptrace и capabilities не то, если их использовать вместе, может быть даже баг какой, точно пока не знаю.

Это не баг. В процессы с повышенными привилегиями нельзя лезть отладчиком, это же дыра в безопасности. Поэтому варианта тут два: либо ptrace не сработает, либо привилегии не дадутся.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от vel

В общем да, выполнение execve, как показывают логи, сбивает capabilities у процесса вообще подчистую.

10:21:38.933017 [myctl.watchdog]    DEBUG0: Capabilities [fork.child.before_ptrace(TRACEME)]:
cap_sys_nice,cap_sys_resource=ep

10:21:38.933042 [myctl.watchdog]    DEBUG0: Capabilities [fork.child.after_ptrace(TRACEME)]:
cap_sys_nice,cap_sys_resource=ep

...


[print_argv_module [pid = 1441564]: 'arguments_parse']: '/home/g10/proj/test_myctl/bootstrapped_print_argv_module/.build/print_argv_module' '--getcaps'
Capabilities:
=
OlegUP
() автор топика