Здравствуйте, Гугл и 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 не то, если их использовать вместе, может быть даже баг какой, точно пока не знаю.