Используя setuid Правильно

Это действительно сводится к тому, что составляет процесс в Unix. Процесс может появиться одним из 2 способов. Любой через fork() функционируйте или через один из exec() функции в C.

fork()

fork() в основном просто делает копию текущего процесса, но присваивает ему новый идентификатор процесса (PID). Это - ребенок исходного процесса. Вы видите эти отношения в выводе ps:

$ ps axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1  5255  1964  1964 ?           -1 Sl     500   0:39 gnome-terminal
 5255  5259  1964  1964 ?           -1 S      500   0:00  \_ gnome-pty-helper
 5255 18422 18422 18422 pts/1    18422 Ss+    500   0:01  \_ bash
 5255 30473 30473 30473 pts/4    30473 Ss+    500   0:00  \_ bash
30473   782   782 30473 pts/4    30473 Sl     500   1:14  |   \_ evince s.pdf

Здесь Вы видите это gnome-terminal родительский процесс (PID = 5255) и это bash это, ребенок (PID = 18422, PPID = 5255).

Примечание: PPID = ИДЕНТИФИКАТОР родительского процесса.

Когда процесс разветвляется от его родителя, он "наследовал" определенные вещи, такие как копии всех дескрипторов файлов, которые родитель в настоящее время имеет для открытых файлов и пользователя родителя и идентификаторов группы.

Примечание: Последние 2 - то, что определяет, какой файл и полномочия группы этот процесс будет иметь при доступе к файловой системе.

Таким образом, если процесс просто наследовал своего пользователя и идентификатор группы от его родителя, то, почему все просто принадлежавшее корнем или отдельным пользователем не? Это то, где exec() входит.

exec() Часть № 1

exec() семейство функций, конкретно execve(), "замените" изображение текущего процесса новым образом процесса. Терминология "образ процесса" является действительно просто файлом, т.е. исполняемым файлом на диске. Таким образом, это - то, как сценарий удара может выполнить программу такой как /usr/bin/time.

Таким образом что относительно идентификатора пользователя и идентификатора группы? Хорошо, чтобы понять, что позволяют нам сначала обсудить понятие о "Персоне".

Персона

В любое время каждый процесс имеет эффективный идентификатор пользователя, эффективный идентификатор группы и ряд дополнительных идентификаторов группы. Эти идентификаторы определяют полномочия процесса. Их коллективно называют персоной процесса, потому что они определяют, "кто это" в целях управления доступом.

exec() Часть № 2

Таким образом в дополнение к способности выгрузить "образ процесса", exec() может также изменить пользователя и идентификаторы группы от исходных "реальных" до "эффективных".

Пример

Для этой демонстрации я собираюсь показать Вам, что происходит, когда мы начинаем в оболочке как наш UID/GID по умолчанию и затем порождаем дочернюю оболочку с помощью одного из моих дополнительных ЦЕНУРОЗОВ, делая ее эффективным GID дочерней оболочки.

Для выполнения этого, я собираюсь использовать команду Unix newgrp. newgrp позволяет Вам порождать новую оболочку, передающую его дополнительная группа, что я хотел бы сделать свой эффективный GID.

Для начинающих:

$ id -a
uid=500(saml) gid=501(saml) groups=501(saml),502(vboxusers),503(jupiter)

Мы видим, что эта оболочка в настоящее время настраивается с моим UID/GID по умолчанию saml & saml. Касание некоторых файлов показывает что дело обстоит так также:

$ touch afile1
$ touch afile2
$ ls -l
total 0
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile2

Теперь мы делаем нашу дополнительную группу jupiter эффективный GID:

$ newgrp jupiter
$ id -a
uid=500(saml) gid=503(jupiter) groups=501(saml),502(vboxusers),503(jupiter)

Теперь, если мы касаемся некоторых файлов:

$ touch afile3
$ touch afile4
$ ls -l
total 0
-rw-rw-r-- 1 saml saml    0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml    0 May 21 23:47 afile2
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile3
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile4

Мы видим, что эффективный GID оболочки jupiter, таким образом, любые взаимодействия с диском приводят к файлам, создаваемым с jupiter вместо моей нормальной группы по умолчанию saml.

Ссылки

5
18.04.2014, 12:44
1 ответ

Краткая история: не используйте сценарии оболочки setuid (или любые сценарии setuid / setgid).

Длинная история: Разрешить setuid в сценариях оболочки

Решение: вызвать команду с помощью sudo .

sudo arp -s 198.51.100.1 00:53:00:12:34:56

Чтобы позволить пользователю steven запускать эту команду без ввода пароля, запустите visudo и добавьте следующую строку:

steven ALL = (root) NOPASSWD: arp -s 198.51.100.1 00\:53\:00\:12\:34\:56

Если у вас есть другие записи sudo для Стивен , NOPASSWD: один (и) должен быть последним .

4
27.01.2020, 20:40

Теги

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