предварительная ссылка
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В технике вычислительной предварительная привязка , также называемая предварительным связыванием , — это метод оптимизации времени загрузки приложения путем разрешения символов библиотеки перед запуском.
Фон
[ редактировать ]Большинство компьютерных программ состоят из кода, для выполнения которого требуются внешние общие библиотеки . Эти библиотеки обычно интегрируются с программой во время выполнения с помощью загрузчика в процессе, называемом динамическим связыванием .
Хотя динамическое связывание имеет преимущества в размере кода и управлении, есть и недостатки. Каждый раз при запуске программы загрузчику необходимо разрешить (найти) соответствующие библиотеки. Поскольку библиотеки перемещаются в памяти, разрешение приводит к снижению производительности. Этот штраф увеличивается с каждой дополнительной библиотекой, требующей разрешения.
Предварительное связывание снижает этот штраф за счет предварительного разрешения библиотек. После этого разрешение происходит только в том случае, если библиотеки изменились с момента предварительного связывания, например, после обновления.
MacOS
[ редактировать ]Mac OS хранит исполняемые файлы в Mach-O формате файлов .
Мак ОС Х
[ редактировать ]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 предоставляет собственную рандомизацию; однако это не помогает при общей утечке информации, вызванной предварительной ссылкой. Злоумышленники, имеющие возможность читать определенные произвольные файлы в целевой системе, могут обнаружить, где в привилегированных демонах загружаются библиотеки; часто достаточно библиотеки 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] [ ненадежный источник? ]
См. также
[ редактировать ]- Динамическая привязка
- Библиотека (вычисления)
- Линкер (вычисления)
- Загрузчик (вычислительный)
- Объектный файл
- Перебазирование
- Переезд
- Статическая библиотека
- Предварительная выборка
Ссылки
[ редактировать ]- ^ «Страница руководства для update_prebinding» . Связь с разработчиками Apple . Эппл Компьютер Инк.
- ^ Краста, Джеймс (17 мая 2004 г.). «Предварительное связывание ELF и что оно может вам дать» . Проверено 10 мая 2006 г.
- ^ блкр
- ^ «Часто задаваемые вопросы по BLCR» . Проверено 5 января 2012 г.
- ^ Херси, Джош (29 декабря 2011 г.). «segfault при возобновлении работы на другом хосте» . Пользователи OpenMPI (список рассылки) . Проверено 5 января 2012 г.
- Подробное объяснение предварительной привязки
Дальнейшее чтение
[ редактировать ]- Елинек, Якуб (4 марта 2004 г.). «Прелинк» (PDF) . Проект 0.7 . Проверено 14 июля 2006 г.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь )
Внешние ссылки
[ редактировать ]- Linux по администрированию и привилегированным командам Руководство : предварительное связывание общих библиотек и двоичных файлов ELF для ускорения запуска –
- Официальные релизы Якуба Елинека
- Yocto Project Вилка Prelink-Cross
- Риис, Квинтин (15 июня 2008 г.). «Ускорьте загрузку приложений в Ubuntu Linux Hardy Heron, используя предварительную ссылку: HOWTO и тесты (упоминание на форумах ubuntuforum/исходная ссылка не работает)» . Проверено 22 августа 2008 г.
- Джонс, Стефан (2 апреля 2007 г.). «Руководство по предварительной ссылке на Gentoo Linux» . Проверено 10 мая 2006 г.
- Джон Ричард Мозер (5 июля 2006 г.). «Рандомизация предварительной ссылки и адресного пространства» . Проверено 13 июля 2006 г.