Введение
В вычислительной технике, пребайдинг, также называемый прелинкинг, является методом оптимизации времени загрузки приложений путем разрешения символов библиотеки до запуска.
Предыстория
Большинство компьютерных программ состоят из кода, для выполнения которого требуются внешние общие библиотеки. Эти библиотеки обычно интегрируются с программой во время выполнения загрузчиком, в процессе, называемом динамической связью. Хотя динамическая ссылка имеет преимущества в размерах кода и управлении, есть и недостатки. Каждый раз, когда программа запускается, загрузчику необходимо решить (найти) соответствующие библиотеки. Поскольку библиотеки перемещаются в памяти, существует штраф за производительность разрешения. Это наказание увеличивается с каждой дополнительной библиотекой, нуждающейся в разрешении. Прелинкинг уменьшает это наказание, заранее разрешая библиотеки. После этого решение возникает только в том случае, если библиотеки изменились с момента прелинкирования, например, после возможной модернизации.
Mac OS
Mac OS хранит исполняемые файлы в формате Mach O.
Mac OS X
Mac OS X выполняет предварительную связь на стадии "Оптимизации" установки системного программного обеспечения или определенных приложений. Пребайдинг несколько раз менялся в серии Mac OS X. До 10.2 предварительная связь происходила только во время процедуры установки (вышеупомянутый этап "Оптимизации"). С 10.2 по 10.3 ОС проверяла предварительную связь при запуске приложений, и в первый раз при запуске приложения оно будет предварительно связано, что делает последующие запуска более быстрыми. Это также можно было запустить вручную, что делали некоторые установки на уровне ОС. В версии 10.4 только библиотеки ОС были предварительно связаны. В версии 10.5 и более поздних версиях Apple заменила пребайдинг механизмом совместного кэша, который обеспечивал лучшую производительность ОС.
Линукс
В Linux прелинкинг осуществляется через программу прелинк, бесплатную программу, написанную Якубом Елеником из Red Hat для двоичных файлов ELF. Результаты производительности были неоднозначными, но, похоже, это помогает системам с большим количеством библиотек, таких как KDE.
рандомизация прелинков
При запуске с опцией "R" prelink будет случайным образом выбирать базу адресов, где загружены библиотеки. Этот выбор затрудняет возвращение к libc-атаке, потому что адреса уникальны для этой системы. Причина, по которой prelink делает это, заключается в том, что возможности ядра, обеспечивающие рандомизацию расположения адресного пространства (ASLR) для библиотек, не могут использоваться в сочетании с prelink без нарушения цели prelink и принуждения динамического ссылочного устройства выполнять перемещения во время загрузки программы. Как уже было сказано, рандомизация адресов библиотеки prelink и per process не может использоваться совместно. Чтобы избежать полного удаления этого усовершенствования безопасности, prelink предоставляет собственную рандомизацию; однако это не помогает общей утечке информации, вызванной prelink. Злоумышленники, способные читать определенные произвольные файлы на целевой системе, могут обнаружить, где библиотеки загружены в привилегированных демонах; часто libc достаточно, поскольку это самая распространенная библиотека, используемая в ответ на libc-атаки. Чтение файла библиотеки, такой как libc, может помочь злоумышленнику с локальным доступом обнаружить адрес загрузки libc в каждом другом приложении системы. Поскольку большинство программ связываются с libc, файл библиотеки libc всегда должен быть читаемым; любой злоумышленник с локальным доступом может собирать информацию об адресном пространстве более привилегированных процессов. Локальный доступ обычно может быть получен через учетные записи оболочки или учетные записи веб-сервера, которые позволяют использовать CGI-скрипты, которые могут читать и выводить любой файл в системе. Уязвимости в каталоге могут использоваться злоумышленниками без учетных записей, если уязвимости в CGI-скриптах доступны. Поскольку прелинк часто выполняется периодически, обычно каждые две недели, адрес любой библиотеки имеет шанс меняться с течением времени. Прелинк часто используется в режиме инкремента, в котором уже прелинкованные библиотеки не изменяются, если это не является абсолютно необходимым, поэтому библиотека не может менять свой базовый адрес при повторном запуске прелинка. Это дает любому адресу полученный период полураспада периода, в котором выполняется прелинк. Также обратите внимание, что если установлена новая версия библиотеки, адреса меняются. Якуб Еленик указывает, что независимые от позиции исполняемые файлы (PIE) игнорируют прелинкинг на Red Hat Enterprise Linux и Fedora, и рекомендует, чтобы сетевые и SUID-программы были построены PIE, чтобы облегчить более безопасную среду.
Проблемы
Иногда прелинкинг может вызвать проблемы с контрольной точкой приложения и перезагрузкой библиотек, таких как blcr, а также других библиотек (например, OpenMPI), которые используют blcr внутри. В частности, при проверке программы на одном хосте и попытке перезагрузки на другом хосте, перезагруженная программа может потерпеть неудачу с сегментальным дефектом из-за различий в рандомизации адреса памяти библиотеки конкретного хоста. Недостоверный источник: дата=август 2013