Ядро Fedora 5 является доисторическим на его ядре, Вы никогда не будете мочь создать новые модули. API в ядре совсем не статичен.
В ядре может быть ошибка/функция. Обсуждалось:
Понятия не имею, если что-то было сделано, чтобы это исправить.
Не поймите меня неправильно - текущее поведение безопасно. Но это так чтобы она встала на пути того, что должно выглядеть как работа.
Правка: Согласно http://man7.org/linux/man-pages/man7/capabilities.7.html появился новый набор возможностей Ambient (начиная с Linux 4.3). Похоже, что он позволит то, что нужно.
Возможности - это свойства процессов. Традиционно существует три набора:
Программы, запускаемые с правами root, всегда имеют все разрешенные и эффективные возможности, поэтому «добавление» дополнительных возможностей не дает заметного эффекта. (Набор наследуемых возможностей обычно пуст.) С помощью setcap cap_net_raw + ep ping
вы включаете эти возможности по умолчанию для любого пользователя, запускающего эту программу.
К сожалению, эти возможности привязаны к исполняемому файлу и не сохраняются после выполнения нового дочернего процесса. В Linux 4.3 представлены Внешние возможности , которые позволяют наследовать возможности дочерним процессам. (См. Также Преобразование возможностей во время execve () в features (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
.
Ответ Лекенштейна кажется точным и полным, но я попытаюсь дать другое объяснение с другой точки зрения, которое попытается подчеркнуть проблему, которую решает набор внешних возможностей.
Когда вы запускаете sudo capsh --user=<some_user> --
Есть 2 интересующих системных вызова, которые приводят к пересчету возможностей (и потенциальному удалению):
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 --
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
, , не полагаясь на возможности файла.
Небольшая корректировка ответа Лекенштейна дает более короткий вызов для последних ядер:
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()
.
Команда 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