Почему я не могу выполнить завершение работы, когда разрешение - rwxr-xr-x?

34

Я в /sbinи вижу, что shutdownесть разрешения rwxr-xr-x. Разве это не значит, что кто-то может выполнить это?

Корган Ривера
источник
1
какую команду вы выполнили и какую ошибку вы получаете?
slayedbylucifer
Я думаю, что он говорит о shutdownкоманде.
Vinz
Я побежал ./shutdown +30. Я получаю «выключение: должен быть root». Тем не менее, если в разрешениях указано, что каждый может выполнить, зачем мне быть пользователем root?
Корган Ривера
Я предполагаю, что любой может выключить машину. Как и в графическом интерфейсе, любой может его отключить. Но если вы говорите, что вам нужно быть пользователем root, тогда я не знаю. Хороший вопрос, хотя.
Kevdog777
4
@ Kevdog777: На GUI PolicyKit справляется с этим. Это демон с привилегиями root, который проверит, разрешено ли вам использовать shutdown.
Vinz

Ответы:

76

Любой может выполнить shutdown, но для запуска выключения системы требуются права суперпользователя. Но shutdownэто не setuid, и поэтому только root может успешно выполнить его. shutdownПрограмма достаточно хорош , чтобы проверить свои привилегии , и пусть вы знаете , если есть проблема, но даже если он наивно попытался завершение работы системы, ничего не произойдет.

GLENDOWER: Я могу вызывать духов из глубокой души.
ХОТСПУР: Почему, я тоже, или любой другой. Но придут ли они, когда ты их позовешь?
(от Генриха IV)

shutdownничем не отличается от /bin/rm. Каждый может выполнить его, но обычный пользователь не может удалить /etcили домашний каталог другого пользователя.

В частности: только процесс, работающий с привилегиями root (эффективный UID 0), может направить систему init на остановку системных служб, завершение всех пользовательских процессов и выполнить системный вызов, который фактически останавливает машину. (Если бы shutdownбыл setuid, он запускался бы как root независимо от того, кто его вызывает; но это не так.)

Как насчет вызова shutdownиз GUI, например, с помощью control-alt-del? Важно понимать, что в этом случае shutdownон запускается напрямую initи запускается с привилегиями root. Поэтому каждый, кто подходит к консоли, может ее отключить. Если это нежелательно, control-alt-delete действительно будет работать shutdown -a. (Смотрите документацию, которую @ some1 цитировал в своем ответе). Это говорит shutdownо том, чтобы проверить, авторизован ли в данный момент авторизованный пользователь для его запуска. Но это важно только потому, shutdownчто в этом сценарии выполняется с правами root.

Alexis
источник
2
Пояснение: любой может выполнить программу shutdown, но эта программа не может вызвать отключение системы, если текущий пользователь не имеет прав root. Правильно?
LarsH
1
Вот и все. Программы запускаются с привилегиями вызывающего пользователя, если они не настроены. Завершение работы системы требует привилегий суперпользователя, поэтому вы не можете написать собственную программу для этого (кроме использования дыр в безопасности и т. Д.).
Алексис
Что означает «выключение не установлено»?
Иэн Самуэль Маклин, старейшина
1
@ Iain, программы обычно запускаются с разрешениями пользователя, который их вызывает. Это также относится и к shutdown. Программа setuid запускается с разрешения пользователя, которому принадлежит исполняемый файл. Например, /etc/passwdзапускается с правами root, чтобы позволить вам изменить файл пароля. Смотрите man-страницу для chmod.
Алексис
Это должно было быть " /usr/bin/passwdработает с правами root"! /etc/passwdне исполняемый (это изменяемый файл паролей).
Алексис
15

Сам бинарный файл shutdownпроверяет, равен ли ваш UID 0.

Смотрите вывод strace:

strace /sbin/shutdown -r -h now
...
...
geteuid()                               = 10001
setuid(10001)                           = 0
getuid()                                = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1)                           = ?
хаос
источник
4
+1 за показ использования strace ... это полезно. Однако я не вижу, как эта трассировка показывает, shutdownчто ваш UID равен 0.
LarsH
1
Вы не увидите этого в выводе strace, поскольку он сообщает только о системных вызовах. Вы можете сделать вывод, что когда за getuid внимательно следят, написав сообщение об ошибке, с которым был похож код if(getuid() != 0) printf("Need to be root");. Что на самом деле исходный код показывает, что это так.
MSS
5

Да ! Каждый может выполнить эту команду. Как вы сказали, вы можете запустить его, но вы столкнулись с сообщением «Нужен root», а не с permission denied. Команда shutdownпроверяет ваш, UIDчтобы узнать, являетесь ли вы пользователем root или нет.

Vinz
источник
-1

Похоже, что shutdown проверит список доступа, если вы отметите его с -a:

ACCESS CONTROL
       shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐
       one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user  is  logged
       in  on  one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see
       if the file /etc/shutdown.allow is present.  It then compares the login names in that file with the list of people that are logged in on a virtual console
       (from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message

       shutdown: no authorized users logged in

       to  the  (physical)  system  console.  The  format  of  /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are
       allowed. Currently there is a limit of 32 users in this file.

Поскольку вы в настоящее время вызываете его без флага -a, по умолчанию разрешено только отключение root.

Если вы хотите, чтобы дополнительные пользователи могли выполнять команду, настройте этот файл и используйте флаг.

Why can't I execute shutdown when the permission is rwxr-xr-x?

Биты разрешений не обязательно исключают управление доступом на основе пользователя или группы.

some1
источник
Вызов его -aиз командной строки не будет иметь никакого значения: shutdown -aвсе равно должен выполняться с правами root (что initуказывается в control-alt-del).
Алексис