stringtranslate.com

предварительная ссылка

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

Фон

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

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

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

ОС Mac

Mac OS хранит исполняемые файлы в формате Mach-O .

Mac OS X

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

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

линукс

В Linux предварительное связывание выполняется с помощью программы prelink — бесплатной программы , написанной Якубом Елинеком из Red Hat для двоичных файлов ELF .

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

рандомизация предварительной ссылки

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

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

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

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

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

Проблемы

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

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

Ссылки

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

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

Внешние ссылки