rpath в программировании: что это такое? Объяснение жестко закодированного пути поиска библиотек во время выполнения, DT_RPATH, ELF и динамическая линковка.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Жестко заданный путь поиска – термин программирования.
Hard coded search path
the programming term
В информатике rpath обозначает путь поиска во время выполнения, жестко закодированный в исполняемом файле или библиотеке. Динамические загрузчики используют rpath для поиска необходимых библиотек. В частности, он содержит путь к общим библиотекам, встроенный в заголовок исполняемого файла (или другой общей библиотеки). Это значение заголовка RPATH (так оно называется в стандартах форматов исполняемых и связываемых файлов) может либо переопределять, либо дополнять системные пути поиска по умолчанию. rpath исполняемого файла или общей библиотеки является необязательной записью в динамическом разделе исполняемого файла или общей библиотеки ELF, имеющей тип DT_RPATH и называемой атрибутом DT_RPATH. Он может быть добавлен линкером во время сборки. Инструменты, такие как chrpath и patchelf, позволяют создавать или изменять эту запись позднее.
In computing, rpath designates the run time search path hard coded in an executable file or library. Dynamic linking loaders use the rpath to find required libraries. Specifically, it encodes a path to shared libraries into the header of an executable (or another shared library). This RPATH header value (so named in the Executable and Linkable Format header standards) may either override or supplement the system default dynamic linking search paths. The rpath of an executable or shared library is an optional entry in the dynamic section of the ELF executable or shared libraries, with the type DT RPATH, called the DT RPATH attribute. It can be stored there at link time by the linker. Tools such as chrpath and patchelf can create or modify the entry later.
Использование записи DT_RPATH динамическим линкером
Различные динамические загрузчики для ELF по-разному реализуют использование атрибута DT RPATH.
The different dynamic linkers for ELF implement the use of the DT RPATH attribute in different ways.
Роль GNU ld
GNU Linker (GNU ld) реализует функцию, которую он называет "new dtags", которая может быть использована для вставки rpath с более низким приоритетом, чем переменная среды LD LIBRARY PATH. Если в линкере включена функция new dtags (enable new dtags), GNU ld, помимо установки атрибута DT RPATH, также устанавливает атрибут DT RUNPATH в ту же строку. Во время выполнения, если динамический загрузчик обнаруживает атрибут DT RUNPATH, он игнорирует значение атрибута DT RPATH, в результате чего сначала проверяется LD LIBRARY PATH, а пути в атрибуте DT RUNPATH используются только после этого. Динамический загрузчик ld не ищет транзитивные зависимости в расположениях DT RUNPATH, в отличие от DT RPATH. Вместо указания rpath линкеру, можно установить переменную среды LD RUN PATH для достижения того же эффекта.
The GNU Linker (GNU ld) implements a feature which it calls "new dtags", which can be used to insert an rpath that has lower precedence than the LD LIBRARY PATH environment variable. If the new dtags feature is enabled in the linker ( enable new dtags), GNU ld, besides setting the DT RPATH attribute, also sets the DT RUNPATH attribute to the same string. At run time, if the dynamic linker finds a DT RUNPATH attribute, it ignores the value of the DT RPATH attribute, with the effect that LD LIBRARY PATH is checked first and the paths in the DT RUNPATH attribute are only searched afterwards. The ld dynamic linker does not search DT RUNPATH locations for transitive dependencies, unlike DT RPATH. Instead of specifying the rpath to the linker, the environment variable LD RUN PATH can be set to the same effect.
Solaris ld.so
Динамический связчик Solaris, в частности /lib/ld.so в SunOS 5.8 и подобных системах, ищет библиотеки в каталогах, указанных в переменной окружения LD_LIBRARY_PATH, прежде чем обращаться к атрибуту DT_RPATH. Компания Sun Microsystems первой реализовала динамическую загрузку библиотек. Позже Sun добавила опцию rpath к ld и использовала её в основных библиотеках как дополнительную меру безопасности. GNU ld поступила аналогичным образом для поддержки динамических библиотек, совместимых с Sun.
The dynamic linker of Solaris, specifically /lib/ld. so of SunOS 5.8 and similar systems looks for libraries in the directories specified in the LD LIBRARY PATH variable before looking at the DT RPATH attribute. Sun Microsystems was the first to introduce dynamic library loading. Sun later added the rpath option to ld and used it in essential libraries as an added security feature. GNU ld did the same to support Sun style dynamic libraries.
Относительно безопасности
Использование rpath и runpath может создавать риски для безопасности, если указанное значение включает каталоги, находящиеся под контролем злоумышленника. Это может включать случаи, когда значение явно указывает на каталог, доступный для записи злоумышленнику, а также случаи использования относительного пути, например, через $ORIGIN или другие подобные переменные, или когда директива каталога остается незаполненной. Особенно это касается бинарных файлов setUID, где используется небезопасный путь, что позволяет злоумышленнику обманом заставить бинарный файл загружать вредоносные библиотеки из каталогов, находящихся под его контролем.
The use of rpath and also runpath can present security risks where the value applied includes directories under an attacker's control. This can include cases where the value defined explicitly references an attacker writable location but also instances where a relative path is used, either through the presence of or , via $ORIGIN etc or where a directory statement is left unpopulated. In particular, this can allow for setUID binaries to be exploited, where an insecure path is used. This can be leveraged to trick the binary into loading malicious libraries from one or other of the directories under an attacker's control.