Как возможности 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 => для данного ответа.
Другие вопросы по тегам