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

9

Eu sei que a ativação do setuid em scripts tem problemas de segurança e, portanto, é inativa por padrão, mas espero que funcione para executáveis. Eu criei e executável que mostra o uid como saída, seguindo as instruções descritas neste post: Permitir setuid em scripts de shell

Mas ele retorna o mesmo uid (1000) antes e depois da execução sudo chmod +s ./setuid-test. Eu acho que isso significa que o setuid não tem nenhum efeito no meu executável, por que 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
Estudante de PHP
fonte
2
O executável pertence a um usuário que não seja o que você está executando? (setuid muda não quero raiz, que significa mudança para o usuário que possui o executável.)
CJM
PHPLearner Eu acho que você precisa envolver um grupo / usuário, a fim de mudar o SUID de um arquivo
ryekayo
@cjm me@me:~$ ls -la setuid-test---- retorna -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner
7
Seu programa funciona como esperado no meu sistema Ubuntu 14.04, se estiver no meu diretório pessoal, mas não quando estiver em / tmp, porque os parâmetros usados ​​para montar / tmp proíbem programas setuid. Onde está localizado o seu programa?
Mark Plotnick
2
Digite df .o diretório para encontrar o ponto de montagem mount | grep nameofmountpoint. Existe uma nosuidbandeira listada lá?
Mark Plotnick

Respostas:

10

A maioria dos sistemas de arquivos projetados para Unix / Linux pode ser montada com um nosuidatributo, o que impedirá que os binários setuid ou setgid localizados nesses sistemas de arquivos alterem o uid ou gid efetivo de um processo. É frequentemente 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 é do tipo ecryptfs, que, de acordo com o askubuntu: Erro ao executar o binário com o root setuid no diretório inicial criptografado, impõe o nosuid (e nodev) automaticamente, começando com as versões de alguns anos atrás.

Aqui está uma descrição do motivo da alteração, em https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :

Vincent Danen 2012-07-20 11:25:56 EDT
Foi relatado que o ecryptfs privado monta o auxiliar (/sbin/mount.ecryptfs_private), que é setuid-root, pode permitir que um usuário local não privilegiado monte compartilhamentos ecryptfs controlados pelo usuário no sistema local. Como o auxiliar ecryptfs não monta sistemas de arquivos com os sinalizadores "nosuid" e "nodev", seria possível para um usuário montar um sistema de arquivos contendo binários de raiz setuid e / ou arquivos de dispositivos que poderiam levar ao aumento de seus privilégios. Isso pode ser feito através de um dispositivo USB, se o usuário tiver acesso físico ao sistema.
...
Forçar MS_NOSUID e MS_NODEV montar sinalizadores foi adicionado à versão 99.

Mark Plotnick
fonte
Se o sistema permitir que um usuário monte um sistema de arquivos que permita setuid, seria trivial tornar-se root. 1) criar um executável 2) em outras posições chown root, chmod +s3) montar o 4) executar executável
ctrl-alt-Delor
1

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

sudo chown 0:0 ./setuid-test
hon
fonte
Claro, mas esse não é o problema. É possível ter um programa configurado para um usuário que não seja root. No cenário da pergunta, setuid-testdeve exibir nobodyo UID.
Gilles 'SO- stop being evil'
@Gilles Você está certo. Espero que setuid-teste exibe nobody, nãoroot
PHP Learner
"O bit SetUID no executável permite executar o executável no proprietário do arquivo" e o proprietário do meu arquivo é nobody, portanto, espero 65534em troca, mas vejo 1000quem é o proprietário!
PHP Learner
2
Verifique as opções de montagem do sistema de arquivos no qual seu programa de teste é executado. Se estiver montado nosuid, seu programa não funcionará.
countermode
1
@countermode @MarkPlotnick mount | grep /home/meretorna /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