Pourquoi ne puis-je pas exécuter shutdown lorsque l'autorisation est rwxr-xr-x?

34

Je suis dans /sbinet je vois qui shutdowna des autorisations rwxr-xr-x. Cela ne signifie-t-il pas que n'importe qui peut l'exécuter?

Korgan Rivera
la source
1
Quelle est la commande que vous avez exécutée et quelle est l'erreur que vous obtenez?
slayedbylucifer
Je pense qu'il parle de la shutdowncommande.
Vinz
J'ai couru ./shutdown +30. Je reçois "shutdown: doit être root". Cependant, si les autorisations indiquent que n'importe qui peut s'exécuter, pourquoi dois-je être root?
Korgan Rivera
Je suppose que n'importe qui peut éteindre la machine. Comme sur une interface graphique, tout le monde peut l’arrêter aussi. Mais si vous dites que vous devez être root, je ne le sais pas. Bonne question cependant.
Kevdog777
4
@ Kevdog777: Sur un GUI, PolicyKit gère cela. C'est un démon avec les privilèges root qui vérifiera si vous êtes autorisé à utiliser shutdown.
Vinz

Réponses:

76

Tout le monde peut s'exécuter shutdown, mais le déclenchement d'un arrêt du système nécessite des privilèges root. Mais ce shutdownn'est pas setuid, et donc seul root peut l' exécuter avec succès . Le shutdownprogramme est assez gentil pour vérifier vos privilèges et vous faire savoir s’il ya un problème, mais même s’il essayait naïvement d’arrêter le système, rien ne se passerait.

GLENDOWER: Je peux appeler les esprits de la vaste profondeur.
HOTSPUR: Pourquoi, moi aussi, tout homme peut le faire. Mais viendront-ils quand vous les appellerez?
(de Henri IV)

shutdownn'est pas différent de /bin/rm. Tout le monde peut l'exécuter, mais un utilisateur normal ne peut pas le supprimer /etcou le répertoire de base d'un autre utilisateur.

Spécifiquement: Seul un processus fonctionnant avec les privilèges root (UID effectif 0) peut ordonner au système init d'arrêter les services système, de mettre fin à tous les processus utilisateur et d'émettre l' appel système qui arrête réellement la machine. (Si shutdownétait setuid, il fonctionnerait en tant que root, peu importe qui l'invoque; mais ce n'est pas le cas.)

Qu'en est-il des appels shutdowndepuis une interface graphique, par exemple avec control-alt-del? Il est important de réaliser que dans ce cas, il shutdownest lancé directement par initet il s'exécute avec les privilèges root. Ainsi, toutes les personnes qui se dirigent vers la console peuvent potentiellement la fermer. Si ce n'est pas souhaitable, control-alt-delete sera exécuté shutdown -a. (Voir la documentation que @ some1 a citée dans sa réponse). Cela indique shutdownde vérifier si l'utilisateur actuellement connecté est autorisé à l'exécuter. Mais ceci n’est pertinent que parce qu’il shutdownfonctionne en tant que root dans ce scénario.

alexis
la source
2
Précision: n'importe qui peut exécuter le programme shutdown, mais ce programme ne peut en réalité déclencher un arrêt du système que si l'utilisateur actuel dispose des privilèges root. Droite?
LarsH
1
C'est à peu près tout. Les programmes s'exécutent avec les privilèges de l'utilisateur appelant, à moins qu'ils ne soient setuid. Arrêter le système nécessite des privilèges root, vous ne pouvez donc pas écrire votre propre programme pour le faire (sauf en exploitant des failles de sécurité, etc.).
alexis
Que signifie "shutdown is notuid"?
Iain Samuel McLean Elder
1
@Iain, les programmes sont normalement exécutés avec les autorisations de l'utilisateur qui les appelle. C'est aussi le cas avec shutdown. Un programme setuid est exécuté avec les permissions de l'utilisateur à qui appartient l'exécutable. Par exemple, /etc/passwdfonctionne avec les autorisations root pour vous permettre de modifier le fichier de mot de passe. Voir la page de manuel pour chmod.
alexis
Cela aurait dû être " /usr/bin/passwdfonctionne avec les autorisations root"! /etc/passwdn'est pas exécutable (c'est le "fichier de mot de passe" en cours de modification).
alexis
15

Le binaire shutdownlui-même vérifie si votre UID est 0.

Voir la sortie de strace de:

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)                           = ?
le chaos
la source
4
+1 pour montrer l'utilisation de strace ... c'est utile. Cependant, je ne vois pas comment cette trace indique que shutdownvotre UID est bien
vérifié par
1
Vous ne le verrez pas dans la sortie de strace car elle ne rapporte que les appels système. Vous pouvez en déduire que lorsqu'un getuid est suivi de près par l'écriture du message d'erreur auquel le code était similaire if(getuid() != 0) printf("Need to be root");. Ce qui en fait le code source le montre.
msw
5

Oui ! Tout le monde peut exécuter cette commande. Comme vous l'avez dit, vous pouvez l'exécuter, mais vous vous trouvez face à un message "Besoin d'être root", pas un message permission denied. La shutdowncommande vérifie UIDsi vous êtes root ou non.

Vinz
la source
-1

Il semble que shutdown vérifiera une liste d'accès si vous la marquez avec -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.

Etant donné que vous l'appelez actuellement sans l'indicateur -a, il ne permet par défaut que les arrêts de la racine.

Si vous souhaitez que des utilisateurs supplémentaires puissent exécuter la commande, configurez ce fichier et utilisez l'indicateur.

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

Les bits d'autorisation n'excluent pas nécessairement le contrôle d'accès basé sur un utilisateur ou un groupe.

certains1
la source
L'appeler avec à -apartir de la ligne de commande ne fera aucune différence: il shutdown -adoit toujours être exécuté avec les permissions root ( initfournies par control-alt-del).
alexis