En informática , la previnculación , también llamada preenlace , es un método para optimizar los tiempos de carga de las aplicaciones mediante la resolución de los símbolos de la biblioteca antes del lanzamiento.
La mayoría de los programas informáticos están compuestos de código que requiere bibliotecas compartidas externas para ejecutarse. Estas bibliotecas normalmente se integran con el programa en tiempo de ejecución mediante un cargador , en un proceso denominado enlace dinámico .
Si bien la vinculación dinámica tiene ventajas en cuanto al tamaño y la administración del código, también tiene desventajas. Cada vez que se ejecuta un programa, el cargador debe resolver (encontrar) las bibliotecas relevantes. Dado que las bibliotecas se mueven por la memoria, existe una penalización de rendimiento para la resolución. Esta penalización aumenta por cada biblioteca adicional que necesite resolución.
La previnculación reduce esta penalización al resolver las bibliotecas por adelantado. Posteriormente, la resolución solo ocurre si las bibliotecas han cambiado desde que se previncularon, por ejemplo, después de una actualización.
Mac OS almacena los ejecutables en el formato de archivo Mach-O .
Mac OS X realiza la previnculación en la etapa de "Optimización" de la instalación del software del sistema o de ciertas aplicaciones.
La previnculación ha cambiado algunas veces dentro de la serie Mac OS X. Antes de la versión 10.2, la previnculación solo se producía durante el procedimiento de instalación (la etapa de "Optimización" mencionada anteriormente). Desde la versión 10.2 hasta la 10.3, el sistema operativo verificaba la previnculación en el momento del lanzamiento de las aplicaciones, y la primera vez que se ejecutaba una aplicación se previnculaba, lo que aceleraba los lanzamientos posteriores. Esto también se podía ejecutar manualmente, lo que hacían algunas instalaciones a nivel de sistema operativo. En la versión 10.4, solo se previnculaban las bibliotecas del sistema operativo. En la versión 10.5 y posteriores, Apple reemplazó la previnculación con un mecanismo de caché compartida dyld , [1] que proporcionaba un mejor rendimiento del sistema operativo.
En Linux, la previnculación se logra a través del 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]
Cuando se ejecuta con la opción "-R", prelink 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 prelink hace esto es porque las funciones del núcleo que proporcionan aleatorización del diseño del espacio de direcciones (ASLR) para las bibliotecas no se pueden usar junto con prelink sin anular el propósito de prelink y forzar al enlazador dinámico a realizar reubicaciones en el momento de carga del programa.
Como se indicó, la aleatorización de direcciones de biblioteca por proceso y prelink no se pueden usar en conjunto. Para evitar eliminar por completo esta mejora de seguridad, prelink proporciona su propia aleatorización; sin embargo, esto no ayuda a evitar una fuga de información general causada por prelink. Los atacantes con la capacidad de leer ciertos archivos arbitrarios en el sistema de destino pueden descubrir dónde se cargan las bibliotecas en los daemons privilegiados; a menudo, libc es suficiente, ya que es la biblioteca más común utilizada en los 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 biblioteca libc siempre debe ser legible; cualquier atacante con acceso local puede recopilar información sobre el espacio de direcciones de procesos con privilegios más altos. El acceso local puede obtenerse comúnmente mediante cuentas de shell o cuentas de servidor web que permitan el uso de scripts CGI, que pueden leer y generar cualquier archivo en el sistema. [ cita requerida ] Las vulnerabilidades de recorrido de directorio pueden ser utilizadas por atacantes sin cuentas si hay vulnerabilidades de scripts CGI disponibles.
Debido a que prelink se ejecuta a menudo de forma periódica, normalmente cada dos semanas, la dirección de cualquier biblioteca dada tiene la posibilidad de cambiar con el tiempo. prelink se utiliza a menudo en un modo incremental en el que las bibliotecas ya preenlazadas no se modifican a menos que sea absolutamente necesario, por lo que una biblioteca no puede cambiar 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 prelink. Tenga en cuenta también que si se instala una nueva versión de la biblioteca, las direcciones cambian.
Jakub Jelínek señala que los ejecutables independientes de la posición (PIE) ignoran el preenlace en Red Hat Enterprise Linux y Fedora , y recomienda que los programas de red y SUID se creen PIE para facilitar un entorno más seguro.
Ocasionalmente, la previnculación puede causar problemas con las bibliotecas de reinicio y de puntos de control de la aplicación como blcr
, [3] así como con otras bibliotecas (como OpenMPI ) que se usan blcr
internamente. Específicamente, cuando se realiza un punto de control de 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 las diferencias en la aleatorización de la dirección de memoria de la biblioteca específica del host. [4] [5] [ ¿ fuente poco confiable? ]
{{cite journal}}
: Requiere citar revista |journal=
( ayuda )