Por que o setuid não funciona no executável?

9

Sei que habilitar o setuid em scripts tem problemas de segurança e, portanto, fica inativo por padrão, mas espera que funcione para executáveis. Eu criei e executável que mostra uid como uma saída seguindo as instruções descritas neste post: Allow setuid on scripts de shell

Mas retorna o mesmo uid (1000) antes e depois de executar sudo chmod +s ./setuid-test . Eu acho que isso significa que o setuid não tem nenhum efeito no meu executável, porque e como resolver?

O código-fonte:

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

Construído e executado com

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

Ao executar ls -la , é isso que recebo:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
    
por PHP Learner 19.08.2014 / 16:59

2 respostas

10

A maioria dos sistemas de arquivos projetados para Unix / Linux pode ser montada com um atributo nosuid , o que evitará que binários setuid ou setgid localizados nesses sistemas de arquivos alterem o uid ou gid eficaz de um processo. É freqüentemente usado na montagem de sistemas de arquivos "não confiáveis", aqueles que estão sob o controle de um não administrador.

No seu caso, o sistema de arquivos que você está usando é o tipo ecryptfs, que de acordo com askubuntu: Erro ao executar o binário com root setuid sob O diretório inicial criptografado reforça os nosuid (e nodev) automaticamente, iniciando com as versões de alguns anos atrás.

Aqui está uma descrição do motivo da mudança, do link :

Vincent Danen 2012-07-20 11:25:56 EDT
It was reported that the private ecryptfs mount helper (/sbin/mount.ecryptfs_private), which is setuid-root, could allow an unprivileged local user to mount user-controlled ecryptfs shares on the local system. Because the ecryptfs helper does not mount filesystems with the "nosuid" and "nodev" flags, it would be possible for a user to mount a filesystem containing setuid-root binaries and/or device files that could lead to the escalation of their privileges. This could be done via a USB device, if the user had physical access to the system.
...
Forcing MS_NOSUID and MS_NODEV mount flags was added to version 99 .

    
por 20.08.2014 / 20:37
1

SetUID bit no executável permite executar o executável no arquivo proprietário (não superusuário). Para poder executar o executável como root, execute:

sudo chown 0:0 ./setuid-test
    
por 19.08.2014 / 17:09