Você ainda pode acessar o diretório atual (ou diretório raiz), se o seu usuário não tiver permissão nesse diretório?

Você ainda pode acessar o diretório atual (ou diretório raiz), se o seu usuário não tiver permissão nesse diretório?

É possível que um programa herde ou receba um descritor de arquivo aberto; para um arquivo que de outra forma não seria permitido ler (ou gravar). Por exemplo:

(sudo -u nobody echo "hello world") > ~/test-file
(sudo -u nobody cat) < ~/test-file

Pergunta: Se você herdar um diretório atual (ou diretório raiz) que seu usuário não teria permissão de acessar, você terá permissão para acessá-lo?

Responder1

A comparação com descritores de arquivo é altamente enganosa: o diretório atual e raiz de um processo não são descritores de arquivo ou qualquer tipo de ponteiro para uma "descrição de arquivo aberto" (a struct file), mas apenas ponteiros para entradas de diretório ( struct dentrys).

O kernel não mantém uma descrição de arquivo aberta referente ao inode do diretório apontado pelo diretório atual ou raiz, que pode ser herdado por processos filhos através de qualquer tipo de identificador.

Para que possam ser utilizados de alguma forma, o diretório atual e raiz devem ser abertos por caminho, como qualquer outro arquivo, e todas as verificações padrão se aplicam.

Abrir um arquivo com O_PATHretornará apenas um identificador opaco e terá sucesso comqualquerarquivo que normalmente não poderia ser aberto para leitura ou gravação, desde que o caminho para ele esteja acessível:

$ perl -e 'sysopen my $fh, "/root", 0, 0 or die "$!"'
Permission denied at -e line 1.
$ perl -e 'sysopen my $fh, "/root", 010000000, 0 or die "$!"' # 010000000 is O_PATH
$

Esse fd opaco não pode ser usado como um fd normal, mesmo por processos privilegiados, e felizmente não há como transformá- openat(fd, "", AT_EMPTY_PATH|O_RDWR)lo dup()em um descritor de arquivo normal ;-)

Aliás, a biblioteca musldefine O_SEARCHDesde O_PATHentão2012.

Responder2

Não.

# sudo -u nobody ls .
ls: cannot access '.': Permission denied

# sudo -u nobody ls -d .
ls: cannot access '.': Permission denied

# chmod o-rwx /chroot
# chroot --userspec=nobody:nobody /chroot
chroot: failed to run command ‘/bin/bash’: Permission denied

O mesmo também se aplica ao acesso de gravação ao diretório atual (ou diretório raiz). Caso contrário, suspeito que seria uma fonte de bugs de segurança :-).

Comportamento semelhante se aplica a descritores de arquivos abertos O_PATHno Linux.

POSIX (que não define O_PATH) implica que openat(fd, path, ...)funções semelhantes verificarão novamente a permissão para acessar o diretório aberto fd,a menos que fdfoi aberto com O_SEARCH. Linux não suportaO_SEARCH.

informação relacionada