Qual é a ordem na qual o vinculador dinâmico do Linux pesquisa os caminhos?

7

Isso não é uma duplicata porque isso está lidando com uma peculiaridade que notei quando uso /etc/ld.so.conf .

Para obter os caminhos que o vinculador dinâmico procura nas bibliotecas, eu executo o comando ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g" . Quando /etc/ld.so.conf não tem caminhos listados. A saída do comando anterior é

/lib
/usr/lib

Eu achei que ele pesquisou /lib primeiro e, em seguida, /usr/lib . Quando eu adiciono um novo caminho, como /usr/local/lib , a /etc/ld.so.conf e, em seguida, refaz /etc/ld.so.cache , a saída de ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g" torna-se

/usr/local/lib
/lib
/usr/lib

Acho isso estranho porque, se estiver correto, a ordem em que os diretórios listados são pesquisados é de cima para baixo; em seguida, diretórios adicionais são pesquisados antes de /lib e /usr/lib . Que os diretórios adicionais sejam procurados antes que os diretórios confiáveis não sejam estranhos, mas quando /lib é pesquisado antes de /usr/lib , isso é estranho porque /bin & /sbin são pesquisados após /usr/bin & /usr/sbin em PATH .

Mesmo se os caminhos listados por ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g" fossem pesquisados de baixo para cima, ainda assim seria uma ordenação distorcida, porque diretórios adicionais seriam pesquisados após os confiáveis, enquanto /lib seria pesquisado após /usr/lib .

Então, qual é a ordem em que ld.so pesquisa caminhos para bibliotecas? Por que /lib é pesquisado antes de /usr/lib ? Se não for, então por que diretórios adicionais são pesquisados após /lib ?

    
por Melab 27.05.2017 / 17:07

1 resposta

6

O pedido está documentado no manual do vinculador dinâmico, que é ld.so . É:

  1. diretórios de LD_LIBRARY_PATH ;
  2. diretórios de /etc/ld.so.conf ;
  3. /lib ;
  4. /usr/lib .

(estou simplificando um pouco, consulte o manual para os detalhes completos).

O pedido faz sentido quando você considera que é a única maneira de substituir uma biblioteca em um local padrão com uma biblioteca personalizada. LD_LIBRARY_PATH é uma configuração de usuário, tem que vir antes dos outros. /etc/ld.so.conf é uma configuração local, ela vem antes do padrão do sistema operacional. Portanto, como usuário, se eu quiser executar um programa com uma versão diferente de uma biblioteca, posso executar o programa com LD_LIBRARY_PATH contendo a localização dessa versão de biblioteca diferente. E como administrador, posso colocar uma versão diferente da biblioteca em /usr/local/lib e listar /usr/local/lib em /etc/ld.so.conf .

A confiança não entra nisso. Qualquer diretório listado neste caminho de busca tem que ser confiável, porque qualquer biblioteca pode acabar sendo carregada a partir daí. Teoricamente, você poderia listar os nomes das bibliotecas usadas por todos os programas que “exigem mais confiança” em seu sistema e certificar-se de que todas essas bibliotecas estão presentes nos diretórios “mais confiáveis”, e os diretórios “menos confiáveis” não ser usado se eles vierem após os diretórios mais confiáveis no caminho de pesquisa, exceto os programas que exigem menos confiança. Mas isso seria extremamente frágil. Também seria bastante inútil: se um invasor pode injetar um valor de LD_LIBRARY_PATH ou um elemento de /etc/ld.so.conf , eles certamente têm um caminho mais direto para executar código arbitrário, como injetar um valor de PATH , de LD_PRELOAD , etc. A confiança no caminho de carregamento da biblioteca é importante quando a execução ultrapassa um limite de confiança, ou seja, ao executar um programa com privilégios adicionais (por exemplo, programa setuid / setgid ou via sudo ). O que acontece neste caso é que LD_LIBRARY_PATH está em branco.

Quanto a /lib vs /usr/lib , não importa muito: eles são fornecidos pela mesma entidade (o sistema operacional) e não deve haver uma biblioteca presente em ambos. Faz sentido listar /lib primeiro porque ele fornece uma vantagem de desempenho (muito pequena): as bibliotecas mais usadas, especialmente as bibliotecas usadas por pequenos programas básicos (para os quais o tempo de carregamento é uma fração maior do tempo total de execução) programa grande e de longa duração), estão localizados em /lib .

    
por 28.05.2017 / 02:43