GNU/Linux >> Tutoriels Linux >  >> Linux

RealUID, UID enregistré, UID effectif. Que se passe-t-il?

Il y a deux cas,

  1. Vous souhaitez supprimer temporairement le privilège root lors de l'exécution du programme setuid
  2. Vous souhaitez supprimer définitivement le privilège root lors de l'exécution du programme setuid...
  • Vous pouvez le faire temporairement en définissant l'euid sur le véritable identifiant de l'utilisateur, puis en changeant l'uid en ce que vous voulez. Et plus tard, lorsque vous aurez besoin du privilège root, vous pourrez définir l'identifiant sur root et l'ID utilisateur effectif reviendra à root . Cela est dû au fait que l'ID utilisateur enregistré n'est pas modifié.
  • Vous pouvez supprimer définitivement le privilège en remplaçant immédiatement l'uid par un identifiant d'utilisateur moins privilégié. Après cela, quoi qu'il arrive, vous ne pourrez pas récupérer le privilège root.

Cas 1 :

Après le début de l'exécution d'un programme setuid

1.seteuid(600);
2.setuid(1000);
3.setuid(0);

Dans ce cas, le privilège root peut être récupéré à nouveau.

              +----+------+------------+
              | uid|euid  |saved-uid   |
              |----|------|------------|
            1.|1000| 0    | 0          |
            2.|1000| 600  | 0          |
            3.|1000| 1000 | 0          |
            4.|1000|  0   | 0          |
              |    |      |            |
              +------------------------+

Cas 2 :

Après le début de l'exécution d'un programme setuid ,

1.setuid(1000);
2.setuid(0);



               +----+------+------------+
               | uid|euid  |saved-uid   |
               |----|------|------------|
             1.|1000|0     | 0          |
             2.|1000|1000  | 1000       |
               |    |      |            |
               +------------------------+

Dans ce cas, vous ne pouvez pas récupérer le privilège root. Cela peut être vérifié par la commande suivante,

chat /proc/PROCID/task/PROCID/état | moins

Uid:    1000    0       0       0
Gid:    1000    0       0       0

Cette commande affichera un Uid et un Gid et elle aura 4 champs (les trois premiers champs sont ceux qui nous concernent). Quelque chose comme ci-dessus

Les trois champs représentent uid, euid et save-user-id. Vous pouvez introduire une pause (une entrée de l'utilisateur) dans votre programme setuid et vérifier pour chaque étape le cat /proc/PROCID/task/PROCID/status | less commande. Au cours de chaque étape, vous pouvez vérifier que l'uid enregistré est modifié comme mentionné.

Si votre euid est root et que vous modifiez l'uid, les privilèges sont définitivement supprimés. Si l'ID utilisateur effectif n'est pas root, l'ID utilisateur enregistré n'est jamais touché et vous pouvez retrouver le privilège root à tout moment. dans votre programme.


DESCRIPTION setuid() définit l'ID utilisateur effectif du processus appelant. Si l'UID effectif de l'appelant est root, l'UID réel et l'ID utilisateur 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 d'utilisateur, d'effectuer des tâches non privilégiées, puis de réengager l'ID utilisateur effectif d'origine de manière sécurisée.

Si l'utilisateur est root ou si 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 cela, il est impossible pour le programme de retrouver les privilèges root.

Ainsi, un programme set-user-ID-root souhaitant supprimer temporairement les privilèges root, prendre l'identité d'un utilisateur non privilégié, puis récupérer les privilèges root par la suite ne peut pas utiliser setuid(). Vous pouvez accomplir cela avec seteuid(2).

(tiré du Manuel des programmeurs Linux, 2014-09-21, page setuid.2 )


Ô ! Ces fonctions sont difficiles à utiliser correctement.

La page de manuel indique que setuid changera l'UID réel, enregistré et effectif. Ainsi, après l'appel setuid(1000), tous les trois passent à 1000.

C'est le cas si et seulement si vous êtes euid 0. Au moment où vous appelez setuid(0) , cependant, vous êtes euid 1000 et sauvé uid 0 (vérifier getresuid(2) , par exemple). C'est pourquoi vous pouvez récupérer des privilèges.


Linux
  1. Qu'est-ce qu'un utilisateur Linux ?

  2. Utiliser correctement le bit Setuid ?

  3. Qu'est-ce que Echo $ ? Faire??

  4. Qu'est-ce qu'un certificat SSL ?

  5. Qu'est-ce que ioremap()

Qu'est-ce que SFTP ?

Qu'est-ce que l'UID sous Linux, comment le trouver et le modifier

Qu'est-ce qui arrive dans GNOME 42 ?

Qu'est-ce que l'analphabétisme numérique ?

Qu'est-ce que Termux sur Android ?

Que faut-il pour passer d'un Ethernet unique à plusieurs ?