O bit setuid parece não ter efeito no bash

14

Eu estava experimentando um pouco e notei algo estranho: definir o bit setuid em uma cópia do bash localizada em /usr/bin/bash-testparecia não ter efeito. Quando executei uma instância de bash-test, meu diretório inicial não estava definido /roote, quando executei o whoamicomando bash-test, meu nome de usuário não foi relatado como sendo root, sugerindo que bash-testnão estava sendo executado como raiz. No entanto, se eu ativar o bit setuid whoami, fui relatado como sendo root em qualquer shell, conforme o esperado.

Tentei definir o bit setuid /usr/bin/bashtambém e observei o mesmo comportamento.

Por que o bash não está sendo executado como root quando eu defino o bit setuid? O selinux pode ter algo a ver com isso?


fonte
1
você encontra informações adicionais sobre o setuid nesta pergunta.
Anthon
Veja também Setuid Demystified por Chen, Dean e Wagner. É um papel antigo, mas ainda se aplica.

Respostas:

21

A explicação é meio irritante: o próprio bash é o motivo. straceé nosso amigo (deve ser o próprio root SUID para que isso funcione):

getuid()                                = 1000
getgid()                                = 1001
geteuid()                               = 0
getegid()                               = 1001
setuid(1000)                            = 0
setgid(1001)                            = 0

o bash detecta que foi iniciado o SUID root (UID! = EUID) e usa seu poder de raiz para jogar fora esse poder, redefinindo o EUID para o UID. E depois até o FSUID, só para ter certeza ...:

getuid()                                = 1000
setfsuid(1000)                          = 1000
getgid()                                = 1001
setfsgid(1001)                          = 1001

No final: sem chance. Você precisa iniciar o bash com a raiz do UID (ou seja, sudo).

Editar 1

A página do manual diz o seguinte:

Se o shell for iniciado com o ID do usuário (grupo) efetivo diferente do ID do usuário (grupo) real e a opção -p não for fornecida, nenhum arquivo de inicialização será lido, as funções do shell não serão herdadas do ambiente, os SHELLOPTS As variáveis ​​BASHOPTS, CDPATH e GLOBIGNORE, se aparecerem no ambiente, são ignoradas e o ID do usuário efetivo é definido como o ID do usuário real. Se a opção -p for fornecida na chamada, o comportamento de inicialização será o mesmo, mas o ID do usuário efetivo não será redefinido.

Mas isso não funciona para mim. -pnem sequer é mencionado entre as opções de inicialização. Eu também tentei --posix; também não funcionou.

Hauke ​​Laging
fonte
2

De qualquer forma, um programa raiz SUID não é executado com o ambiente raiz ($HOME configuração do shell, o que seja), é executado com poderes root (isto é, pode excluir qualquer arquivo, alterar permissões, etc.).

vonbrand
fonte