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).