Как делают я использую capsh: Я пытаюсь выполнить непривилегированный ping с минимальными возможностями

Ядро Fedora 5 является доисторическим на его ядре, Вы никогда не будете мочь создать новые модули. API в ядре совсем не статичен.

13
26.10.2019, 19:41
5 ответов

В ядре может быть ошибка/функция. Обсуждалось:

Понятия не имею, если что-то было сделано, чтобы это исправить.

Не поймите меня неправильно - текущее поведение безопасно. Но это так чтобы она встала на пути того, что должно выглядеть как работа.

Правка: Согласно http://man7.org/linux/man-pages/man7/capabilities.7.html появился новый набор возможностей Ambient (начиная с Linux 4.3). Похоже, что он позволит то, что нужно.

2
27.01.2020, 19:53

Возможности - это свойства процессов. Традиционно существует три набора:

  • Разрешенные возможности ( p ): возможности, которые могут быть «активированы» в текущем процессе.
  • Эффективные возможности ( e ): возможности, которые в настоящее время можно использовать в текущем процессе.
  • Наследуемые возможности ( i ): возможности файла, которые могут быть унаследованы.

Программы, запускаемые с правами root, всегда имеют все разрешенные и эффективные возможности, поэтому «добавление» дополнительных возможностей не дает заметного эффекта. (Набор наследуемых возможностей обычно пуст.) С помощью setcap cap_net_raw + ep ping вы включаете эти возможности по умолчанию для любого пользователя, запускающего эту программу.

К сожалению, эти возможности привязаны к исполняемому файлу и не сохраняются после выполнения нового дочернего процесса. В Linux 4.3 представлены Внешние возможности , которые позволяют наследовать возможности дочерним процессам. (См. Также Преобразование возможностей во время execve () в features (7) .)

Играя с возможностями, обратите внимание на следующие подводные камни:

  • При изменении пользователя от root для пользователей без полномочий root эффективные и разрешенные возможности очищаются (см. Влияние изменений идентификатора пользователя на возможности в возможности (7) ). Вы можете использовать опцию - keep = 1 для capsh , чтобы избежать очистки наборов.
  • Набор внешних возможностей сбрасывается при изменении идентификатора пользователя или группы.Решение: добавьте внешние возможности после изменения идентификатора пользователя, но до выполнения дочернего процесса.
  • Возможность может быть добавлена ​​к набору внешних возможностей, только если она уже включена как в разрешенный, так и в наследуемый набор возможностей.

Начиная с libcap 2.26, программа capsh получила возможность изменять внешние возможности с помощью таких параметров, как - addamb ( commit ). Обратите внимание, что порядок опций важен. Пример использования:

sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
    --keep=1 --user=nobody --addamb=cap_net_raw -- \
    -c "./ping -c1 127.0.0.1"

Совет: вы можете добавить параметр - print в любом месте командной строки capsh и увидеть его текущее состояние возможностей.

Примечание: cap_setpcap необходим для - addamb , тогда как cap_setuid, cap_setgid необходимы для параметра - user .

18
20.08.2021, 12:35

Ответ Лекенштейна кажется точным и полным, но я попытаюсь дать другое объяснение с другой точки зрения, которое попытается подчеркнуть проблему, которую решает набор внешних возможностей.

Когда вы запускаете sudo capsh --user=<some_user> --Есть 2 интересующих системных вызова, которые приводят к пересчету возможностей (и потенциальному удалению):

  1. setuid:Согласноman capabilities:

SECBIT_KEEP_CAPS Setting this flag allows a thread that has one or more 0 UIDs to retain its capabilities when it switches all of its UIDs to a nonzero value. If this flag is not set, then such a UIDswitch causes the thread to lose all capabilities.

Другими словами, в нашей команде capshвыше мы должны убедиться, что SECBIT _KEEP _CAPS установлен во время системного вызова setuid. В противном случае все возможности теряются. Это то, что делает --keep=1. Итак, теперь команда становитсяsudo capsh --user=<some_user> --keep=1 --

  1. execve:Если мы используем параметр --keep=1, все наборы возможностей (действующие, разрешенные, наследуемые )сохраняются до системного вызова execve, однако execveприводит к тому, что возможности быть пересчитан (и для не -пользователей root ), причем не столь очевидным образом. Короче говоря, до добавления набора внешних возможностей , чтобы возможность находиться в «разрешенном» наборе потока после вызова execve, либо:

    • Файл должен иметь эту возможность в «разрешенном» наборе . Это можно сделать с помощью setcap cap_net_raw+p /bin/bash. Это делает все упражнение бесполезным, поскольку наборы возможностей потока (, отличные от ограничивающего набора ), больше не действуют.
    • И файл, и поток должны иметь эту возможность в своих «наследуемых» наборах . Вы можете подумать, что setcap cap_net_raw+iсправится с задачей, но оказывается, что execveприводит к сбросу наследуемых разрешений потока при вызове непривилегированными пользователями (, которыми мы в настоящее время являемся благодаряsetuid). Таким образом, непривилегированный пользователь не может выполнить это условие.

Возможности окружения, представленные в Linux 4.3, позволяют потоку сохранять свои возможности даже после setuidдля непривилегированного пользователя, за которым следует execve, , не полагаясь на возможности файла.

6
20.08.2021, 12:35

Небольшая корректировка ответа Лекенштейна дает более короткий вызов для последних ядер:

sudo /usr/sbin/capsh --keep=1 --user=$USER \
  --inh=cap_net_raw --addamb=cap_net_raw -- \
  -c './ping -c1 localhost'

Примечание. :В зависимости от вашего файла sudoers это может привести к беспорядку в вашей среде (, например. изменение ДОМ ). capsh изменит ваш uid, но ничего не сделает, чтобы отменить изменения среды sudo.

Так что здесь происходит? Давайте посмотрим:

  • sudo /usr/sbin/capsh:Мы начинаем как root, у которого есть все возможности в своем эффективном (может делать это )и разрешенном (может добавить это к эффективным )наборам, но ничего в других наборах. Мы рассмотрим эти другие наборы через мгновение.
  • --keep=1:В целях безопасности (читать :устаревшие )причины, возможности обычно не наследуются между корневыми -> не -коммутаторами root ID. Этот флаг включает функцию, известную как SECBIT_KEEP_CAPS, которая разрешает это. Стоит отметить, что он автоматически очищается при выполнении exec, что является хорошей идеей.
  • --user=$USER:Теперь, когда мы не теряем все наши возможности при изменении UID, мы выходим из root. Благодаря SECBIT_KEEP_CAPSмы сохраняем привилегии типа root -, что позволяет нам еще больше возиться с нашими возможностями.
  • --inh=cap_net_raw:Это добавляет нашу целевую возможность в наследуемый набор, потому что вы не можете сделать способность внешней (см. следующий элемент ), если она не наследуемая.
  • --addamb=cap_net_raw:Несмотря на то, что мы запросили SECBIT_KEEP_CAPS, execveу непривилегированного (бинарного файла setuid/setgid/setcap ), по-прежнему не очищаются наши возможности, что приводит к отсутствию привилегий. В Linux 4.3 добавлен внешний набор, который снова добавляется к действующим и разрешенным наборам при выполнении непривилегированных двоичных файлов. Идеально!
  • -- -c...:Настроив все, мы запускаем bash с этими аргументами. Наборы возможностей очищаются (, так как bash непривилегирован ).набор окружения добавлен обратно, и вуаля! У нас есть необходимое разрешение на открытие необработанных сокетов.

Вы можете проверить это, используя специальный ==аргумент для capsh, который заставляет его выполняться вместе с остальной частью командной строки:

sudo /usr/sbin/capsh --keep=1 --user=$USER \
  --inh=cap_net_raw --addamb=cap_net_raw == --print

Current: = cap_net_raw+eip

Это означает, что у нас есть cap _net _raw, поскольку эффективный (может это делать ), наследуемый (может передавать его дочерним процессам ), и разрешено (разрешено получить ). И никаких других возможностей ни в одном из них.

Для получения дополнительной информации о возможностях и о том, как они работают, вам лучше всего обратиться к возможностям (7 )справочной странице . В частности, заголовок Transformation of capabilities during execve().

4
20.08.2021, 12:35

Команда setprivгораздо проще работает с поведением, чем capsh. Рассмотрите возможность использования его вместо этого для части возможностей времени выполнения вашего вопроса. Это не имеет большого отношения к части setcap.

$ setpriv --help

Usage:
 setpriv [options] <program> [<argument>...]

Run a program with different privilege settings.

Теперь pingотлично работает для меня как пользователя без доступа к Fedora 32:

$ cp /usr/bin/ping.
$./ping -c 1 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.030 ms

поэтому я выбрал tcptracerouteвместо:

$ tcptraceroute ::1
Running:
    traceroute -T -O info ::1 
You do not have enough privileges to use this traceroute method.
socket: Operation not permitted

против

$ sudo setpriv --no-new-privs  --inh-caps '-all,+net_raw' --bounding-set '-all,+net_raw' tcptraceroute ::1
Running:
    traceroute -T -O info ::1 
traceroute to ::1 (::1), 30 hops max, 80 byte packets
 1  localhost (::1) <rst,ack>  0.041 ms  0.010 ms  0.007 ms

Обратите внимание, что у команды нет широко повышенных прав:

$ sudo setpriv --no-new-privs  --inh-caps '-all,+net_raw' --bounding-set '-all,+net_raw' touch /root/secret
touch: cannot touch '/root/secret': Permission denied

$ sudo setpriv --no-new-privs  --inh-caps '-all,+net_raw' --bounding-set '-all,+net_raw' sudo touch /root/secret
sudo: PERM_SUDOERS: setresuid(-1, 1, -1): Operation not permitted
sudo: no valid sudoers sources found, quitting
sudo: error initializing audit plugin sudoers_audit

$ sudo setpriv --no-new-privs  --inh-caps '-all,+net_raw' --bounding-set '-all,+net_raw' id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
0
20.08.2021, 12:35

Теги

Похожие вопросы