如何使用$ ORIGIN和suid应用程序?

时间:2011-06-27 13:47:25

标签: linux shared-libraries ld rpath suid

我正在使用启用了setcap CAP_NET_RAW的python。我的python脚本导入一个共享库,其RPATH中有$ ORIGIN。由于我的python现在是一个suid应用程序,因此不评估$ ORIGIN并且库未正确加载(这是由于security leak found in glibc)。 有没有办法告诉链接器我的库路径是安全的并且还加载了库?

还有一些说明:

  1. 我只在开发阶段需要此功能。我不是在寻找生产解决方案。
  2. 以root身份工作时,一切正常。
  3. 我不想以root身份工作。
  4. 谢谢, 戴夫

2 个答案:

答案 0 :(得分:2)

您可以尝试其中之一。考虑<path-to-mylib>是求解$ORIGIN rpath引用后的绝对路径名。

  1. 在告知ldconfig找到您的库的位置后重新运行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...
    

答案 1 :(得分:1)

你试过sudo吗?

而不是$ ORIGIN,在开发期间使用固定路径,因为它们将在setuid程序上运行。不要更改主构建过程,只需使用patchelf将rpath设置为您需要的内容。您可以制作一个shell脚本,它可以执行以下操作:

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