Как возможности Linux соотносятся с нулевым / ненулевым UID?
Страница возможностей довольно длинная, и я не до конца понимаю некоторые вещи.
Как будет выглядеть, например, функция, которая решает, есть ли у нас доступ к CAP_NET_RAW?
Входные данные:
- a = эффективный идентификатор равен 0
- b = Есть некоторый реальный / сохраненный / любой uid, который равен 0
- c = CAP_NET_RAW - это + e
- d = CAP_NET_RAW - это + i
- e = CAP_NET_RAW равно + p
- f = CAP_NET_RAW исключен из "ограничивающего набора"
Выход:
- х = теперь мы можем позвонить
socket
и не получить EPERM - y = после некоторой хитрости (без участия файловой системы
chmod +s
или жеsetcap
доступ к возвышениям или подключение к внешним помощникам), например, сcapsetp
наконец, мы можем позволить себе открыть необработанный сокет.
Как я сейчас понимаю, это что-то вроде этого:
- x =! f && (a || c)
- y =! f && (b || a || c || e)
Как это на самом деле?
1 ответ
Решение
Прочитайте документы немного больше, теперь кажется, что это так:
x = c
can_regain_caps_without_execve = (a || b) && !NO_NEW_PRIVS && (!SECBIT_NO_SETUID_FIXUP || ( CAP_SETPCAP && !SECBIT_NO_SETUID_FIXUP_LOCKED))
y = c || e || can_regain_caps_without_execve
Т.е.
- Нулевой / ненулевой uid имеет смысл только тогда, когда он изменяется и активны "корневые хаки";
- Только эффективные возможности используются для проверок; все остальное - управление возможностями;
- Ограничивающий набор и унаследованные возможности находятся вне области действия execve => для данного ответа.