Я экспериментирую с возможностями Debian Gnu / Linux.
Я скопировал / bin / ping в мой текущий рабочий каталог. Как и следовало ожидать, это не работает, это был изначально setuid root.
Затем я даю ping минимальные возможности (не root) sudo /sbin/setcap cap_net_raw=ep ./ping
, и мой ping работает, как и ожидалось.
Затем sudo /sbin/setcap -r ./ping
отозвать эту возможность. Теперь он не работает, как ожидалось.
Я сейчас пытаюсь заставить пинг работать, используя capsh
.
capsh
не имеет привилегий, поэтому мне нужно запустить его как root, но затем удалить root и, следовательно, все остальные привилегии.
Я думаю, что мне также нужно secure-keep-caps
, это не задокументировано capsh
, но есть в руководстве по возможностям. Я получил битовые числа от /usr/include/linux/securebits.h
. Они кажутся правильными, поскольку вывод --print
показывает, что эти биты верны.
Я возился часами, пока у меня есть это.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Однако ping
ошибки ping: icmp open socket: Operation not permitted
, это то, что происходит, когда у него нет возможности. Также --print
шоу Current: =p cap_net_raw+i
, этого недостаточно, нам нужно e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
установит возможность Current: = cap_net_raw+eip
это правильно, но оставляет нас как root
.
Edit-1
Я сейчас попробовал sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Это производит:
touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted
Первая ошибка ожидается как, secure-noroot: yes
но вторая нетCurrent: = cap_net_raw+eip
Edit-2
Если я поставлю ==
перед --print
, это теперь показывает Current: = cap_net_raw+i
, так что объясняет предыдущую ошибку, но не то, почему мы теряем возможность при переключении из root, хотя я secure-keep-caps
должен это исправить.
Edit-3
Из того, что я вижу, я теряю Effective (e) и Permitted (p), когда вызывается exec. Это ожидается, но я подумал, что безопасные защитные колпачки должны остановить их потерю. Я что-то пропустил.
Edit-4
Я проводил дополнительные исследования и снова перечитывал руководство. Кажется, что обычно e
и p
возможности теряются, когда: вы переключаетесь с пользователя root
(или применяете его secure-noroot
, тем самым делая root обычным пользователем), это можно переопределить secure-keep-caps
; когда вы звоните exec
, насколько я могу судить, это инвариант.
Насколько я могу судить, он работает в соответствии с руководством. Насколько я могу судить, нет ничего полезного capsh
. Насколько я могу судить, чтобы использовать возможности, вам нужно: использовать файловые возможности или иметь программу, осведомленную о возможностях, которая не используется exec
. Поэтому нет привилегированной обертки.
Итак, теперь мой вопрос: что мне не хватает, для чего capsh
.
Edit-5
Я добавил ответ о возможностях. Может capsh
быть, также может использоваться с унаследованными возможностями, но для того, чтобы быть полезными, их необходимо установить в исполняемом файле. Я не вижу, как capsh может сделать что-нибудь полезное без внешних возможностей или разрешить унаследованные возможности.
Версии:
capsh
изlibcap2-bin
версии пакета1:2.22-1.2
- перед правкой-3 я взял последнюю
capsh
версиюgit://git.debian.org/collab-maint/libcap2.git
и начал использовать ее. uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
Пользовательская земля 32bit.
источник
capsh
из репозитория Collab-Maint не дал бы вам «последнее»capsh
, пакет Debian по-прежнему не поддерживает внешние возможности. Upstream 2.27 делает.capsh
, в отсутствие ambient (как это было изначально). Чего мне не хватает Это должно иметь применение.Ответы:
Возможности - это свойства процессов. Традиционно есть три набора:
Программы, запускаемые с правами root, всегда имеют полностью разрешенные и эффективные возможности, поэтому «добавление» дополнительных возможностей не оказывает заметного эффекта. (Набор наследуемых возможностей обычно пуст.) Когда
setcap cap_net_raw+ep ping
вы включаете эти возможности по умолчанию для любого пользователя, запускающего эту программу.К сожалению, эти возможности связаны с исполняемым файлом и не сохраняются после выполнения нового дочернего процесса. В Linux 4.3 появились возможности Ambient, которые позволяют наследовать дочерние процессы. (См. Также Преобразование возможностей во время выполнения execve () в возможностях (7) .)
Играя с возможностями, обратите внимание на эти ловушки:
--keep=1
опцию,capsh
чтобы избежать очистки наборов.capsh
Программа от libcap 2.25 не имеют возможности изменять возможности окружающей среды пока нет, но более поздние выпуски добавлять новые варианты. Обратите внимание, что порядок опций имеет большое значение. Пример использования:Совет: вы можете добавить
--print
опцию в любом местеcapsh
командной строки и увидеть ее текущее состояние возможностей.Примечание:
cap_setpcap
необходимо для--addamb
покаcap_setuid,cap_setgid
необходимо для--user
опции.источник
Ответ Лекенштейна кажется точным и полным, но я попытаюсь дать другое объяснение под другим углом, которое попытается подчеркнуть проблему, которую решает окружающий набор возможностей.
Когда вы запускаете
sudo capsh --user=<some_user> --
Есть 2 системных вызова, которые вызывают перерасчет возможностей (и, возможно, отбрасывают):setuid
Согласноman capabilities
:Другими словами, в нашей
capsh
команде выше, мы должны убедиться, что SECBIT_KEEP_CAPS установлен во времяsetuid
системного вызова. В противном случае все возможности будут потеряны. Это то, что--keep=1
делает. Так что теперь команда становитсяsudo capsh --user=<some_user> --keep=1 --
execve
Если мы используем--keep=1
опцию, все наборы возможностей (эффективные, разрешенное, наследуемым) не сохраняются до тех пор , вexecve
системный вызов, однакоexecve
приводит к возможности быть пересчитаны (для непривилегированных пользователей) , а также и в не столь очевидным образом. Короче говоря, до добавления набора внешних возможностей для возможности быть в «разрешенном» наборе потока послеexecve
вызова, либо:setcap cap_net_raw+p /bin/bash
. Это делает все упражнение бесполезным, так как наборы возможностей потока (кроме ограничивающего набора) больше не имеют никакого эффекта.setcap cap_net_raw+i
быexecve
сработало, но оказывается, что вызывает необратимые разрешения потока при вызове непривилегированными пользователями (за что мы в настоящее время благодаримsetuid
). Таким образом, нет способа удовлетворить это условие для непривилегированного пользователя.Возможности окружения, представленные в Linux 4.3, позволяют потоку сохранять свои возможности даже после
setuid
непривилегированного пользователя, за которым следуетexecve
, без необходимости полагаться на файловые возможности.источник
Там может быть ошибка / функция в ядре. Там было некоторое обсуждение:
Я понятия не имею, если что-то было сделано, чтобы исправить это.Редактировать: Согласно http://man7.org/linux/man-pages/man7/capabilities.7.html, существует новый набор возможностей Ambient (начиная с Linux 4.3). Похоже, это позволит то, что нужно.
источник