Comment fonctionnent les internes de sudo?

74

Comment sudofonctionne en interne? Comment est-il possible qu'il puisse devenir root sans avoir le mot de passe root, contrairement à su? Quels appels système, etc. sont impliqués dans le processus? N’est-ce pas une faille de sécurité béante sous Linux (par exemple, pourquoi n’ai-je pas pu compiler un gros patch sudoqui fait tout ce que l’on fait normalement sudo, sans demander le mot de passe de l’utilisateur non privilégié)?

J'ai lu login et su internes . J'ai aussi lu Comment est-il prévu d'utiliser sudo? mais malgré le titre, ils traitent principalement des différences entre suet sudo.

combattant
la source

Réponses:

80

Si vous regardez l'exécutable sudo:

$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun  3  2011 /usr/bin/sudo

Vous remarquerez qu'il porte les bits d'autorisation ---s--x--x. Ceux-ci peuvent être décomposés comme suit:

-|--s|--x|--x
-      - first dash denotes if a directory or a file ("d" = dir, "-" = file)  
--s    - only the setuid bit is enabled for user who owns file
--x    - only the group execute bit is enabled
--x    - only the other execute bit is enabled

Ainsi, lorsqu'un programme a son bit setuid activé (également appelé SUID), cela signifie que lorsque quelqu'un l'exécutera, il s'exécutera avec les informations d'identification de l'utilisateur propriétaire du fichier, à savoir. racine dans ce cas.

Exemple

Si j'exécute la commande suivante en tant qu'utilisateur saml:

$ whoami
saml

$ sudo su -
[sudo] password for saml: 

Vous remarquerez que l'exécution de sudoest en cours d'exécution en tant que root:

$ ps -eaf|grep sudo
root     20399  2353  0 05:07 pts/13   00:00:00 sudo su -

mécanisme setuid

Si vous êtes curieux de savoir comment fonctionne le SUID, jetez un coup d'œil man setuid. Voici un extrait de la page de manuel qui l'explique mieux que je ne pourrais le faire:

setuid () définit l'ID utilisateur effectif du processus appelant. Si l'UID effectif de l'appelant est la racine, l'UID réel et l'identifiant set-user-ID enregistré sont également définis. Sous Linux, setuid () est implémenté comme la version POSIX avec la fonctionnalité _POSIX_SAVED_IDS. Cela permet à un programme set-user-ID (autre que root) de supprimer tous ses privilèges utilisateur, d'effectuer un travail non privilégié, puis de réengager l'ID utilisateur d'origine de manière sécurisée.

Si l'utilisateur est root ou que le programme est set-user-ID-root, des précautions particulières doivent être prises. La fonction setuid () vérifie l'ID utilisateur effectif de l'appelant et, s'il s'agit du superutilisateur, tous les ID utilisateur liés au processus sont définis sur uid. Après que cela se soit produit, il est impossible pour le programme de récupérer les privilèges root.

Le concept clé ici est que les programmes ont un véritable ID utilisateur (UID) et un effectif (EUID). Setuid définit l'ID utilisateur effectif (EUID) lorsque ce bit est activé.

Ainsi, du point de vue du noyau, nous samlsavons que, dans notre exemple, est toujours le propriétaire d'origine (UID), mais le EUID a été défini avec le propriétaire de l'exécutable.

setgid

Je devrais également mentionner que lorsque nous décomposons les autorisations de la commande sudo, le deuxième groupe de bits concerne les autorisations de groupe. Les bits de groupe ont également quelque chose de similaire à setuid appelé set group id (alias setgid, SGID). Cela fait la même chose que SUID sauf qu'il exécute le processus avec les informations d'identification du groupe au lieu des informations d'identification du propriétaire.

Références

slm
la source
4
Vous devriez utiliser sudo -sau lieu de sudo suparce que c'est une utilisation inutile de su. :)
Totor
4

Le vrai sudofichier binaire est setuid root , et vous ne pouvez pas simplement créer des fichiers créés de cette manière.

setuid et setgid (abréviation de "définir l'ID utilisateur lors de l'exécution" et "définir l'ID groupe lors de l'exécution", respectivement) [1] sont des indicateurs de droits d'accès Unix permettant aux utilisateurs d'exécuter un exécutable avec les autorisations respectives du propriétaire ou du groupe de l'exécutable et changer le comportement dans les annuaires.

Ignacio Vazquez-Abrams
la source
d'accord, cela répond en partie à ma question. si vous souhaitez expliquer comment sudo utilise ce bit, et un peu plus sur ce qu'il fait, j'aimerais bien accepter cette réponse
vendredi
2

Pour répondre à la partie sur les appels système que personne ne semble avoir touchée, l'un des appels système importants est setresuid () ou setresgid (). Je suis sûr qu'il y en a d'autres, mais ces 2 semblent plutôt spécifiques à setuid / sudo.

Gregg Leventhal
la source