Введение

Жестко заданный путь поиска – термин программирования.

В информатике rpath обозначает путь поиска во время выполнения, жестко закодированный в исполняемом файле или библиотеке. Динамические загрузчики используют rpath для поиска необходимых библиотек. В частности, он содержит путь к общим библиотекам, встроенный в заголовок исполняемого файла (или другой общей библиотеки). Это значение заголовка RPATH (так оно называется в стандартах форматов исполняемых и связываемых файлов) может либо переопределять, либо дополнять системные пути поиска по умолчанию. rpath исполняемого файла или общей библиотеки является необязательной записью в динамическом разделе исполняемого файла или общей библиотеки ELF, имеющей тип DT_RPATH и называемой атрибутом DT_RPATH. Он может быть добавлен линкером во время сборки. Инструменты, такие как chrpath и patchelf, позволяют создавать или изменять эту запись позднее.

Использование записи DT_RPATH динамическим линкером

Различные динамические загрузчики для ELF по-разному реализуют использование атрибута DT RPATH.

Роль 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 для достижения того же эффекта.

Solaris ld.so

Динамический связчик Solaris, в частности /lib/ld.so в SunOS 5.8 и подобных системах, ищет библиотеки в каталогах, указанных в переменной окружения LD_LIBRARY_PATH, прежде чем обращаться к атрибуту DT_RPATH. Компания Sun Microsystems первой реализовала динамическую загрузку библиотек. Позже Sun добавила опцию rpath к ld и использовала её в основных библиотеках как дополнительную меру безопасности. GNU ld поступила аналогичным образом для поддержки динамических библиотек, совместимых с Sun.

Относительно безопасности

Использование rpath и runpath может создавать риски для безопасности, если указанное значение включает каталоги, находящиеся под контролем злоумышленника. Это может включать случаи, когда значение явно указывает на каталог, доступный для записи злоумышленнику, а также случаи использования относительного пути, например, через $ORIGIN или другие подобные переменные, или когда директива каталога остается незаполненной. Особенно это касается бинарных файлов setUID, где используется небезопасный путь, что позволяет злоумышленнику обманом заставить бинарный файл загружать вредоносные библиотеки из каталогов, находящихся под его контролем.