Eu tenho o seguinte arquivo:
---------- 1 Steve Steve 341 2017-12-21 01:51 myFile.txt
Mudei o usuário para root
no terminal e notei os seguintes comportamentos:
Eu posso ler este arquivo e escrever nele.
Não consigo executar este arquivo.
Se eu definir o
x
bit nas permissões de usuário (---x------
) ou nas permissões de grupo (------x---
) ou nas outras permissões (---------x
) do arquivo, então eu seria capaz de executar este arquivo.
Alguém pode me explicar ou indicar um tutorial que explique todas as regras que se aplicam quando o root
usuário está lidando com arquivos e diretórios?
O acesso privilegiado a arquivos e diretórios é realmente determinado por capacidades, não apenas por ser
root
ou não. Na prática,root
geralmente tem todos os recursos possíveis, mas há situações em que todos/muitos deles podem ser descartados ou alguns dados a outros usuários (seus processos).Resumidamente, você já descreveu como as verificações de controle de acesso funcionam para um processo privilegiado. Veja como os diferentes recursos realmente o afetam:
A principal capacidade aqui é
CAP_DAC_OVERRIDE
, um processo que pode "ignorar a leitura, gravação e execução de verificações de permissão de arquivo". Isso inclui ler e escrever em qualquer arquivo, bem como ler, escrever e acessar diretórios.Na verdade, não se aplica à execução de arquivos que não estão marcados como executáveis. O comentário em
generic_permission
(fs/namei.c
), antes das verificações de acesso aos arquivos, diz queE o código verifica se há pelo menos um
x
bit definido se você estiver tentando executar o arquivo. Suspeito que seja apenas um recurso de conveniência, para evitar a execução acidental de arquivos de dados aleatórios e a obtenção de erros ou resultados estranhos.De qualquer forma, se você pode substituir as permissões, basta fazer uma cópia executável e executá-la. (Embora possa fazer diferença em teoria para arquivos setuid de um processo era capaz de substituir permissões de arquivo (
CAP_DAC_OVERRIDE
), mas não tinha outros recursos relacionados (CAP_FSETID
/CAP_FOWNER
/CAP_SETUID
). MasCAP_DAC_OVERRIDE
permitir edição/etc/shadow
e coisas assim, então é aproximadamente igual para apenas ter acesso root completo de qualquer maneira.)Há também a
CAP_DAC_READ_SEARCH
capacidade que permite ler qualquer arquivo e acessar qualquer diretório, mas não executar ou escrever neles; eCAP_FOWNER
isso permite que um processo faça coisas que geralmente são reservadas apenas para o proprietário do arquivo, como alterar os bits de permissão e o grupo de arquivos.Substituir o sticky bit em diretórios é mencionado apenas em
CAP_FOWNER
, então parece queCAP_DAC_OVERRIDE
não seria suficiente ignorar isso. (Isso lhe daria permissão de gravação, mas geralmente em diretórios fixos você tem isso de qualquer maneira e os+t
limita.)(Acho que dispositivos especiais contam como "arquivos" aqui. Pelo menos
generic_permission()
só tem uma verificação de tipo para diretórios, mas não verifiquei fora disso.)Claro, ainda existem situações em que nem mesmo os recursos o ajudarão a modificar arquivos:
/proc
e/sys
, já que não são arquivos reaischattr
imutável+i
e anexa apenas+a
sinalizadores em ext2/ext3/ext4, ambos os quais param até o root e também impedem renomeações de arquivos, etc.root_squash
em NFS mapeia root para ninguémIsso é exatamente como você notou para permissões padrão:
Ler e escrever:
Por padrão, o usuário Root pode acessar qualquer arquivo no sistema. Você pode remover esse acesso alterando os atributos como explicado aqui: chattr . Isso é então ligado a capacidades.
Execute:
O usuário root não tem permissão de execução, a menos que pelo menos um dos bits de execução esteja definido.
O
myFile.txt
é obtido porchmod 000 myFile.txt
.---------
significa que não há permissão para usuário, grupo e outros.O usuário root tem capacidade irrestrita para modificar este arquivo. A leitura/gravação é concedida. Para executar este arquivo, o usuário root precisa torná-lo executável de qualquer maneira. (chmod 100, 010 ou 001)
O modo de execução é tratado de maneira um pouco diferente dos outros modos.
As permissões de leitura e gravação são usadas para impor políticas de segurança. O
root
usuário geralmente é imune a restrições de segurança (há algumas exceções, como arquivos imutáveis, e recursos modernos como recursos tornaram isso mais refinado), e é por isso que outro nome para essa conta é "superusuário".A permissão de execução é mais um modo consultivo, distinguindo se o arquivo deve ser executável ou apenas dados. Por causa disso, até mesmo o usuário root obedece -- não faz sentido executar um arquivo de dados. Se nenhuma das permissões de execução estiver definida, o root não poderá executar o arquivo; se algum deles estiver definido, ele pode. Obviamente, como o root também tem permissão para alterar as permissões de qualquer arquivo, a conta pode tornar um arquivo executável se desejar (a menos que o sistema de arquivos seja somente leitura).
Aliás, os scripts são um caso interessante nisso. Scripts são arquivos de dados para o intérprete relevante. Se o script tiver uma
#!
linha, você pode executá-lo como um programa -- o interpretador nomeado no shebang é executado com o nome do arquivo do script como argumento. Mas isso só será feito quando a permissão de execução estiver definida. Por outro lado, você pode apenas executar o interpretador diretamente, por exemplo,/bin/bash scriptname
. Os intérpretes só se importam se podem ler o arquivo, não verificam as permissões de execução.Deixe-me explicar teoricamente.
Se um arquivo ou diretório tiver qualquer permissão como X para executar, mas nada mais e alguém como o usuário Steve tiver o próprio arquivo, o root também poderá executar o arquivo.
Lembre-se sempre, no Linux o root pode fazer qualquer coisa, não há restrições no root.