En ciencias de la computación ,rpath designa la ruta de búsqueda en tiempo de ejecución codificada en un archivo ejecutable o biblioteca . Los cargadores de enlace dinámico utilizan rpath para encontrar las bibliotecas necesarias.
En concreto, codifica una ruta a las bibliotecas compartidas en el encabezado de un ejecutable (o de otra biblioteca compartida). Este valor de encabezado RPATH (denominado así en los estándares de encabezado de formato ejecutable y enlazable ) puede anular o complementar las rutas de búsqueda de enlace dinámico predeterminadas del sistema.
La ruta de acceso (rpath) de un ejecutable o biblioteca compartida es una entrada opcional en la .dynamicsección de bibliotecas compartidas ELFDT_RPATH , con el tipo , denominada DT_RPATHatributo. El enlazador puede almacenarla allí en tiempo de enlace. Herramientas como chrpathy patchelfpueden crear o modificar la entrada posteriormente.
Fondo
Los programas ejecutables modernos utilizan bibliotecas dinámicas , que son archivos cargables independientes, para reducir la duplicación de código. Al ejecutar un programa de este tipo, el enlazador dinámicold.so recorre las entradas de la biblioteca dinámica y las carga para que el programa ejecutable las utilice. Dado que las bibliotecas pueden estar ubicadas en múltiples ubicaciones, el formato ELF incluye una DT_RPATHentrada para especificar ld.sodónde encontrarlas.
Los distintos enlazadores dinámicos para ELF implementan el uso del DT_RPATHatributo de diferentes maneras. La principal divergencia radica en:
- Manejo de la nueva entrada
DT_RUNPATH, una versión más restringida de rpath. - Si las rutas relativas están disponibles a través de
$ORIGIN. - Si otras variables como
$PLATFORM,$LIBestán disponibles.
GNU ld.so
El enlazador dinámico de la biblioteca GNU C busca bibliotecas compartidas en las siguientes ubicaciones en orden: [ 1 ]
- Las rutas (separadas por dos puntos) en el
DT_RPATHatributo de sección dinámica del binario, si está presente y elDT_RUNPATHatributo no existe. - Las rutas (separadas por dos puntos) en la variable de entorno
LD_LIBRARY_PATH, a menos que el ejecutable sea unsetuid/setgidbinario, en cuyo caso se ignora,LD_LIBRARY_PATHse pueden anular llamando al enlazador dinámico con la opción--library-path(por ejemplo/lib/ld-linux.so.2 --library-path $HOME/mylibs myprogram). - Las rutas (separadas por dos puntos) en el
DT_RUNPATHatributo de sección dinámica del binario, si está presente. - La búsqueda se basa en el
ldconfigarchivo de caché (que suele estar ubicado en/etc/ld.so.cache) que contiene una lista compilada de bibliotecas candidatas encontradas previamente en la ruta de biblioteca ampliada (establecida por/etc/ld.so.conf). Sin embargo, si el binario se enlazó con la-z nodefaultlibopción del enlazador, se omiten las bibliotecas en las rutas de biblioteca predeterminadas. - En la ruta predeterminada de confianza
/lib, y luego/usr/lib. Si el binario se enlazó con la-z nodefaultlibopción del enlazador, este paso se omite.
Si no se encuentra la biblioteca compartida en todas estas ubicaciones, se producirá el error "No se puede abrir el archivo de objeto compartido : No existe el archivo o directorio".
Notas:
readelf -d <binary_name> | grep 'R.*PATH'muestra la ruta RPATH o RUNPATH de un archivo binario . En gcc , por ejemplo, se puede especificar RPATH mediante-Wl,-rpath,/custom/rpath/.- La opción
--inhibit-rpath LISTdel enlazador dinámico le indica que ignoreDT_RPATHlosDT_RUNPATHatributos de los nombres de los objetos en LIST. Para especificar un programa principal en LIST, introduzca una cadena vacía. - Las bibliotecas especificadas por la variable de entorno
LD_PRELOADy las que aparecen en la lista/etc/ld.so.preloadse cargan antes de que comience la búsqueda. Por lo tanto, se puede usar una precarga para reemplazar algunas (o todas) las funcionalidades normales de la biblioteca solicitada, o simplemente para proporcionar una biblioteca que de otro modo no se encontraría. - Las bibliotecas estáticas se buscan y se enlazan al archivo ELF en tiempo de enlace, y no se buscan en tiempo de ejecución.
Las rutas relativas se admiten mediante el token especial $ORIGIN, que se expande al directorio del ejecutable en tiempo de ejecución. Por ejemplo, -Wl,-rpath,$ORIGINagregaría el directorio donde se encuentra el ejecutable a rpath. Esto permite crear binarios que se pueden mover libremente entre diferentes carpetas.
El papel de GNU ld
El enlazador GNU (GNU ld) implementa una característica que denomina "new-dtags", que puede utilizarse para insertar una ruta de acceso (rpath) con menor precedencia que la LD_LIBRARY_PATHvariable de entorno . [ 2 ]
Si la función new-dtags está habilitada en el enlazador ( --enable-new-dtags), GNU ld, además de establecer el DT_RPATHatributo, también establece el DT_RUNPATHatributo a la misma cadena. En tiempo de ejecución, si el enlazador dinámico encuentra un DT_RUNPATHatributo, ignora el valor del DT_RPATHatributo, con el efecto de que LD_LIBRARY_PATHse comprueba primero y las rutas en el DT_RUNPATHatributo solo se buscan después.
El enlazador dinámico ld no busca DT_RUNPATHubicaciones para dependencias transitivas, a diferencia de DT_RPATH. [ 3 ]
En lugar de especificarlo -rpathal enlazador, LD_RUN_PATHse puede configurar la variable de entorno para obtener el mismo efecto.
Solaris ld.so
El enlazador dinámico de Solaris , específicamente /lib/ld.sode SunOS 5.8 y sistemas similares, busca las bibliotecas en los directorios especificados en la LD_LIBRARY_PATHvariable antes de examinar el DT_RPATHatributo. Sun Microsystems fue el primero en introducir la carga dinámica de bibliotecas . Posteriormente, Sun añadió la opción `rpath` a `ld` y la utilizó en bibliotecas esenciales como una medida de seguridad adicional. GNU `ld` hizo lo mismo para admitir bibliotecas dinámicas al estilo de Sun.
$ORIGINes compatible. [ 4 ]
En otros enlazadores dinámicos
Formato ELF:
- El ld.so de musl
DT_RUNPATHse maneja de la misma manera queDT_RPATH. Utiliza el siguiente orden:LD_LIBRARY_PATH, luego rpath/runpath, luego rutas predeterminadas. Entiende$ORIGIN. - El archivo ld.so de la biblioteca bionic libc no reconoce ninguna forma de rpath.
- FreeBSD ld.so respeta la no herencia y la menor precedencia de
DT_RUNPATH. También maneja$ORIGIN. [ 5 ]
Formatos distintos del ELF:
Consideraciones de seguridad
El uso de `rpath` y `runpath` puede presentar riesgos de seguridad cuando el valor aplicado incluye directorios bajo el control de un atacante. Esto puede incluir casos en los que el valor definido hace referencia explícitamente a una ubicación con permisos de escritura para el atacante, así como instancias en las que se utiliza una ruta relativa mediante `rpath` $ORIGIN, o cuando se deja una instrucción de directorio sin completar. Esto puede aprovecharse para engañar al binario y hacer que cargue bibliotecas maliciosas desde uno u otro de los directorios bajo el control del atacante. Esto es especialmente peligroso con los binarios `setUID`, ya que estos se ejecutan como un usuario diferente (generalmente con un nivel de permisos superior, a menudo root). [ 7 ]
Referencias
- ↑ – Manual del programador de Linux – Administración y comandos privilegiados de Manned.org
- ↑ "Bibliotecas compartidas: problemas de distribución y del sistema de compilación" . Sitio web oficial del compilador de Haskell . Consultado el 4 de abril de 2019 .
- ↑ "Error #1253638 "El enlazador dinámico no utiliza DT_RUNPATH para el tránsito... : Errores : Paquete Eglibc : Ubuntu" . 21 de noviembre de 2013.
- ↑ "Presentación de $ORIGIN (Guía de enlazadores y bibliotecas)" . docs.oracle.com .
- ↑ – Manual de comandos generales de FreeBSD
- ↑ "Run-Path Dependent Libraries" . developer.apple.com .
- ↑ Rompiendo los enlaces: Explotando el enlazador (2011)
Enlaces externos
- chrpath : una herramienta para cambiar el
DT_RPATHatributo de un ejecutable y convertirlo en unDT_RUNPATHatributo. - Puerto devel/chrpath de FreeBSD : herramienta para modificar DT_RPATH en binarios ELF existentes.
- patchELF : una pequeña utilidad para modificar el enlazador dinámico y
DT_RUNPATHlos atributos de los ejecutables ELF .
- Bibliotecas informáticas
- Tecnología de sistemas operativos