Предварительная ссылка - Prelink

В вычисление, предварительная привязка, также называемый предварительное связывание, это метод оптимизации времени загрузки приложения путем разрешения символов библиотеки перед запуском.

Фон

Наиболее компьютерные программы состоят из кода, который требует внешнего общие библиотеки выполнить. Эти библиотеки обычно интегрируются с программой во время выполнения погрузчик, в процессе, называемом динамическое связывание.

Хотя динамическое связывание имеет преимущества в размере кода и управлении, есть и недостатки. Каждый раз, когда программа запускается, загрузчику необходимо разрешить (найти) соответствующие библиотеки. Поскольку библиотеки перемещаются в памяти, разрешение снижается в производительности. Этот штраф увеличивается для каждой дополнительной библиотеки, требующей разрешения.

Предварительное связывание снижает этот штраф за счет предварительного разрешения библиотек. Впоследствии разрешение происходит только в том случае, если библиотеки были изменены с момента предварительного связывания, например, после обновления.

Mac OS

Магазины Mac OS исполняемые файлы в Мачо формат файла.

Mac OS X

Mac OS X выполняет предварительную привязку на этапе «Оптимизация» установки системного программного обеспечения или определенных приложений.

Предварительная привязка менялась несколько раз в серии Mac OS X. До версии 10.2 предварительная привязка выполнялась только во время процедуры установки (вышеупомянутый этап «Оптимизация»). С 10.2 по 10.3 ОС проверяла предварительное связывание во время запуска для приложений, и при первом запуске приложения оно было предварительно связано, что ускоряло последующие запуски. Это также можно было запустить вручную, что и делали некоторые установки на уровне ОС. В 10.4 предварительно были привязаны только библиотеки ОС. В 10.5 и более поздних версиях Apple заменила предварительную привязку на dyld общий тайник механизм,[1] что обеспечило лучшую производительность ОС.

Linux

В Linux предварительное связывание выполняется через предварительная ссылка программа, свободный программа написано Якуб Елинек из Красная шляпа за ELF двоичные файлы.

Результаты производительности были неоднозначными[требуется разъяснение ], но, похоже, помогает системам с большим количеством библиотек, таких как KDE.[2]

рандомизация до ссылки

prelink (при запуске с опцией "-R") случайным образом выберет базу адресов, по которой загружаются библиотеки. Это затрудняет выполнение возврат к libc атака на систему, поскольку используемые адреса уникальны для этой системы. Причина, по которой prelink делает это, заключается в том, что средства ядра предоставляют рандомизация разметки адресного пространства (ASLR) для библиотек нельзя использовать вместе с prelink, не нарушая цели prelink и не заставляя динамический компоновщик выполнять перемещения во время загрузки программы.

Как указано, предварительная ссылка и рандомизация адресов библиотеки для каждого процесса не могут использоваться вместе. Чтобы избежать полного удаления этого улучшения безопасности, prelink предоставляет собственную рандомизацию; однако это не помогает утечке общей информации, вызванной prelink. Злоумышленники, имеющие возможность читать определенные произвольные файлы в целевой системе, могут обнаружить, где загружены библиотеки в привилегированных демонах; часто бывает достаточно libc, поскольку это наиболее распространенная библиотека, используемая в атаки с возвратом к libc.

Читая файл общей библиотеки, такой как libc, злоумышленник с локальным доступом может обнаружить адрес загрузки libc в любом другом приложении в системе. Поскольку большинство программ ссылаются на libc, файл библиотеки libc всегда должен быть доступен для чтения; любой злоумышленник с локальным доступом может собирать информацию об адресном пространстве процессов с более высокими привилегиями. Локальный доступ обычно может быть получен с помощью учетных записей оболочки или учетных записей веб-сервера, которые позволяют использовать сценарии CGI, которые могут читать и выводить любой файл в системе.[нужна цитата ] Уязвимости, связанные с обходом каталогов, могут использоваться злоумышленниками без учетных записей, если доступны уязвимости сценария CGI.

Поскольку предварительная ссылка часто запускается периодически, обычно каждые две недели, адрес любой данной библиотеки может со временем измениться. prelink часто используется в инкрементном режиме, в котором уже предварительно связанные библиотеки не изменяются без крайней необходимости, поэтому библиотека не может изменить свой базовый адрес при повторном запуске prelink. Это дает любому полученному адресу период полураспада периода, в течение которого выполняется предварительная ссылка. Также обратите внимание, что при установке новой версии библиотеки адреса меняются.

Якуб Елинек отмечает, что независимые от позиции исполняемые файлы (PIE) игнорировать предварительную ссылку на Red Hat Enterprise Linux и Fedora, и рекомендует, чтобы сеть и SUID программы должны быть построены PIE для обеспечения более безопасной среды.

вопросы

Иногда предварительная ссылка может вызвать проблемы с контрольная точка приложения и перезапустите библиотеки, например blcr,[3] а также другие библиотеки (например, OpenMPI ) которые используют blcr внутренне. В частности, при установке контрольной точки программы на одном хосте и попытке перезапуска на другом хосте перезапущенная программа может завершиться с ошибкой. segfault из-за различий в рандомизации адресов памяти библиотеки для конкретных хостов.[4][5]

Смотрите также

Рекомендации

  1. ^ "Ручная страница для update_prebinding". Подключение разработчика Apple. Apple Computer Inc.
  2. ^ Краста, Джеймс (2004-05-17). "Предварительная ссылка на ELF и что она может для вас сделать". Получено 2006-05-10.
  3. ^ blcr
  4. ^ "BLCR FAQ". Получено 2012-01-05.
  5. ^ Херси, Джош (29 декабря 2011 г.). "segfault при возобновлении на другом хосте". Пользователи OpenMPI (Список рассылки). Получено 2012-01-05.[ненадежный источник? ]

дальнейшее чтение

внешняя ссылка