Por que um arquivo com 400 permissões pode ser gravado por root, mas somente leitura pelo usuário?

9

Se eu criar um arquivo como um usuário sem privilégios e alterar o modo de permissões para 400 , ele será visto por esse usuário como somente leitura, corretamente:

$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro

Tudo está bem.

Mas, em seguida, vem o root:

# [ -w somefile ] && echo rw || echo ro
rw

Que diabos? Claro, o root pode gravar em arquivos somente para leitura, mas não deve se habituar a isso: o Best Practice tenderia a ditar que eu deveria ser capaz de testar o bit de permissão de gravação e, se não, ele foi definido assim por um motivo.

Acho que quero entender os dois por que isso está acontecendo, e como posso obter um código de retorno falso ao testar um arquivo que não tem o conjunto de bits de gravação?

    
por Rich 03.05.2018 / 03:51

3 respostas

26

test -w aka [ -w não verifica o modo de arquivo. Ele verifica se é gravável. Para raiz, é.

$ help test | grep '\-w'
  -w FILE        True if the file is writable by you.

A maneira que eu testaria seria fazer uma comparação bitwise com a saída de stat(1) (" %a Direitos de acesso em octal").

(( 0$(stat -c %a somefile) & 0200 )) && echo rw || echo ro

Observe que o subshell $(...) precisa de um 0 prefixado para que a saída de stat seja interpretada como octal por (( ... )) .

    
por 03.05.2018 / 04:04
30

Acho que você entendeu mal o que o -w faz. Ele não verifica se o arquivo tem "permissões de gravação", ele verifica se o arquivo é gravável pelo usuário invocando .

Mais especificamente, chama access(2) ou similar.

por exemplo, se um script tiver if [ -w /etc/shadow ] , se você executar strace no script, poderá ver uma linha semelhante a

faccessat(AT_FDCWD, "/etc/shadow", W_OK)

Como root pode gravar no arquivo, ele retorna 0.

por exemplo, como usuário normal:

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = -1 EACCES (Permission denied)

Como root

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = 0

Isso, apesar do fato de que /etc/shadow tem permissão 000 na minha máquina.

---------- 1 root root 4599 Jan 29 20:08 /etc/shadow

Agora, o que você quer fazer é interessante e não é tão simples.

Se você quiser verificar as permissões simples, verifique a ls output ou ligue para stat ou similar. Mas perceba que as ACLs podem ignorar essas permissões. Só porque um arquivo é permissão 400 não impede que ele seja gravável ...

    
por 03.05.2018 / 04:04
1

O usuário root pode fazer o que lhe agrada, as permissões de arquivo "normais" não são limitantes. Ele não executará diretamente um arquivo simples sem qualquer permissão de eXecute, apenas para um pouco de seguro contra a prática de alvo de pé.

    
por 03.05.2018 / 13:35