Um processo de superusuário pode alterar o ID do usuário real e o ID do grupo de um processo, não correspondendo aos do arquivo de senhas?

11

De APUE

O ID do usuário real e o ID do grupo real de um processo identificam quem realmente somos. Esses dois campos são retirados de nossa entrada no arquivo de senhas quando efetuamos login. Normalmente, esses valores não mudam durante uma sessão de login, embora existam maneiras de um processo de superusuário alterá-los

Um processo de superusuário pode alterar o ID do usuário real e o ID do grupo real de um processo, para que a relação entre o ID do usuário real e o ID do grupo real não corresponda aos do arquivo de senha? Por exemplo, se o usuário Timnão for um membro do grupo oceanpor um arquivo de senha, um processo de superusuário pode alterar o ID do usuário real e o ID do grupo real de um processo Time, oceanrespectivamente?

Tim
fonte
5
Um esclarecimento importante aqui: um processo em execução com privilégios de superusuário tem a capacidade de alterar seu próprio UID e GID, não os de outro processo.
filbranden
O banco de dados de informações do usuário é puramente userland O kernel se preocupa apenas com o UID e o GID, não com o banco de dados do usuário ou grupo.
炸鱼薯条德里克

Respostas:

15

Sim, um processo de superusuário pode alterar seu ID do usuário real e o ID do grupo real para qualquer valor que desejar. Os valores /etc/passwde /etc/shadowsão a configuração para quais valores devem ser definidos, mas não uma limitação dos valores possíveis.

Editar # 1

Isso significa que programas como loginlerão os valores dos arquivos, portanto, os arquivos são arquivos de configuração ou arquivos de entrada. Eles não são restrições sobre o que um programa pode fazer. Um processo de superusuário pode passar qualquer valor para o kernel, e o kernel não verifica nenhum arquivo.

Um programa poderia chamar

setgid (54321);
setuid (12345);

e isso funcionaria, mesmo que nenhum dos IDs seja mencionado em qualquer arquivo.

RalfFriedl
fonte
9

O arquivo de senha e o arquivo de grupo não são lidos, eles são lidos apenas pelo processo de login, para definir o ID do usuário real e o ID do grupo real.

Não há nada no kernel mencionando esses arquivos. O login deve abrir os arquivos, processá-los e definir os dois IDs. Poderia ser escrito de forma diferente para obter esses IDs de outro lugar. Por exemplo, de um banco de dados em rede.

Qualquer processo com capacidade CAP_SETUID pode definir esses IDs, a raiz possui essa capacidade.

O modelo de segurança no Unix é parte implementada no kernel e parte implementada em processos executados com recursos elevados (por exemplo, como root).


Note-se que /etc/passwde /etc/grouptambém são lidos por ls, pse qualquer outro programa que precisa traduzir nomes de usuário / grupo de / para IDs de usuário / grupo. (Eles podem fazer isso através de uma biblioteca, do que sabem sobre métodos alternativos de armazenamento desses detalhes.)

ctrl-alt-delor
fonte
1
Eles ( /etc/passwd, /etc/groups) também são lidos por processos que desejam mostrar ou processar nomes de usuário em vez dos IDs numéricos internos, por exemplo, pse ls.
Jonas Schäfer
3

Entre outras coisas, o objetivo /etc/passwdé converter o nome de um usuário no UID do usuário . Se você não se importa com o que é o UID de bob, não precisa desse arquivo. Se você deseja apenas mudar para um UID / GID arbitrário, use os syscalls relevantes:

int setuid(uid_t uid);
int setgid(gid_t gid);

Observe que um processo privilegiado com os recursosCAP_SETUID e (que geralmente possui um processo raiz) só pode alterar seu próprio UID e GID, não o de outro processo em execução.CAP_SETGID

floresta
fonte