O bit SUID não funciona para executáveis no diretório / tmp

4

Imprimir o valor de getuid () e geteuid () de um executável com o bit SUID (chmod + s) ligado, parece resultar com o ID do chamador original em vez do ID do proprietário se o executável for localizado dentro do diretório / tmp .

Ao compilar exatamente o mesmo código para o diretório inicial (e executar chmod + s), isso parece funcionar como esperado.

Pesquisei muito e não consegui encontrar nenhuma referência a esse comportamento.

Alguém sabe por que isso está acontecendo?

essa fonte é simples assim:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
    printf("%d\n%d\n", getuid(), geteuid());
    return 0;
}
    
por david 24.09.2014 / 20:40

1 resposta

4

Os executáveis setuid podem ser desativados nas opções de montagem do sistema de arquivos, a opção é chamada nosuid . Isso sempre é feito para sistemas de arquivos que podem ser montados por usuários não confiáveis (a opção user mount em /etc/fstab implica automaticamente nosuid ) ou cujo conteúdo pode ser modificado arbitrariamente por usuários não confiáveis, por exemplo, em mídia removível ou pela rede de máquinas que não são totalmente confiáveis. Às vezes também é feito para outros sistemas de arquivos.

Muitos sistemas usam tmpfs para /tmp : um sistema de arquivos cujo conteúdo permanece na memória e não é preservado em um reinicialize. (Um sistema de arquivos tmpfs pode ser mais rápido do que confiar no cache de disco porque não precisa se preocupar com a consistência dos dados.) Algumas configurações montam com a opção nosuid , porque geralmente não há nenhuma chamada para arquivos temporários setuid e ocasionalmente isso pode fazer parte de um vetor de ataque (arquivos setuid em /tmp não são um risco de segurança per se, mas desabilitá-los pode limitar o dano causado por algumas vulnerabilidades).

Você pode verificar as opções de montagem de um diretório pesquisando primeiro o ponto de montagem que o contém com df :

df /tmp/somefile

Em seguida, procure o ponto de montagem na saída de mount ou no Linux em /proc/mounts .

mount | awk '$3 == "/tmp"'
    
por 26.09.2014 / 03:32