Как использовать $ORIGIN и приложение suid?

Я использую python с включенным setcap CAP_NET_RAW. Мой скрипт на python импортирует разделяемую библиотеку, которая имеет $ORIGIN в RPATH. Поскольку мой python теперь является приложением suid, $ORIGIN не оценивается, и библиотека загружается неправильно (это происходит из-за утечки безопасности, обнаруженной в glibc). Есть ли способ сообщить компоновщику, что мой путь к библиотеке безопасен, и загрузить библиотеку в любом случае?

Еще несколько заметок:

  1. Эта функция мне нужна только на стадии разработки. Я не ищу производственное решение.
  2. При работе от имени root все работает.
  3. Я не хочу работать как root.

Спасибо дэйв

2 ответа

Вы можете попробовать один из них. Считают, что <path-to-mylib> является абсолютным путем после решения $ORIGIN ссылка на путь

  1. Перезапустите ldconfig, сообщив, где найти вашу библиотеку.

    $ echo "<path-to-mylib>" > /etc/ld.so.conf.d/my-new-library.conf
    $ ldconfig -v
    
  2. Если запускать вещи от имени пользователя root не вариант, экспортируйте LD_LIBRARY_PATH с правильным каталогом для каждого выполнения процесса

    $ echo "export LD_LIBRARY_PATH=<path-to-mylib>" >> ~/.bashrc
    $ export LD_LIBRARY_PATH=<path-to-mylib>
    $ # then run your stuff...
    

Ты пробовал sudo?

Вместо $ORIGIN используйте фиксированные пути во время разработки, потому что они будут работать с программами setuid. Не меняйте основной процесс сборки, просто используйте patchelf, чтобы установить для rpath то, что вам нужно. Вы могли бы сделать скрипт оболочки, который делает что-то вроде:

ln=`readelf -d |grep RPATH`
IFS=:
set -- $ln
newrpath=`echo $2 |sed 's/\$ORIGIN/\/devel\/myprog\/lib/'`
patchelf --set-rpath newrpath myprogram

Тогда ваш двоичный файл больше не будет искать $ORIGIN/../lib, а /devel/myprog/lib/../lib

Другие вопросы по тегам