Ответ Лекенштейна кажется точным и полным, но я попытаюсь дать другое объяснение с другой точки зрения, которое попытается подчеркнуть проблему, которую решает набор внешних возможностей.
Когда вы запускаете 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
, , не полагаясь на возможности файла.
Если вы можете смонтировать диск вашей автономной системы, вы можете использовать опцию -D
или --directory
с journalctl
. Например, если вы монтируете диск в /mnt
, вы можете получить доступ к его журналу с помощью
journalctl -D /mnt/var/log/journal