Общая библиотека Linux, которая сама себя выгружает - PullRequest
1 голос
/ 15 мая 2019

Моя цель - подключить несколько функций glibc внутри определенной группы процессов, расположенных на определенном пути.Для этого есть несколько методов (gdb, strace и т. Д.).Но мне нужно, чтобы это было сделано автоматически и надежно на самой ранней стадии, чтобы я не пропустил ни одного звонка.Поэтому я решил пойти с LD_PRELOAD методом.И мне нужно, чтобы это делалось автоматически без какого-либо вмешательства пользователя, поэтому введение LD_PRELOAD в среду довольно хрупко и может быть отменено пользователем.Поэтому я решил указать свою библиотеку внутри /etc/ld.so.preload - это прекрасно работает.

Внутри кода библиотеки ctor я проверяю, является ли процесс, в котором я нахожусь, тем процессом, который мне нужен, и выполняю необходимые перехваты, иначе этоno-op и библиотека просто мертвый вес.

__attribute__((constructor)) void my_lib_ctor()
{
  if (is_relevant_process())
  {
    do_the_wiring();
  }
}

Библиотека не экспортирует никаких символов, и все внутри скрыто по умолчанию (-fvisibility=hidden флаг компилятора), поэтому никаких реальных зависимостей нетв мою библиотеку из любого процесса.Таким образом, в случае внедрения в несвязанный процесс его можно безопасно выгрузить.

Для процедуры обновления требуется выгрузка - если требуется обновить библиотеку, ее не следует загружать в долго выполняющиеся процессы - в противном случае они вылетятна замену библиотеки (что ожидается).Интересующие процессы недолговечны и запускаются пользователем, поэтому воздействие на них незначительно.

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

И если есть другие методы для автоматическии надежно перехватывать вызовы glibc на ранней стадии (до выполнения приложения main()), не затрагивая интересующее его приложение, я буду рад, если вы дадите мне знать о них (небольшое изменение настроек ОС, например, предзагрузка,все в порядке).Спасибо!

1 Ответ

1 голос
/ 15 мая 2019

Я думаю, что у вас есть некоторые недоразумения, и то, что вы просите, просто не имеет смысла:

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

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

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

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

А если есть другие методы для автоматического и надежного перехвата вызовов glibc на ранней стадии

Ваше внимание на «надежно» звучит подозрительно близко к желанию использовать этот механизм для навязывания политики / контроля доступа таким образом, чтобы потенциально вредоносные приложения не могли обойти. Это принципиально невозможно на уровне библиотеки. Вам нужно будет запустить их в какой-то реальной песочнице, чтобы достичь этого (например, заменив файлы скриптами-обертками, которые вызывают их в соответствующей песочнице).

...