Что такое трюк с LD_PRELOAD?

Недавно я наткнулся на ссылку на него в proggit и (as на данный момент) не объяснено.

Я подозреваю, что это может быть им, но я не знаю точно.


person Hank Gay    schedule 08.01.2009    source источник
comment
На самом деле это не ответ, поэтому я не буду публиковать его как один, но ... Стивен Келл использует LD_PRELOAD для своей библиотеки liballocs в этом видео, и если вы посмотрите предыдущие фрагменты, вы можете лучше понять, как / почему. Похоже, что liballocs используются для того, чтобы другие динамические языки могли общаться друг с другом. В этом докладе объясняются некоторые глубокие внутренние аспекты. youtu.be/LwicN2u6Dro?t=24m10s   -  person Elijah Lynn    schedule 29.02.2016


Ответы (9)


Если вы установите LD_PRELOAD в качестве пути к общему объекту, этот файл будет загружен раньше любой другой библиотеки (включая среду выполнения C, libc.so). Итак, чтобы запустить ls с вашей специальной реализацией malloc(), сделайте следующее:

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
person JesperE    schedule 08.01.2009
comment
Я понятия не имел, что это существует ... похоже, что это будет основным вектором атак на безопасность. Есть идеи, как это защищено? - person rmeador; 09.01.2009
comment
Это обеспечивается тем, что загрузчик игнорирует LD_PRELOAD, если ruid! = Euid - Джошуа - person Joshua; 09.01.2009
comment
@ Джошуа: что такое ruid и euid? - person heinrich5991; 04.11.2012
comment
@ heinrich5991 Настоящие и эффективные идентификаторы пользователей: lst.de/~okir/blackhats/node23. html - person gsingh2011; 02.03.2013
comment
Necropost: @Joshua какие-нибудь советы, как отключить настройку безопасности? В настоящее время работаю над CTF. И я хочу, чтобы они использовали специальный эксплойт для sudo (CVE: 2012-0809). - person Stolas; 07.06.2013
comment
Следует иметь в виду одну важную вещь: обычно вы хотите указать абсолютный путь к LD_PRELOAD. Причина в том, что это переменная среды, она наследуется дочерними процессами, которые могут иметь рабочий каталог, отличный от родительского процесса. Таким образом, любой относительный путь не сможет найти библиотеку для предварительной загрузки. - person Frerich Raabe; 10.09.2013
comment
lst.de/ ссылка 403 доступ запрещен, вот https://web.archive.org/web/20080318213813/http://www.lst.de/~okir/blackhats/node23.html - person Elijah Lynn; 29.02.2016
comment
@SathOkh: # touch /etc/shadow ... touch: cannot touch '/etc/shadow': Permission denied ... # whoami ... root ... # ps -u -p $$ | tail -n 1 | cut -d ' ' -f 1 ... keithb ... - person inetknght; 03.04.2017
comment
Эксплойт @SathOkh lcamtuf - это шутка. Он делает вид, что его * uid равны нулю, но на самом деле это не так. - person Stéphane Gourichon; 21.03.2019
comment
Nvm, моя ошибка :( - person SathOkh; 21.03.2019
comment
Одно изящное приложение LD_PRELOAD - это stderred, которое заставляет все, что написано в stderr, окрашиваться в красный цвет в терминале. - person Roger Dahl; 04.03.2021
comment
См. Также это руководство, чтобы узнать, как создать *.so общий объект: cprogramming.com /tutorial/shared-libraries-linux-gcc.html. - person Gabriel Staples; 29.06.2021

Вы можете переопределить символы в библиотеках материалов, создав библиотеку с такими же символами и указав библиотеку в LD_PRELOAD.

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

person Joshua    schedule 08.01.2009
comment
Некоторые используют его для указания библиотек в нестандартных местах ... Неужели? Похоже, некоторые люди используют это неправильно! - person Tom; 10.06.2011
comment
LD_PRELOAD может в силу порядка загрузки перехватывать заданные приложением жестко заданные пути. - person Joshua; 10.06.2011
comment
Будет ли предварительная загрузка другой версии библиотеки - неправильное использование, если они совместимы? - person z0r; 26.11.2013
comment
Я видел, как он использовался для загрузки отладочного или инструментального варианта или для загрузки библиотеки, которая делает что-то совершенно отличное от базовой библиотеки, как будто для эмуляции какой-то другой системы. - person Joshua; 26.11.2013
comment
В случае, когда библиотеки не скомпилированы правильно (использовались для того, чтобы постоянно сталкиваться с этим с mysql, когда у него была слабая связь с общей libmysql_client, которая перезаписывала символическую ссылку более старой версии - в зависимости от того, какую версию perl вы использовали, вам нужно было указать / force с помощью LD_PRELOAD .. полезный трюк. Если я правильно помню, valgrind использует эту технику для обеспечения возможности отладки двоичных файлов без необходимости перекомпиляции .. это весьма полезно. - person synthesizerpatel; 27.02.2014
comment
@ z0r: Это не злоупотребление, если вы подчиняетесь прихотям плохого системного администратора и не можете установить что-либо самостоятельно. :п - person synthesizerpatel; 27.02.2014

С LD_PRELOAD вы можете отдавать приоритет библиотекам.

Например, вы можете написать библиотеку, реализующую malloc и free. И при загрузке их с помощью LD_PRELOAD ваши malloc и free будут выполняться, а не стандартные.

person Ronny Brendel    schedule 08.01.2009
comment
а что, если программа использует calloc? разве это не все испортит? - person Janus Troelsen; 30.09.2014
comment
@JanusTroelsen, если библиотека, которую вы пишете, не реализует определенную часть, эта часть будет загружена из исходной библиотеки. - person Woodrow Barlow; 01.10.2014
comment
@JanusTroelsen, другими словами, LD_PRELOAD позволяет вам указать, какая реализация конкретного символа символа будет использоваться. Если предварительно загруженная библиотека не экспортирует символ, он будет найден в другом месте. - person sherrellbc; 07.04.2017
comment
@JanusTroelsen: Оказывается, malloc и free специально разработаны в glibc, чтобы позволить это, и сток calloc умеет вызывать ваш импортированный malloc. Не пытайтесь использовать это с другими функциями. Это не сработает так хорошо. - person Joshua; 26.06.2019

Как уже упоминалось многими, использование LD_PRELOAD для предварительной загрузки библиотеки. Кстати, вы можете ПРОВЕРИТЬ, доступен ли параметр с помощью команды ldd.

Пример: предположим, вам нужно предварительно загрузить свой собственный libselinux.so.1.

> ldd /bin/ls
    ...
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)

Таким образом, установите среду предварительной загрузки:

  export LD_PRELOAD=/home/patric/libselinux.so.1

Проверьте свою библиотеку еще раз:

>ldd /bin/ls
    ...
    libselinux.so.1 =>
    /home/patric/libselinux.so.1 (0x00007fb9245d8000)
    ...
person Patric    schedule 09.12.2015

LD_PRELOAD перечисляет совместно используемые библиотеки с функциями, которые отменяют стандартный набор, как это делает /etc/ld.so.preload. Они реализованы загрузчиком /lib/ld-linux.so. Если вы хотите переопределить только несколько выбранных функций, вы можете сделать это, создав замещающий объектный файл и установив LD_PRELOAD; функции в этом объектном файле переопределят только эти функции, оставив другие без изменений.

Для получения дополнительной информации об общих библиотеках посетите http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html.

person Rajesh    schedule 24.07.2012

mylib.so в env легко экспортировать:

$ export LD_PRELOAD=/path/mylib.so
$ ./mybin

отключить :

$ export LD_PRELOAD=
person JulienGenoud    schedule 04.02.2014

Вот подробное сообщение в блоге о предварительной загрузке:

https://blog.cryptomilk.org/2014/07/21/what-is-preloading/

person asn    schedule 11.08.2014
comment
Спасибо, что разместили свой ответ! Обратите внимание, что вы должны опубликовать основные части ответа здесь, на этом сайте, иначе ваше сообщение может быть удалено. См. FAQ, где упоминаются ответы, которые являются «чуть больше, чем ссылка». Вы все равно можете включить ссылку, если хотите, но только в качестве «ссылки». Ответ должен стоять сам по себе, без ссылки. - person Taryn; 06.10.2014

когда используется LD_PRELOAD, этот файл будет загружен до любой другой $export LD_PRELOAD=/path/lib библиотеки, которая будет предварительно загружена, даже это можно использовать в программах

person Sumith Senarathne    schedule 30.01.2019

Используя путь LD_PRELOAD, вы можете заставить загрузчик приложения загружать предоставленный общий объект вместо предоставленного по умолчанию.

Разработчики используют это для отладки своих приложений, предоставляя разные версии общих объектов.

Мы использовали его для взлома определенных приложений, переопределив существующие функции с помощью подготовленных общих объектов.

person dnahc araknayirp    schedule 31.05.2015