LD_PRELOAD с двоичным файлом setuid - PullRequest
8 голосов
/ 10 февраля 2012

Я пытаюсь использовать LD_PRELOAD для предварительной загрузки библиотеки с приложением, имеющим права доступа setuid. Сначала пробовал LD_PRELOAD, и казалось, что он игнорируется двоичным файлом setuid, хотя он работал, когда я пробовал его с другими, такими как ls, dir и т. Д.

Из документации LD_PRELOAD:

   LD_PRELOAD
          A whitespace-separated list of additional, user-specified, ELF shared
          libraries to be loaded before all others.  This can be used to
          selectively override functions in other shared libraries.  For set-
          user-ID/set-group-ID ELF binaries, only libraries in the standard
          search directories that are also set-user-ID will be loaded.

Я пытался поместить библиотеку в /usr/lib, /usr/local/lib и /usr/lib64 с разрешениями setuid согласно этой документации выше, но, похоже, она все еще не работает. Если я не дам LD_PRELOAD путь в случае, когда у меня есть библиотека в стандартных директориях с setuid, она не может найти библиотеку. Если я даю ему путь, он ничего не делает.

Двоичный файл setuid является двоичным файлом с правами доступа root, который запускается в пользовательской оболочке без полномочий root. Какие-нибудь мысли? Не уверен, что мне не хватает пути, переменной среды или я неправильно понимаю приведенную выше документацию.

Редактировать : запрошенные разрешения:

Библиотека:

-rwsr-sr-x 1 root root 72580 2012-02-10 07:51

App:

-rwsr-xr-x 1 root root 137517601 2012-02-10 

env | grep LD
LD_LIBRARY_PATH=/usr/lib (I added this manually myself, usually LD_LIBRARY_PATH is empty)

Ответы [ 4 ]

10 голосов
/ 22 июня 2012

LD_PRELOAD нельзя использовать с setuid.Это функция безопасности в Linux.Для справки проверьте эту статью , в которой подробно рассказывается, как использовать LD_PRELOAD для замены некоторых вызовов библиотеки пользовательским кодом на примере malloc.

3 голосов
/ 11 февраля 2012

Если вы используете SELinux, это может быть связано с этим.Один из вспомогательных векторов ELF, которые поддерживает glibc, - AT_SECURE.Этот конкретный параметр (который по умолчанию равен 0 или 1) указывает динамическому компоновщику ELF сбрасывать различные переменные среды, которые считаются потенциально опасными для вашей системы.Одним из них является LD_PRELOAD.Обычно эта санация среды выполняется при вызове приложения setuid / setgid (для предотвращения очевидных уязвимостей).SELinux также улучшил эту очистку до тех пор, пока приложение не запускает переход домена в SELinux (скажем, от sysadm_t до mozilla_t через двоичный файл с меткой moz или любым другим);SELinux устанавливает флаг AT_SECURE для загруженного приложения (в примере mozilla / firefox).

Разрешение noatsecure отключает действия по очистке среды для определенного перехода.Вы можете сделать это с помощью следующего оператора allow (как это будет применяться в приведенном выше примере):

allow sysadm_t mozilla_t:process { noatsecure };
0 голосов
/ 21 мая 2019

В системе с glibc вы можете предварительно загрузить библиотеку другим поддерживаемым способом: добавив библиотеку в /etc/ld.so.preload.Этот не страдает от ограничений LD_PRELOAD.

В частности, таким образом я смог предварительно загрузить (бесполезно, просто чтобы продемонстрировать, что это работает) libgtk3-nocsd.so в /usr/bin/passwd, и,когда я запускал passwd ruslan, библиотека отображалась в /proc/<PID_OF_PASSWD>/maps, в то время как passwd ожидала ввода текущего пароля.

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

0 голосов
/ 10 февраля 2012

Установите вашу библиотеку следующим образом:

  • расположение: / lib или / usr / lib
  • права доступа: root: root
  • имеет setuid и setgid на

Убедитесь, что LD_PRELOAD экспортируется в вашу среду

$ export LD_PRELOAD=/usr/lib/yourlib.so
$ env | grep LD_PRELOAD  # verify

Затем запустите вашу программу.

...