O acesso privilegiado a arquivos e diretórios é realmente determinado por recursos, não apenas por 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 outros dados a outros usuários (seus processos).
Em resumo, você já descreveu como as verificações de controle de acesso funcionam para um processo privilegiado. Veja como os diferentes recursos realmente afetam:
O principal recurso aqui é CAP_DAC_OVERRIDE
, um processo que permite msgstr "ignorar ler, gravar e executar verificações de permissão". Isso inclui ler e escrever em qualquer arquivo, assim 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 do acesso verifica arquivos, diz que
Read/write DACs are always overridable. Executable DACs are overridable when there is at least one exec bit set.
E o código verifica se há pelo menos um x
bit definido se você está tentando executar o arquivo. Eu suspeito que é apenas um recurso de conveniência, para evitar a execução acidental de arquivos de dados aleatórios e obter erros ou resultados estranhos.
De qualquer forma, se você pode sobrescrever permissões, você pode simplesmente fazer uma cópia executável e executá-la. (Embora possa fazer uma diferença na teoria para arquivos setuid de um processo foi capaz de substituir permissões de arquivo ( CAP_DAC_OVERRIDE
), mas não tem outros recursos relacionados ( CAP_FSETID
/ CAP_FOWNER
/ CAP_SETUID
Mas ter CAP_DAC_OVERRIDE
permite editar /etc/shadow
e coisas assim, então é aproximadamente igual a ter acesso root completo de qualquer maneira.)
Há também o recurso CAP_DAC_READ_SEARCH
que permite ler qualquer arquivo e acessar qualquer diretório, mas não para executar ou gravar nele; e CAP_FOWNER
que permite que um processo faça coisas que normalmente são reservadas apenas para o proprietário do arquivo, como alterar os bits de permissão e o grupo de arquivos.
Substituir o bit fixo nos diretórios é mencionado apenas em CAP_FOWNER
, então parece que CAP_DAC_OVERRIDE
não seria suficiente para ignorar isso. (Isso lhe daria permissão de escrita, mas geralmente em diretórios fixos você tem isso de qualquer maneira, e +t
limita isso.)
(acho que dispositivos especiais contam como "arquivos" aqui. Pelo menos generic_permission()
tem apenas uma verificação de tipo para diretórios, mas eu não verifiquei fora disso).
É claro que ainda há situações em que até os recursos não ajudam a modificar os arquivos:
- alguns arquivos em
/proc
e/sys
, pois não são arquivos reais - SELinux e outros módulos de segurança que podem limitar a raiz
-
chattr
imutável+i
e anexe apenas+a
flags no ext2 / ext3 / ext4, ambos os quais param até mesmo o root, e também previnem renomeação de arquivos, etc. - sistemas de arquivos de rede, em que o servidor pode fazer seu próprio controle de acesso, por exemplo,
root_squash
na raiz de mapas do NFS para ninguém - FUSE, que eu suponho que poderia fazer qualquer coisa
- montagens somente leitura
- dispositivos somente leitura