O acesso privilegiado a arquivos e diretórios é realmente determinado pelos recursos, não apenas por ser root
ou não. Na prática, root
geralmente possui 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).
Em resumo, 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". Isso inclui ler e gravar em qualquer arquivo, além de ler, escrever e acessar diretórios.
Na verdade, ele não se aplica à execução de arquivos que não estão marcados como executáveis. O comentário emgeneric_permission
( fs/namei.c
), antes do acesso procurar arquivos, diz que
Os DACs de leitura / gravação são sempre substituíveis. Os DACs executáveis são substituíveis quando há pelo menos um conjunto de bits exec.
E 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 impedir a execução acidental de arquivos de dados aleatórios e a obtenção de erros ou resultados ímpares.
De qualquer forma, se você puder substituir as permissões, poderá fazer uma cópia executável e executá-la. (Embora possa fazer a diferença na teoria para arquivos setuid de um processo era capaz de substituir permissões de arquivo ( CAP_DAC_OVERRIDE
), mas não tem outras capacidades relacionadas ( CAP_FSETID
/ CAP_FOWNER
/ CAP_SETUID
). Mas ter CAP_DAC_OVERRIDE
permite editar /etc/shadow
e coisas assim, então é aproximadamente igual apenas tendo acesso root completo de qualquer maneira.)
Há também o CAP_DAC_READ_SEARCH
recurso que permite ler qualquer arquivo e acessar qualquer diretório, mas não para executar ou gravar neles; e CAP_FOWNER
isso permite que um processo faça coisas que normalmente são reservadas apenas ao proprietário do arquivo, como alterar os bits de permissão e o grupo de arquivos.
A substituição do bit pegajoso nos diretórios é mencionada apenas em baixo CAP_FOWNER
, portanto parece que CAP_DAC_OVERRIDE
não seria suficiente ignorar isso. (Isso daria a você permissão de gravação, mas geralmente em diretórios fixos você a possui de qualquer maneira e a +t
limita.)
(Eu 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.)
Obviamente, ainda existem situações em que nem os recursos o ajudarão a modificar arquivos:
- alguns arquivos
/proc
e /sys
, como eles não são arquivos reais
- SELinux e outros módulos de segurança que podem limitar a raiz
chattr
imutável +i
e anexa apenas +a
sinalizadores no ext2 / ext3 / ext4, os quais param o root e impedem também a renomeação de arquivos etc.
- sistemas de arquivos de rede, nos quais o servidor pode fazer seu próprio controle de acesso, por exemplo,
root_squash
nos mapas NFS raiz de ninguém
- FUSE, que eu suponho que poderia fazer qualquer coisa
- montagens somente leitura
- dispositivos somente leitura
capabilities(7)
página de manual - considere arquivar um relatório de erro!