Background:
Li recentemente sobre um bug do freedesktop.org que permitia executar qualquer systemctl
comando para uid
> INT_MAX
. Assim corri:
root@host$> useradd -u 4000000000 largeuiduser
root@host$> su largeuiduser
largeuiduser@host$> systemctl ["whatever"]
[bug exists, and "whatever" gets executed]
largeuiduser@host$> exit
root@host$> userdel largeuiduser
Procurando uma maneira mais limpa que mais tarde encontrei
root@host$> setpriv --reuid 4000000000 systemctl ["whatever"]
[bug exists, and "whatever" stuff gets executed]
Mostrando que para explorar o bug, não há necessidade de um nome de usuário (temporário). Também ficou claro que eu não tinha certeza sobre: quão essenciais são os nomes de usuário? .
Pergunta Minha pergunta, portanto, é. Quão dispensáveis são os nomes de usuário, da perspectiva do kernel (linux/posix)? Eles são necessários, eles podem ser usados?
A minha suspeita é que o nome de usuário é apenas uma espécie de "amenidade" usada exclusivamente no espaço do usuário.
Uma boa resposta seria tentar esclarecer isso, fornecendo informações sobre em quais configurações os nomes de usuário se tornam "necessários" e em quais configurações eles são "dispensáveis".
Nos mundos Linux e BSD, o kernel opera quase totalmente em termos de IDs numéricos de usuários e grupos. Existe uma biblioteca C padronizada que fornece acesso a um banco de dados de usuários , onde os nomes podem ser consultados a partir de IDs e vice-versa, que é como os softwares aplicativos obtêm de nomes fornecidos por humanos para os IDs necessários em chamadas de sistema e vice-versa. Credenciais de processo e entradas da lista de controle de acesso operam em termos de IDs.
A única exceção é a
setlogin()
função API (não padronizada) no mundo BSD, que opera em termos de uma string, um nome de usuário, em vez de um ID numérico de usuário. O kernel não coloca nenhuma interpretação sobre essa string, no entanto.Poder -se-ia escrever programas aplicativos que operassem inteiramente em termos de IDs numéricos, apresentando-os a seres humanos. Mas não é assim que a maioria dos softwares são escritos, pela simples razão de que os seres humanos trabalham melhor com contas que são nomeadas .
O kernel também não tem noção de contas inexistentes. Todos os IDs (exceto alguns valores reservados) são válidos no que diz respeito ao kernel. Você poderia (como o superusuário) iniciar um processo rodando como UID 24394 e criar objetos de sistema de arquivos pertencentes a esse UID (em lugares onde ele tem permissão, é claro), e o kernel não reclamaria.
O bug do PolicyKit não é realmente sobre UIDs, observe. Trata-se de um programa chamado
… e o mecanismo de autorização não abre em vez de fechar em tais circunstâncias, retornando que o usuário está autorizado no Desktop Bus.pkttyagent
abending…Leitura adicional
getpwnam()
. Interfaces do Sistema . Especificação única do UNIX. IEEE 1003.1. 2018. O Grupo Aberto.getpwuid()
. Interfaces do Sistema . Especificação única do UNIX. IEEE 1003.1. 2018. O Grupo Aberto.setlogin
. Guia de no . Programas.setuidgid
. Guia de no . Programas.