No Linux, estou olhando para /proc/1/cwd
. Este symlink não é legível como um usuário normal:
$ ls /proc/1/cwd
ls: cannot access '/proc/1/cwd': Permission denied
Mas /proc/1
é acessível:
$ ls /proc/1
<output>
Depois de se tornar root, você verá que /proc/1/cwd
aponta para /
(raiz do sistema de arquivos):
$ sudo ls -l /proc/1/cwd
lrwxrwxrwx 1 root root 0 Feb 21 12:56 /proc/1/cwd -> /
E é claro que a raiz do sistema de arquivos é legível, como um usuário normal:
$ ls /
<output>
Se links simbólicos não têm permissões no Linux, então por que um link simbólico não é legível, quando seu destino (a raiz do sistema de arquivos) é legível?
Ler
/
normalmente não é privilegiado, mas conhecer o diretório de trabalho atual dos processos de outro usuário é./proc
adiciona verificações adicionais antes de permitirreadlink
:Isso se aplica a outros links dentro de
/proc
, em particularexe
eroot
. O raciocínio é similar: o executável de um processo é tipicamente legível por todos, mas saber o executável de um dado processo é uma informação sensível.Esse é o diretório de trabalho atual do processo, que é considerado privado e possivelmente sensível.
Ver
man 5 proc_pid_cwd
:Com [
man 2 ptrace
] tendo:E
man 7 credentials
tendo:(essencialmente o mesmo que IDs efetivos , aqueles IDs de FS específicos do Linux estão sendo descontinuados por não serem mais necessários, de acordo com a
setfsgid()
página de manual do ).Então, basicamente, para poder fazer um
readlink()
ou desreferenciar/proc/$pid/cwd
, o processo de chamada (se não estiver relacionado a$pid
) deve ter as mesmas credenciais que as de$pid
. Observe que ele verifica os IDs do sistema de arquivos do processo de chamada (efetivos) em relação a todos os IDs efetivos, reais e salvos de$pid
. Então, se isso$pid
tiver gid efetivo e real diferentes, por exemplo (como quando um processo executa um arquivo que tem o bit sgid definido em suas permissões), somenteroot
(ou um processo com capacidades apropriadas) pode obter essas informações.No caso do pid 1, normalmente executado como
root
e que não tem pai, sóroot
pode obter essa informação.Como observação lateral, observe que
ls
se comporta de forma diferente com e sem-l
.Com
-l
(ou algumas outras opções que relatam alguns atributos do arquivo de destino, como-F
),ls
ele faz umlstat()
no arquivo e, portanto, para um link simbólico, ele retorna informações sobre o próprio link simbólico, mas sem ele, ele faz um ,stat()
portanto, desreferencia o link simbólico (e, se forstat()
bem-sucedido,ls /proc/1/cwd
listaria o conteúdo do diretório de trabalho atual do pid 1).