GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi utiliser Setuid() dans les programmes Suid ?

Je me demande qu'un programme SUID comme passwd utilise le setuid() appel de fonction. Pourquoi supprime-t-il les privilèges root ?

Contre quels types d'attaques cela aide-t-il ? Débordement de tampon ?

Réponse acceptée :

Je vais d'abord discuter du bit setuid, que passwd utilise et est distinct du setuid() appel système (que passwd n'utilise pas). Il y a peut-être une certaine confusion dans la question à cet égard.

Ce n'est pas une protection contre un débordement de buffer, c'est vulnérable à tel, ou fondamentalement tout ce qui permettrait à un attaquant d'utiliser un processus privilégié à des fins néfastes et involontaires. C'est parce que le bit setuid est l'opposé de "l'abandon des privilèges" ; il accorde privilèges root, mais uniquement pour le processus et non l'utilisateur réel. Cela inclut passwd .

Cette forme de setuid nécessite que le bit setuid du système de fichiers soit défini sur l'exécutable; passwd a ceci parce qu'il a besoin de privilèges pour lire et écrire /etc/passwd . Cependant, nous espérons que passwd n'a pas de vulnérabilités de sécurité connues (par exemple, un potentiel exploit de débordement) qui permettraient à une personne malveillante de lui faire faire autre chose que de lire et d'écrire /etc/passwd (et autre que de le faire correctement !), puisque il s'exécute en tant que root, et donc pourrait faire n'importe quoi - sauf qu'il est conçu pour faire une seule chose spécifique, et qu'il doit faire autre chose devrait (encore une fois, espérons-le) être impossible.

Donc utiliser setuid dans ce sens n'est pas une protection contre quoi que ce soit , mais il est souvent discuté en relation avec les vulnérabilités car les vulnérabilités potentielles sont des exécutables WRT setuid très importants.

MAIS :le bit setuid définit l'euid et non l'uid réel, il est donc en fait parallèle au seteuid() appel système et pas setuid() .

Il existe une forme opposée de "setuid" qui consiste à supprimer des privilèges, ce qui implique le véritable setuid() appel système et ne nécessite pas le bit setuid. C'est lorsqu'un processus s'exécutant en tant que root (parce que root ou sudo l'a démarré) change son uid en un utilisateur moins privilégié. Les serveurs et les démons le font souvent s'ils ont besoin des privilèges root au démarrage (par exemple, pour ouvrir un port privilégié) mais pas par la suite. De cette façon, si le serveur est ensuite piraté, il n'a pas de privilèges de superutilisateur. Vous ne pouvez pas appeler setuid(0) et récupérer les privilèges root (mais vous pouvez avec set*e *uid).

Connexes :Objectif principal de FOREIGN KEY ?
Linux
  1. Le but d'utiliser un Fifo Vs un fichier temporaire ou un tuyau ?

  2. Utiliser correctement le bit Setuid ?

  3. Auto-complétion Git ?

  4. Utilisation des journaux du serveur

  5. Utiliser <linux/types.h> dans les programmes utilisateur, ou <stdint.h> dans le code du module de pilote... est-ce important ?

Redirection 301 avec NGINX

Comment supprimer des programmes installés à partir de la source à l'aide de GNU Stow sous Linux

Comment formater des programmes Shell à l'aide de Shfmt sous Linux

Conseils d'utilisation de l'écran

Comment installer des programmes Windows sur Debian à l'aide de PlayOnLinux

Utiliser Runit sur Devuan