Perché setuid non funziona sull'eseguibile?


9

So che abilitare setuid su script ha problemi di sicurezza e quindi è inattivo per impostazione predefinita, ma mi aspetto che funzioni per eseguibili. Ho creato ed eseguibile che mostra uid come output seguendo le istruzioni descritte in questo post: Consenti setuid su script shell

Ma restituisce lo stesso uid (1000) sia prima che dopo l'esecuzione sudo chmod +s ./setuid-test. Penso che questo significhi che setuid non ha alcun effetto sul mio eseguibile, perché e come risolverlo?

Il codice sorgente:

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

Costruito e gestito con

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

Quando corro ls -la, questo è quello che ottengo:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test

2
L'eseguibile è di proprietà di un utente diverso da quello su cui lo stai eseguendo? (setuid non significa cambiare in root; significa cambiare all'utente che possiede l'eseguibile.)
cjm

PHPLearner Penso che sia necessario coinvolgere un gruppo / utente per modificare il SUID di un file
ryekayo

@cjm me@me:~$ ls -la setuid-test---- restituisce -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP

7
Il tuo programma funziona come previsto sul mio sistema Ubuntu 14.04 se è nella mia directory home, ma non quando è in / tmp, perché i parametri usati per montare / tmp vietano i programmi setuid. Dove si trova il tuo programma?
Mark Plotnick,

2
Digita df .la directory per trovare il punto di montaggio, quindi mount | grep nameofmountpoint. C'è una nosuidbandiera elencata lì?
Mark Plotnick,

Risposte:


10

La maggior parte dei filesystem progettati per Unix / Linux possono essere montati con un nosuidattributo, che impedirà ai binari setuid o setgid situati su quei filesystem di alterare l'effettivo uid o gid di un processo. Viene spesso utilizzato quando si montano filesystem "non attendibili", quelli che sono sotto il controllo di un non amministratore.

Nel tuo caso, il filesystem che stai usando è di tipo ecryptfs, che secondo askubuntu: Errore quando si esegue binario con setuid root sotto home directory crittografata impone automaticamente nosuid (e nodev), a partire dalle versioni di qualche anno fa.

Ecco una descrizione del motivo della modifica, da https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :

Vincent Danen 20/07/2012 11:25:56 EDT
È stato riferito che l'helper privato mount ecryptfs (/sbin/mount.ecryptfs_private), che è setuid-root, potrebbe consentire a un utente locale senza privilegi di montare condivisioni ecryptfs controllate dall'utente sul sistema locale. Poiché l'helper ecryptfs non monta filesystem con i flag "nosuid" e "nodev", sarebbe possibile per un utente montare un filesystem contenente binari setuid-root e / o file di dispositivi che potrebbero portare all'escalation dei loro privilegi. Questo potrebbe essere fatto tramite un dispositivo USB, se l'utente avesse accesso fisico al sistema.
... La
forzatura dei flag di montaggio MS_NOSUID e MS_NODEV è stata aggiunta alla versione 99.


Se il sistema permettesse a un utente di montare un file system che consente a setuid, allora sarebbe banale diventare root. 1) crea un eseguibile 2) altrove chown root, chmod +s3)
montalo

1

Il bit SetUID sull'eseguibile consente di eseguire eseguibile presso il proprietario del file (non superutente). Per poter eseguire eseguibile come root, eseguire:

sudo chown 0:0 ./setuid-test

Certo, ma non è questo il problema. È possibile avere un programma impostato su un utente diverso da root. Nello scenario nella domanda, setuid-testdovrebbe visualizzare nobodyl'UID.
Gilles 'SO- smetti di essere cattivo' il

@Gilles Hai ragione. Mi aspetto che il test del setuid nobodyvenga visualizzato , nonroot
PHP Learner,

"Il bit SetUID sull'eseguibile consente di eseguire eseguibile presso il proprietario del file" e il mio proprietario del file è nobody, quindi mi aspetto 65534in cambio, ma vedo 1000chiunque sia il proprietario!
Studente PHP,

2
Controlla le opzioni di mount del filesystem su cui viene eseguito il tuo programma di test. Se è montato con nosuid, quindi il tuo programma potrebbe non funzionare.
Contromodalità

1
@countermode @MarkPlotnick mount | grep /home/meritorna /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)
Studente PHP il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.