O bit Setuid parece não ter efeito no bash

O bit Setuid parece não ter efeito no bash

Eu estava experimentando um pouco e percebi 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 como /roote quando executei o whoamicomando de bash-test, meu nome de usuário não foi relatado como sendo root, sugerindo que bash-testnão estava sendo executado como root. No entanto, se eu definir o bit setuid como ativado whoami, fui relatado como root em qualquer shell, conforme esperado.

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

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

Responder1

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

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

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

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

No final: sem chance. Você tem que iniciar o bash com UID root (ou seja, sudo).

Editar 1

A página de 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, o SHELLOPTS As variáveis ​​, BASHOPTS, CDPATH e GLOBIGNORE, se aparecerem no ambiente, serão ignoradas e o ID do usuário efetivo será 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 é mencionado entre as opções de inicialização. Eu também tentei --posix; também não funcionou.

Responder2

Em qualquer caso, um programa raiz SUIDnãoroda com o ambiente do root ( $HOME, configuração do shell, qualquer que seja), ele roda com o rootpoderes(ou seja, pode excluir qualquer arquivo, alterar qualquer permissão, etc.).

informação relacionada