Por que um usuário normal não pode chown um arquivo?

75

Por que o chowncomando é somente raiz? Por que os usuários não raiz não podem usar o chown para distribuir os arquivos que possuem?

fleg
fonte
não consigo entender sua pergunta O comando chown também pode ser usado por usuários não root
harish.venkat
Talvez eu tenha errado. Bem, a pergunta exata do meu professor foi: "Por que a transferência de direitos de um usuário normal não é permitida em sistemas UNIX?" ...
phleg
19
Penso que a verdadeira questão é: por que os usuários não-root não podem usar chownpara doar os arquivos que possuem? (Eu sistemas onde, dependendo da configuração do sistema de arquivos visto, você pode.)
Keith Thompson
related: askubuntu.com/questions/95985/…
Ciro Santilli escreveu:

Respostas:

96

A maioria dos sistemas unix impede que os usuários “entreguem” arquivos, ou seja, os usuários só podem executar chownse tiverem os privilégios de usuário e grupo de destino. Como o uso chownrequer a propriedade do arquivo ou a raiz (os usuários nunca podem se apropriar dos arquivos de outros usuários), somente o root pode executar chownpara alterar o proprietário de um arquivo para outro usuário.

O motivo dessa restrição é que a distribuição de um arquivo a outro usuário pode permitir que coisas ruins aconteçam em situações incomuns, mas ainda importantes. Por exemplo:

  • Se um sistema tiver cotas de disco ativadas, Alice poderá criar um arquivo gravável em mundo em um diretório acessível apenas por ela (para que ninguém mais possa acessar esse arquivo gravável em mundo) e, em seguida, executar chownpara tornar esse arquivo pertencente a outro usuário Bill. O arquivo será contado na cota de disco de Bill, embora apenas Alice possa usá-lo.
  • Se Alice distribuir um arquivo para Bill, não há vestígios de que Bill não criou esse arquivo. Isso pode ser um problema se o arquivo contiver dados ilegais ou comprometedores.
  • Alguns programas exigem que seu arquivo de entrada pertença a um usuário específico para autenticar uma solicitação (por exemplo, o arquivo contém algumas instruções que o programa executará em nome desse usuário). Geralmente, esse não é um design seguro, porque, mesmo que Bill tenha criado um arquivo contendo instruções sintaticamente corretas, ele pode não ter a intenção de executá-las nesse momento específico. No entanto, permitir que Alice crie um arquivo com conteúdo arbitrário e recebê-lo como entrada de Bill só pode piorar as coisas.
Gilles
fonte
3
Em um trabalho anterior, construí um sistema de software que dependia da incapacidade de doar arquivos. Ele usou a propriedade do arquivo para verificar se uma solicitação foi enviada por um usuário específico. Ele verificou, durante a instalação, se a entrega de arquivos era permitida e, em caso afirmativo, se recusou a continuar.
Keith Thompson
2
Outra questão mais crítica é que um usuário pode copiar /bin/bash, configurá-lo e depois chownpara quem quiser. Agora eles têm acesso ao shell como essa pessoa.
28413 Patrick
18
O @Patrick chownsempre limpa os bits setuid e setgid.
Gilles
1
@Gilles e por uma boa razão ... se você puder copiar um binário do shell em algum lugar, poderá acessá-lo, defina os bits setuid / gid nele e incline-o na raiz (ou em qualquer ordem que o obtenha 6755/0: 0 perms / posse), você pode obter raiz nesse sistema. Oh, perdi o comentário de Patrick, exatamente.
hanetzer
Ok, mas se eu possuo o dir ( drwxr-xr-x ring0 ring0 .) no qual o root tem um arquivo regular ( -rw-r--r-- root root file), por que não posso fazer, chown ring0 filepois, de qualquer maneira, é permitido fazer isso, como ring0, cp file x ; rm file ; mv x file(e alguns opcionais touch sometime file...)?
Anel Ø
15

No Linux, você precisa do recurso CAP_CHOWN para exibir. raiz é concedida tal. Consulte: http://vouters.dyndns.org/tima/Linux-OpenVMS-C-Implementing_chown.html para obter explicações. Se você pretende fornecer o recurso CAP_CHOWN, construa seu código com libcap-ng ou libcap, conforme demonstrado por: http://vouters.dyndns.org/tima/Linux-PAM-C-Pluggable_Authentication_Modules_programming_example.html onde você deve substituir CAP_AUDIT_WRITE com CAP_CHOWN.

user1910461
fonte
1
+1 para você não precisar ser root. Porque você não precisa mais se enraizar.
Ctrl-alt-delor
1
Às vezes, você nem precisa de CAP_CHOWN: unix.stackexchange.com/questions/399975/… Na minha leitura da fonte do kernel, cada implementação do sistema de arquivos é encarregada de verificar as permissões de chown. E parece que, com o NFS, as permissões são verificadas no lado do servidor. E se o servidor é ... estranho ... então é possível.
Mike S
0

Você pode iniciar o comando, mas ele não funcionará se você não for root. É fácil: imagine um usuário que possa alterar um software para usuário root. Pode adicionar o bit setuid e, voilà, o cara é root! Portanto, o uso pode adicionar um pouco ao chmod, mas não há chance de alterar o proprietário dos arquivos.

Dom
fonte
12
Você não pode adicionar o bit setuid em um arquivo que você não possui, e implementações que permitem a distribuição de arquivos limpam o bit setuid.
Gilles
Acho que o ponto da resposta de Dom é o seguinte: imagine se você pudesse. Então haveria problemas. Seu argumento, que você não pode, está correto. Mas o OP está perguntando "por quê?" A limpeza do bit setuid é outro recurso de segurança que novamente sugere a pergunta "por quê?" A qual eu então me referiria à resposta de Dom: se um usuário pudesse chown e se um usuário pudesse setuid, essa combinação seria desastrosa. Eu acho que ele faz uma boa observação, mesmo que esteja perdendo um pouco.
Mike S