Bit SetUID não está funcionando no Ubuntu?

8

Suponho que um arquivo executável com o conjunto de bits SetUID esteja em execução como proprietário, mas não consigo reproduzi-lo. Eu tentei o seguinte.

$ cat prepare.sh
cp / bin / bash.
chown root.root bash
chmod 4770 bash # Verificado
$ sudo sh prepare.sh
$ ./bash
$ id -u
1000
$ exit
$
$ cat test.c
#include <stdio.h>
#include <unistd.h>
int main () {
    printf ("% d,% d \ n", getuid (), geteuid ());
    retornar 0;
}
$ gcc -o test test.c
$ chmod 4770 test # Verificado
Teste de root.root do $ sudo chown
$ ./test
1000.1000
$ # Por que ???

Contudo

$ su
# ./bash
# id -u
0 0
# ./teste
0,0
# Saída
# Saída
$

Nota: O ponto de montagem não tem nosuidnem está noexecdefinido.
Alguém pode explicar por que não está funcionando no Ubuntu 16.04 LTS?

iBug
fonte
3
Possível duplicado de Permitir setuid em scripts shell
Kusalananda
3
@Kusalananda não é um script.
enzotib
4
O script é um pouco confuso, mas é apenas um arenque vermelho. Suponho que existe para salvar dois usos de sudo? Há um erro ou erro de digitação, no entanto, chmodestá faltando um nome de arquivo.
Ilkkachu

Respostas:

15

Para o executável compilado, de man 2 chown:

When the owner or group  of  an  executable  file  are  changed  by  an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared.  POSIX
does not specify whether this also should happen  when  root  does  the
chown();  the Linux behavior depends on the kernel version.

Inverter a ordem chowne chmodfunciona para mim:

$ sudo chmod 4770 foo
$ sudo chown root:root foo
$ stat foo
  File: 'foo'
  Size: 8712        Blocks: 24         IO Block: 4096   regular file
Device: 801h/2049d  Inode: 967977      Links: 1
Access: (0770/-rwxrwx---)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-04-18 15:15:15.074425000 +0900
Modify: 2017-04-18 15:15:15.074425000 +0900
Change: 2017-04-18 15:15:33.683725000 +0900
 Birth: -
$ sudo chmod 4777 foo
$ ./foo
1000,0
muru
fonte
15

No seu primeiro caso, é o Bash que não gosta de ser executado como setuid.

Se o Bash for iniciado com o ID do usuário (grupo) efetivo não igual ao ID do usuário real (grupo), ... e o ID do usuário efetivo estiver definido como o ID do usuário real.

Veja: Manual do Bash sobre arquivos de inicialização , também o Setuid bit parece não ter efeito no bash .

No segundo caso, é a ordem de chmode chownisso importa, como muru já respondeu . Alterar o proprietário redefine o bit setuid.

ilkkachu
fonte
Ah, eu não percebi que o OP estava usando a configuração de script em um setuid bash.
Muni
5

Também pode ser que o sistema de arquivos que contém o executável de teste tenha sido montado com a nosuidopção ; Ouvi dizer que distribuições mais recentes farão isso por padrão para /tmp, e existem bons argumentos para aplicá-lo /hometambém. nosuidfaz com que o kernel ignore os bits setuid e setgid em todos os executáveis ​​no sistema de arquivos. (A coisa não relacionada que acontece quando você cria um diretório setgid não é afetada.)

zwol
fonte