Как использовать $ORIGIN и приложение suid?
Я использую python с включенным setcap CAP_NET_RAW. Мой скрипт на python импортирует разделяемую библиотеку, которая имеет $ORIGIN в RPATH. Поскольку мой python теперь является приложением suid, $ORIGIN не оценивается, и библиотека загружается неправильно (это происходит из-за утечки безопасности, обнаруженной в glibc). Есть ли способ сообщить компоновщику, что мой путь к библиотеке безопасен, и загрузить библиотеку в любом случае?
Еще несколько заметок:
- Эта функция мне нужна только на стадии разработки. Я не ищу производственное решение.
- При работе от имени root все работает.
- Я не хочу работать как root.
Спасибо дэйв
2 ответа
Вы можете попробовать один из них. Считают, что <path-to-mylib>
является абсолютным путем после решения $ORIGIN
ссылка на путь
Перезапустите ldconfig, сообщив, где найти вашу библиотеку.
$ echo "<path-to-mylib>" > /etc/ld.so.conf.d/my-new-library.conf $ ldconfig -v
Если запускать вещи от имени пользователя 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