Как предотвратить LD_PRELOAD в двоичном файле? - PullRequest
0 голосов
/ 28 февраля 2020

Я пишу двоичный код C. Как я могу запретить другому пользователю использовать LD_PRELOAD в моем двоичном файле?

При использовании LD_PRELOAD, есть ли какой-нибудь сигнал, который я могу обработать и сломать программу?

Если я скомпилирую двоично статически, я слышал, что LD_PRELOAD не будет работать, верно?

Есть ли другой способ?

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

Точно так же, как скрипты имеют интерпретатор, заданный с помощью механизма #!, исключительные ситуации работают аналогично. Исполняемые файлы ELF имеют поле в заголовке программы, тип которого PT_INTERP, и оно дает путь к «интерпретатору» для исполняемого файла. Этот «интерпретатор» - это динамический линкер c, ld-linux.so. Этот компоновщик обработает заголовок и отобразит файл в память и все остальное.

Именно этот загрузчик ld-linux.so реализует функцию LD_PRELOAD.

Если вы создаете пользовательскую версию этой программы, в которой поддержка LD_PRELOAD удалена или отключена, а затем укажите заголовок программы вашего исполняемого файла, чтобы использовать этот ld-linux.so вместо обычного в качестве «интерпретатора», вы сможете победить LD_PRELOAD.

Если я статически скомпилировал бинарный файл, я услышал, что LD_PRELOAD не будет работать, верно?

Хотя это в основном верно, stati c связывание не поддерживается на Glib c. Сегодня, если вы хотите распространять статически связанный исполняемый файл, вы рассматриваете возможность использования альтернативной C библиотеки , такой как Musl : ", разработанной с нуля для stati c linking, musl тщательно избегайте извлечения большого количества кода или данных, которые приложение не будет использовать. "

0 голосов
/ 28 февраля 2020

Выполнение следующего, хотя и надуманного, не позволит пользователю использовать LD_PRELOAD для двоичного файла:

  1. Установить владельца двоичного файла для этого пользователя.
  2. Установите бит setuid и сделайте файл исполняемым для владельца двоичного файла только с помощью chmod 4100 <binary>
  3. Установите бит immutable на с sudo chattr +i <binary>, я думаю, что оба xfs и ext4 поддерживают его.
0 голосов
/ 28 февраля 2020
Предварительная загрузка

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

#include <stdlib.h>
#include <stdio.h>

int main(int argv, char *argv) {
    if (getenv("LD_PRELOAD")) {
        fprintf(stderr, "Sorry, you can't use ld preload with this program.\n");
        exit(1);
    }
    ...
}

Это будет работать, если предварительно загруженная библиотека не предоставит свой собственный getenv(), который скрывает эту переменную.

...