stringtranslate.com

preenlace

En informática , el enlace previo , también llamado enlace previo , es un método para optimizar los tiempos de carga de las aplicaciones resolviendo los símbolos de la biblioteca antes del lanzamiento.

Fondo

La mayoría de los programas informáticos constan de código que requiere bibliotecas compartidas externas para su ejecución. Estas bibliotecas normalmente se integran con el programa en tiempo de ejecución mediante un cargador , en un proceso llamado enlace dinámico .

Si bien los enlaces dinámicos tienen ventajas en cuanto al tamaño y la gestión del código, también existen desventajas. Cada vez que se ejecuta un programa, el cargador debe resolver (encontrar) las bibliotecas relevantes. Dado que las bibliotecas se mueven en la memoria, existe una penalización en el rendimiento de la resolución. Esta penalización aumenta por cada biblioteca adicional que necesita resolución.

La vinculación previa reduce esta penalización al resolver las bibliotecas por adelantado. Posteriormente, la resolución solo se produce si las bibliotecas han cambiado desde que se vincularon previamente, como por ejemplo después de una actualización.

Mac OS

Mac OS almacena archivos ejecutables en formato de archivo Mach-O .

Mac OS X

Mac OS X realiza un enlace previo en la etapa de "Optimización" de la instalación del software del sistema o de determinadas aplicaciones.

El enlace previo ha cambiado varias veces dentro de la serie Mac OS X. Antes de 10.2, la vinculación previa solo ocurría durante el procedimiento de instalación (la etapa de "Optimización" antes mencionada). Desde la versión 10.2 hasta la 10.3, el sistema operativo verificaba el enlace previo en el momento del inicio de las aplicaciones, y la primera vez que se ejecutaba una aplicación estaba previnculado, lo que hacía que los lanzamientos posteriores fueran más rápidos. Esto también podría ejecutarse manualmente, como lo hicieron algunas instalaciones a nivel de sistema operativo. En 10.4, solo estaban previnculadas las bibliotecas del sistema operativo. En 10.5 y posteriores, Apple reemplazó el enlace previo con un mecanismo de caché compartido dyld , [1] que proporcionó un mejor rendimiento del sistema operativo.

linux

En Linux, la previnculación se logra mediante el programa prelink , un programa gratuito escrito por Jakub Jelínek de Red Hat para binarios ELF .

Los resultados de rendimiento han sido mixtos [ se necesita aclaración ] , pero parece ayudar a los sistemas con una gran cantidad de bibliotecas, como KDE . [2]

aleatorización previa al enlace

Cuando se ejecuta con la opción "-R", el enlace previo seleccionará aleatoriamente la base de direcciones donde se cargan las bibliotecas. Esta selección hace que un ataque de retorno a libc sea más difícil de realizar porque las direcciones son exclusivas de ese sistema. La razón por la que el prelink hace esto es porque las funciones del kernel que proporcionan aleatorización del diseño del espacio de direcciones (ASLR) para las bibliotecas no se pueden usar junto con el prelink sin anular el propósito del prelink y forzar al enlazador dinámico a realizar reubicaciones en el momento de la carga del programa.

Como se indicó, la aleatorización de direcciones de biblioteca por proceso y prevínculo no se puede utilizar en conjunto. Para evitar eliminar por completo esta mejora de seguridad, prelink proporciona su propia aleatorización; sin embargo, esto no ayuda a una filtración de información general causada por el preenlace. Los atacantes con la capacidad de leer ciertos archivos arbitrarios en el sistema de destino pueden descubrir dónde están cargadas las bibliotecas en demonios privilegiados; A menudo, libc es suficiente, ya que es la biblioteca más utilizada en ataques de retorno a libc .

Al leer un archivo de biblioteca compartida como libc, un atacante con acceso local puede descubrir la dirección de carga de libc en todas las demás aplicaciones del sistema. Dado que la mayoría de los programas se vinculan a libc, el archivo de la biblioteca libc siempre debe ser legible; cualquier atacante con acceso local puede recopilar información sobre el espacio de direcciones de procesos con mayores privilegios. El acceso local normalmente se puede obtener mediante cuentas shell o cuentas de servidor web que permiten el uso de scripts CGI, que pueden leer y generar cualquier archivo en el sistema. [ cita necesaria ] Los atacantes sin cuentas pueden utilizar las vulnerabilidades de cruce de directorios si hay vulnerabilidades de script CGI disponibles.

Debido a que el enlace previo suele ejecutarse periódicamente, normalmente cada dos semanas, la dirección de cualquier biblioteca determinada tiene posibilidades de cambiar con el tiempo. prelink se utiliza a menudo en un modo incremental en el que las bibliotecas ya previnculadas no se modifican a menos que sea absolutamente necesario, por lo que es posible que una biblioteca no cambie su dirección base cuando se vuelve a ejecutar prelink. Esto le da a cualquier dirección derivada una vida media del período en el que se ejecuta el enlace previo. También tenga en cuenta que si se instala una nueva versión de la biblioteca, las direcciones cambian.

Jakub Jelínek señala que los ejecutables independientes de posición (PIE) ignoran los enlaces previos en Red Hat Enterprise Linux y Fedora , y recomienda que los programas SUID y de red se creen PIE para facilitar un entorno más seguro.

Asuntos

Ocasionalmente, la vinculación previa puede causar problemas con el punto de control de la aplicación y reiniciar bibliotecas como blcr, [3] así como otras bibliotecas (como OpenMPI ) que se usan blcrinternamente. Específicamente, cuando se controla un programa en un host y se intenta reiniciar en un host diferente, el programa reiniciado puede fallar con un error de segmentación debido a diferencias en la aleatorización de direcciones de memoria de la biblioteca específica del host. [4] [5] [ ¿ fuente poco confiable? ]

Ver también

Referencias

  1. ^ "Página de manual para update_prebinding". Conexión de desarrollador de Apple . Apple Computer Inc.
  2. ^ Crasta, James (17 de mayo de 2004). "ELF Prelinking y lo que puede hacer por usted" . Consultado el 10 de mayo de 2006 .
  3. ^ blcr
  4. ^ "Preguntas frecuentes sobre BLCR" . Consultado el 5 de enero de 2012 .
  5. ^ Hursey, Josh (29 de diciembre de 2011). "fallo de segmentación al reanudar en un host diferente". Usuarios de OpenMPI (lista de correo) . Consultado el 5 de enero de 2012 .

Otras lecturas

enlaces externos