Я экспериментирую с возможностями 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 -aLinux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/LinuxПользовательская земля 32bit.
capsh, в отсутствие ambient (как это было изначально). Чего мне не хватает Это должно иметь применение.
capshиз репозитория Collab-Maint не дал бы вам «последнее»capsh, пакет Debian по-прежнему не поддерживает внешние возможности. Upstream 2.27 делает.