Pourquoi setuid ne fonctionne pas sur l'exécutable?

9

Je sais que l'activation de setuid sur les scripts pose des problèmes de sécurité et est donc inactive par défaut, mais attendez-vous à ce que cela fonctionne pour les exécutables. J'ai créé et exécutable qui affiche uid en sortie en suivant les instructions décrites dans ce post: Autoriser setuid sur les scripts shell

Mais il retourne le même uid (1000) avant et après l'exécution sudo chmod +s ./setuid-test. Je pense que cela signifie que setuid n'a aucun effet sur mon exécutable, pourquoi et comment le résoudre?

Le code source:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

Construit et exécuté avec

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

En courant ls -la, voici ce que j'obtiens:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
Apprenant PHP
la source
2
L'exécutable appartient-il à un utilisateur autre que celui sous lequel vous l'exécutez? (setuid ne signifie pas changer pour root; cela signifie changer pour l'utilisateur qui possède l'exécutable.)
cjm
PHPLearner Je pense que vous devez impliquer un groupe / utilisateur afin de changer le SUID d'un fichier
ryekayo
@cjm me@me:~$ ls -la setuid-test---- renvoie -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner
7
Votre programme fonctionne comme prévu sur mon système Ubuntu 14.04 s'il se trouve dans mon répertoire personnel, mais pas lorsqu'il se trouve dans / tmp, car les paramètres utilisés pour monter / tmp interdisent les programmes setuid. Où est situé votre programme?
Mark Plotnick
2
Tapez ensuite df .dans le répertoire pour trouver le point de montage mount | grep nameofmountpoint. Y a-t-il un nosuiddrapeau qui y figure?
Mark Plotnick

Réponses:

10

La plupart des systèmes de fichiers conçus pour Unix / Linux peuvent être montés avec un nosuidattribut, ce qui empêchera les binaires setuid ou setgid situés sur ces systèmes de fichiers de modifier l'uid ou le gid effectif d'un processus. Il est souvent utilisé lors du montage de systèmes de fichiers "non fiables", ceux qui sont sous le contrôle d'un non-administrateur.

Dans votre cas, le système de fichiers que vous utilisez est de type ecryptfs, qui selon askubuntu: Erreur lors de l'exécution de binaire avec root setuid sous le répertoire personnel chiffré applique automatiquement nosuid (et nodev), en commençant par les versions d'il y a quelques années.

Voici une description de la raison du changement, à partir de https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :

Vincent Danen 2012-07-20 11:25:56 EDT
Il a été signalé que l'assistant de montage ecryptfs privé (/sbin/mount.ecryptfs_private), qui est setuid-root, pourrait permettre à un utilisateur local non privilégié de monter des partages ecryptfs contrôlés par l'utilisateur sur le système local. Étant donné que l'aide ecryptfs ne monte pas de systèmes de fichiers avec les indicateurs "nosuid" et "nodev", il serait possible pour un utilisateur de monter un système de fichiers contenant des fichiers binaires setuid-root et / ou des fichiers de périphérique qui pourraient entraîner l'escalade de leurs privilèges. Cela pourrait être fait via un périphérique USB, si l'utilisateur avait un accès physique au système.
... Le
forçage des indicateurs de montage MS_NOSUID et MS_NODEV a été ajouté à la version 99.

Mark Plotnick
la source
Si le système permettait à un utilisateur de monter un système de fichiers qui autorise setuid, il serait trivial de devenir root. 1) créer un exécutable 2) ailleurs chown root, chmod +s3) le monter 4) exécuter l'exécutable
ctrl-alt-delor
1

Le bit SetUID sur l'exécutable permet d'exécuter l'exécutable sur le propriétaire du fichier (pas sur le superutilisateur). Pour pouvoir exécuter l'exécutable en tant que root, exécutez:

sudo chown 0:0 ./setuid-test
hon
la source
Bien sûr, mais ce n'est pas le problème. Il est possible d'avoir un programme défini pour un utilisateur autre que root. Dans le scénario de la question, setuid-testdevrait afficher nobodyl'UID de.
Gilles 'SO- arrête d'être méchant'
@Gilles Vous avez raison. Je m'attends à ce que le test setuid s'affiche nobody, pasroot
PHP Learner
"Le bit SetUID sur l'exécutable permet d'exécuter l'exécutable sur le propriétaire du fichier" et mon propriétaire de fichier l'est nobody, donc j'attends 65534en retour, mais je vois 1000qui est le propriétaire!
PHP Learner
2
Vérifiez les options de montage du système de fichiers sur lequel votre programme de test s'exécute. S'il est monté avec nosuid, alors votre programme ne peut pas fonctionner.
contre-mode
1
@countermode @MarkPlotnick mount | grep /home/merenvoie /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
PHP Learner