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.conf
no tiene rutas enumeradas. El resultado del comando anterior es
/lib
/usr/lib
Supuse que busca /lib
primero y luego /usr/lib
. Cuando agrego una nueva ruta, como /usr/local/lib
, /etc/ld.so.conf
y 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 /lib
y /usr/lib
. Que los directorios adicionales se busquen antes que los directorios confiables no es extraño en sí mismo, pero cuando /lib
se busca antes /usr/lib
, es extraño porque /bin
& /sbin
se busca después de /usr/bin
& /usr/sbin
in 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 /lib
se buscaría después de /usr/lib
.
Entonces, ¿cuál es el orden en el que ld.so
se buscan las rutas de las bibliotecas? ¿Por qué se /lib
busca 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:
- directorios de
LD_LIBRARY_PATH
; - directorios de
/etc/ld.so.conf
; /lib
;/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_PATH
es una configuración del usuario, tiene que ir antes que las demás. /etc/ld.so.conf
es 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_PATH
contenga 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/lib
y listarla /usr/local/lib
en /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_PATH
o 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_PATH
se borra.
En cuanto a /lib
vs /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 /lib
primero 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
.