Por que consegui excluir um arquivo pertencente à raiz no meu diretório pessoal sem ser raiz?

40

Então, eu estava fazendo alguma manutenção no meu servidor hoje cedo e percebi que era capaz de excluir um arquivo pertencente à raiz no meu diretório pessoal.

Consegui reproduzir uma amostra:

[cbennett@nova ~/temp]$ ls -al
total 8
drwxrwxr-x.  2 cbennett cbennett 4096 Oct  5 20:59 .
drwxr-xr-x. 22 cbennett cbennett 4096 Oct  5 20:58 ..
-rw-rw-r--.  1 cbennett cbennett    0 Oct  5 20:58 my-own-file
[cbennett@nova ~/temp]$ sudo touch file-owned-by-root
[cbennett@nova ~/temp]$ ls -al
total 8
drwxrwxr-x.  2 cbennett cbennett 4096 Oct  5 21:00 .
drwxr-xr-x. 22 cbennett cbennett 4096 Oct  5 20:58 ..
-rw-r--r--.  1 root     root        0 Oct  5 21:00 file-owned-by-root
-rw-rw-r--.  1 cbennett cbennett    0 Oct  5 20:58 my-own-file
[cbennett@nova ~/temp]$ rm file-owned-by-root
rm: remove write-protected regular empty file ‘file-owned-by-root’? y
[cbennett@nova ~/temp]$ ls -al
total 8
drwxrwxr-x.  2 cbennett cbennett 4096 Oct  5 21:00 .
drwxr-xr-x. 22 cbennett cbennett 4096 Oct  5 20:58 ..
-rw-rw-r--.  1 cbennett cbennett    0 Oct  5 20:58 my-own-file
[cbennett@nova ~/temp]$

Minha pergunta é como consegui excluir um arquivo pertencente ao root e com permissões -rw-r--r--enquanto eu não sou root?

Carl Bennett
fonte
6
Você pode remover a entrada no diretório que aponta para o arquivo porque você tem acesso de gravação ao diretório. Você não pode necessariamente excluir o arquivo; o arquivo pode ter outro link físico em outro lugar.
user253751
2
Extensão engraçada: você também pode renomear o arquivo ou criar links físicos.
peterh diz restabelecer Monica
11
Por favor, reconsidere sua escolha para a resposta aceita, porque a atual é totalmente enganosa: você não tem permissão para fazer nada com o conteúdo contido nas permissões do diretório .
Cthulhu #
@Cthulhu Done! Obrigado a todos por todos os comentários a estas perguntas e respostas, e definitivamente por muitas informações úteis aqui!
Carl Bennett

Respostas:

34

As permissões, o conteúdo e todos os atributos fazem parte do inode. O nome está na entrada do diretório. As permissões não são herdadas recursivamente (exceto quando você usa o padrão nas ACLs Posix).

Quando você exclui um arquivo, internamente você apenas remove um link físico da entrada do diretório para o inode. Quando todos os hardlinks forem removidos e o inode não estiver em uso, o sistema de arquivos recuperará o espaço. Você precisa apenas de permissão de gravação na pasta, independentemente das permissões definidas no arquivo (com exceção da permissão ext imutável). O mesmo para uma pasta vazia.

Quando você exclui uma pasta que não está vazia, precisa de permissão de gravação na pasta que está sendo excluída e em seu pai.

Mircea Vutcovici
fonte
11
Portanto, as permissões estão no inode ou as permissões estão no link para o inode, e estou apenas removendo esse link (e assim o único link para ele é removido, para que o inode deixe de existir)?
Carl Bennett
3
As permissões estão no inode. Isso é facilmente verificado, criando um link físico para um arquivo, alterando as permissões nele e verificando as permissões no original.
Wouter Verhelst
mas digamos que exista um diretório e um arquivo, ambos pertencentes à raiz, sendo o diretório em um diretório de propriedade do usuário. Você não seria capaz de removê-los, certo?
Njzk2
11
É um atributo específico para ext2, ext3 e ext4. Exemplo: sudo touch test_file;sudo chattr +i test_file;rm -f test_fileVeja:man chattr
Mircea Vutcovici
11
O atributo imutável protege um arquivo para qualquer alteração, mesmo a partir da raiz.
Mircea Vutcovici
19

Quando você é o proprietário do diretório, você tem permissão para fazer qualquer coisa com ele e seu conteúdo com base nas permissões do diretório. Portanto, apesar de não possuir o arquivo, você ainda pôde excluí-lo porque tinha permissão de leitura / gravação no diretório em que o arquivo residia.

inetknght
fonte
46
Não exatamente. Por exemplo, o OP não poderia modificar esse arquivo de propriedade raiz. O fato é que excluir um arquivo não é considerado uma operação no arquivo, mas no diretório (removendo o ponteiro para um arquivo) e é por isso que as permissões no diretório são importantes.
Cthulhu #
11
@Cthulhu, então você pode excluir um arquivo de propriedade raiz e criar um novo modificado com o mesmo nome depois?
KDEx
3
@Orgoroth Sim, você poderia, mas isso não seria mais o mesmo arquivo. Para outro exemplo (talvez mais óbvio), você não seria capaz de ler o arquivo em seu diretório se ele pertencesse à raiz e apenas seu proprietário pudesse lê-lo.
Cthulhu
@inetknght Isso deve ser esclarecido. Entendo que você está tentando se referir à manipulação dos próprios arquivos, como entidades, mas isso não está claro. Você não pode modificar seu conteúdo, por exemplo. E você não menciona atributos que podem superar as permissões de diretório.
Mike S
11
@captcha Isso ocorre porque visalva o arquivo primeiro na cópia temporária, exclui o arquivo original e renomeia a cópia para o original (ou algo parecido).
Cthulhu