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
permissions
executable
setuid
Estudante de PHP
fonte
fonte
me@me:~$ ls -la setuid-test
---- retorna -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
df .
o diretório para encontrar o ponto de montagemmount | grep nameofmountpoint
. Existe umanosuid
bandeira listada lá?Respostas:
A maioria dos sistemas de arquivos projetados para Unix / Linux pode ser montada com um
nosuid
atributo, 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 :
fonte
chown root
,chmod +s
3) montar o 4) executar executávelO 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:
fonte
setuid-test
deve exibirnobody
o UID.nobody
, nãoroot
nobody
, portanto, espero65534
em troca, mas vejo1000
quem é o proprietário!nosuid
, seu programa não funcionará.mount | grep /home/me
retorna/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)