Articulo de referencia

rpath

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 uti...

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 ]

  1. Las rutas (separadas por dos puntos) en el DT_RPATHatributo de sección dinámica del binario, si está presente y el DT_RUNPATHatributo no existe.
  2. Las rutas (separadas por dos puntos) en la variable de entorno LD_LIBRARY_PATH, a menos que el ejecutable sea un setuid/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).
  3. Las rutas (separadas por dos puntos) en el DT_RUNPATHatributo de sección dinámica del binario, si está presente.
  4. 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.
  5. 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 ignore DT_RPATHlos DT_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 muslDT_RUNPATH se maneja de la misma manera que DT_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:

  • El formato Mach-O tiene un sistema rpath similar, especificado mediante LC_RPATH. A diferencia de ELF, el rpath debe referenciarse explícitamente en la lista de bibliotecas como @rpathpara que se tenga en cuenta en la búsqueda de bibliotecas. [ 6 ]

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

  1. Manual del programador de Linux – Administración y comandos privilegiados de Manned.orgld.so(8)  
  2. "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 .
  3. "Error #1253638 "El enlazador dinámico no utiliza DT_RUNPATH para el tránsito... : Errores : Paquete Eglibc : Ubuntu" . 21 de noviembre de 2013.   
  4. "Presentación de $ORIGIN (Guía de enlazadores y bibliotecas)" . docs.oracle.com .
  5. Manual de comandos generales de FreeBSDld.so(1)  
  6. "Run-Path Dependent Libraries" . developer.apple.com .
  7. Rompiendo los enlaces: Explotando el enlazador (2011)
  • chrpath : una herramienta para cambiar el DT_RPATHatributo de un ejecutable y convertirlo en un DT_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 .