AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 791390
Accepted
codeandfire
codeandfire
Asked: 2025-02-21 16:16:46 +0800 CST2025-02-21 16:16:46 +0800 CST 2025-02-21 16:16:46 +0800 CST

Por que alguns links simbólicos são ilegíveis quando seu destino é legível?

  • 772

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/cwdaponta 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?

linux
  • 2 2 respostas
  • 45 Views

2 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2025-02-21T16:39:09+08:002025-02-21T16:39:09+08:00

    Ler /normalmente não é privilegiado, mas conhecer o diretório de trabalho atual dos processos de outro usuário é. /procadiciona verificações adicionais antes de permitirreadlink :

    A permissão para desreferenciar ou ler ( readlink(2)) este link simbólico é regida por uma verificação ptracede modo de acesso PTRACE_MODE_READ_FSCREDS; consulte ptrace(2).

    Isso se aplica a outros links dentro de /proc, em particular exee root. 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.

    • 5
  2. Stéphane Chazelas
    2025-02-21T17:17:37+08:002025-02-21T17:17:37+08:00

    Esse é o diretório de trabalho atual do processo, que é considerado privado e possivelmente sensível.

    Ver man 5 proc_pid_cwd:

    A permissão para desreferenciar ou ler ( readlink(2)) este link simbólico é governado por uma verificação do modo de acesso ptrace PTRACE_MODE_READ_FSCREDS; veja ptrace(2)

    Com [ man 2 ptrace] tendo:

    Verificação do modo de acesso Ptrace

    Várias partes da API do kernel-user-space (não apenas ptrace() operações) exigem as chamadas verificações de "modo de acesso ptrace", cujo resultado determina se uma operação é permitida (ou, em alguns casos, faz com que uma operação de "leitura" retorne dados higienizados). Essas verificações são realizadas em casos em que um processo pode inspecionar informações confidenciais sobre, ou em alguns casos modificar o estado de, outro processo. As verificações são baseadas em fatores como as credenciais e capacidades dos dois processos, se o processo "alvo" é ou não dumpável e os resultados das verificações realizadas por qualquer Linux Security Module (LSM) habilitado — por exemplo, SELinux, Yama ou Smack — e pelo commoncap LSM (que é sempre invocado).

    Antes do Linux 2.6.27, todas as verificações de acesso eram de um único tipo. Desde o Linux 2.6.27, dois níveis de modo de acesso são distinguidos:

    PTRACE_MODE_READ

    Para operações de "leitura" ou outras operações menos perigosas, como: get_robust_list(2); kcmp(2); leitura /proc/pid/auxv, /proc/pid/environ, ou /proc/pid/stat; ou readlink(2) de um /proc/pid/ns/*arquivo.
    [...]

    PTRACE_MODE_FSCREDS

    Use o UID e o GID do sistema de arquivos do chamador (consulte credentials(7) ) ou recursos efetivos para verificações de LSM.
    [...]
    Como a combinação de um dos modificadores de credenciais com um dos modos de acesso mencionados acima é típica, algumas macros são definidas nas fontes do kernel para as combinações:

    PTRACE_MODE_READ_FSCREDS

    Definido como PTRACE_MODE_READ | PTRACE_MODE_FSCREDS.

    E man 7 credentialstendo:

    • ID do usuário do sistema de arquivos e ID do grupo do sistema de arquivos (específico do Linux). Esses IDs, em conjunto com os IDs de grupo suplementares descritos abaixo, são usados ​​para determinar permissões para acessar arquivos; veja path_resolution(7) para detalhes. Sempre que o ID efetivo do usuário (grupo) de um processo é alterado, o kernel também altera automaticamente o ID do usuário (grupo) do sistema de arquivos para o mesmo valor. Consequentemente, os IDs do sistema de arquivos normalmente têm os mesmos valores que o ID efetivo correspondente, e a semântica para verificações de permissão de arquivo é, portanto, a mesma no Linux como em outros sistemas UNIX. Os IDs do sistema de arquivos podem ser feitos para diferir dos IDs efetivos chamando setfsuid(2) e setfsgid(2).

    (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 $pidtiver gid efetivo e real diferentes, por exemplo (como quando um processo executa um arquivo que tem o bit sgid definido em suas permissões), somente root(ou um processo com capacidades apropriadas) pode obter essas informações.

    No caso do pid 1, normalmente executado como roote que não tem pai, só rootpode obter essa informação.

    Como observação lateral, observe que lsse 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), lsele faz um lstat()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 for stat()bem-sucedido, ls /proc/1/cwdlistaria o conteúdo do diretório de trabalho atual do pid 1).

    • 2

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve