¿Cuál es el orden en el que el enlazador dinámico de Linux busca rutas?

¿Cuál es el orden en el que el enlazador dinámico de Linux busca rutas?

Esto no es un duplicado porque se trata de una peculiaridad que noté cuando uso /etc/ld.so.conf.

Para obtener las rutas en las que el enlazador dinámico busca bibliotecas, ejecuto el comando ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g". Cuando /etc/ld.so.confno tiene rutas enumeradas. El resultado del comando anterior es

/lib
/usr/lib

Supuse que busca /libprimero y luego /usr/lib. Cuando agrego una nueva ruta, como /usr/local/lib, /etc/ld.so.confy luego remake /etc/ld.so.cache, la salida ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"se convierte en

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

Esto me parece extraño porque si estoy en lo cierto en que el orden en el que se buscan los directorios enumerados es de arriba a abajo, entonces se buscan directorios adicionales antes /liby /usr/lib. Que los directorios adicionales se busquen antes que los directorios confiables no es extraño en sí mismo, pero cuando /libse busca antes /usr/lib, es extraño porque /bin& /sbinse busca después de /usr/bin& /usr/sbinin PATH.

Incluso si se buscaran las rutas enumeradas por ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"de abajo hacia arriba, seguiría siendo un orden sesgado porque se buscarían directorios adicionales después de los confiables, mientras que /libse buscaría después de /usr/lib.

Entonces, ¿cuál es el orden en el que ld.sose buscan las rutas de las bibliotecas? ¿Por qué se /libbusca antes /usr/lib? Si no es así, ¿por qué se buscan directorios adicionales /lib?

Respuesta1

El pedido está documentado en el manual del enlazador dinámico, que esld.so. Es:

  1. directorios de LD_LIBRARY_PATH;
  2. directorios de /etc/ld.so.conf;
  3. /lib;
  4. /usr/lib.

(Estoy simplificando un poco; consulte el manual para obtener todos los detalles).

El orden tiene sentido si se considera que es la única forma de anular una biblioteca en una ubicación predeterminada con una biblioteca personalizada. LD_LIBRARY_PATHes una configuración del usuario, tiene que ir antes que las demás. /etc/ld.so.confes una configuración local, viene antes del valor predeterminado del sistema operativo. Entonces, como usuario, si quiero ejecutar un programa con una versión diferente de una biblioteca, puedo ejecutar el programa que LD_LIBRARY_PATHcontenga la ubicación de esa versión diferente de la biblioteca. Y como administrador, puedo poner una versión diferente de la biblioteca /usr/local/liby listarla /usr/local/liben /etc/ld.so.conf.

La confianza no entra en esto. Cualquier directorio que aparezca en esta ruta de búsqueda debe ser confiable, porque cualquier biblioteca podría terminar cargándose desde allí. En teoría, podría enumerar los nombres de las bibliotecas utilizadas por todos los programas que "requieren más confianza" en su sistema y asegurarse de que todas estas bibliotecas estén presentes en los directorios "más confiables", y luego los directorios "menos confiables" no lo harían. usarse si vinieron después de los directorios más confiables en la ruta de búsqueda, excepto para los programas que "requieren menos confianza". Pero eso sería extremadamente frágil. También sería bastante inútil: si un atacante puede inyectar un valor de LD_LIBRARY_PATHo un elemento de /etc/ld.so.conf, seguramente tiene una ruta más directa para ejecutar código arbitrario, como inyectar un valor de PATH, de LD_PRELOAD, etc. La confianza en la ruta de carga de la biblioteca no Importa cuando la ejecución cruza un límite de confianza, es decir, cuando se ejecuta un programa con privilegios adicionales (por ejemplo, el programa setuid/setgid o mediante sudo). Lo que sucede en este caso es que LD_LIBRARY_PATHse borra.

En cuanto a /libvs /usr/lib, no importa mucho: los proporciona la misma entidad (el sistema operativo) y no debería haber una biblioteca presente en ambos. Tiene sentido enumerar /libprimero porque proporciona una ventaja de rendimiento (muy pequeña): las bibliotecas más utilizadas, especialmente las bibliotecas utilizadas por programas básicos pequeños (para los cuales el tiempo de carga es una fracción mayor del tiempo total de ejecución que los programas grandes y largos). -programa en ejecución), se encuentran en /lib.

información relacionada