Solicitando senha sudo em um binário de raiz setuid

1

Eu tenho um binário de raiz setuid, with_sudo.bin , com o seguinte código-fonte:

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

int main() {
    printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
    system("/usr/bin/sudo cat /root/key.txt");
    return 0;
}

akshay@bluebox ~ $ ls -l with_sudo.bin
-rwsr-sr-x 1 root root 8684 Feb  1 22:09 with_sudo.bin

Apesar de ser um binário de root setuid, uma senha sudo está sendo perguntada.

akshay@bluebox ~ $ ./with_sudo.bin
ruid : 1000  euid : 0 
[sudo] password for akshay:

Quando executo o outro binário sem sudo em system() , ele é executado com privilégios de superusuário.

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

int main() {
    printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
    system("cat /root/key.txt");
    return 0;
}

akshay@bluebox ~ $ ls -l without_sudo.bin
-rwsr-sr-x 1 root root 8677 Feb  1 22:09 without_sudo.bin

akshay@bluebox ~ $ ./without_sudo.bin

ruid : 1000 euid : 0

:::this_is_a_secret_key:::

Quando o Real UID foi feito 0 junto com Effective UID usando setreuid(geteuid(), 0); , o binário foi executado com privilégios de superusuário sem solicitar a senha sudo, embora sudo tenha sido usado.

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

int main() {
    setreuid(0, geteuid());
    printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
    system("/usr/bin/sudo cat /root/key.txt");
    return 0;
}

Eu tenho read que EUID é usado para avaliar os privilégios do processo para executar uma ação específica. Então, por que é que sudo solicita a senha sudo com base no RUID , mesmo quando EUID é 0 ?

    
por Akshay Krishnan R 01.02.2015 / 18:23

1 resposta

3

É um pouco complicado. O sistema operacional kernel usa o UID e o GID efetivos de um processo determinar seus privilégios / autorizações; eles são usados para

  • permitindo / desaprovando operações comuns do sistema de arquivos (por exemplo, abrir, vincular / desvincular) com base nas regras de usuário / grupo / outras,
  • definindo a propriedade dos arquivos recém-criados,
  • determinar quais outros processos um processo pode enviar sinais para e
  • decidindo se um processo pode montar e desmontar sistemas de arquivos, altere a data, desligar o sistema, etc.

e provavelmente outras coisas. Mas, o problema é que quando um programa precisa tomar algum tipo de decisão de acesso / autorização, geralmente precisa usar o UID e o GID reais. Considere: quando seu programa with_sudo.c executar sudo , o UID efetivo é raiz (0) e o UID real é você (1000), conforme demonstrado pelo seu printf . Mas isso é exatamente o mesmo que acontece se você executar sudo de um shell sem privilégios. Sempre que sudo é executado, o UID efetivo é 0 - então sudo não pode usar isso para decidir como se comportar. Tem que usar o UID real para descobrir quem você realmente é para determinar o que você pode fazer em sudo . Somente se o UID real for 0, o sudo concluirá que você é "realmente" root, ou pelo menos que não possa determinar confiavelmente sua identidade real, então não sabe quais restrições aplicar a você, e apenas executa o cat sem pedir nenhuma autenticação adicional de você.

    
por 01.02.2015 / 22:41