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

发布于 2024-11-17 11:52:16 字数 383 浏览 4 评论 0原文

我正在使用启用了 setcap CAP_NET_RAW 的 python。我的 python 脚本导入一个共享库,该库的 RPATH 中有 $ORIGIN。由于我的 python 现在是一个 suid 应用程序,因此未评估 $ORIGIN 并且库未正确加载(这是由于 安全性glibc 中发现泄漏)。 有没有办法告诉链接器我的库路径是安全的并无论如何加载库?

还有几点说明:

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

谢谢, 戴夫

I'm using python with setcap CAP_NET_RAW enabled. My python script imports a shared library which has $ORIGIN in its RPATH. Since my python is now a suid app, $ORIGIN is not evaluated and the library does not load correctly (this is due to a security leak found in glibc ).
Is there a way to tell the linker that my library path is secure and load the library anyway?

A few more notes:

  1. I only need this feature in the development stage. I'm not looking for a production solution.
  2. When working as root, everything works.
  3. I do not want to work as root.

Thanks,
Dave

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

葬心 2024-11-24 11:52:17

您可以尝试其中之一。考虑 是解析 $ORIGIN rpath 引用后的绝对路径名。

  1. 告诉 ldconfig 在哪里找到您的库后重新运行 ldconfig

    $ echo "" > /etc/ld.so.conf.d/my-new-library.conf
    $ ldconfig -v
    
  2. 如果不能以 root 身份运行,请在每次执行进程时使用正确的目录导出 LD_LIBRARY_PATH

    $ echo "export LD_LIBRARY_PATH=" >>> ~/.bashrc
    $ export LD_LIBRARY_PATH=;
    $ # 然后运行你的东西...
    

You can try one of these. Consider that <path-to-mylib> is the absolute pathname after solving the $ORIGIN rpath reference.

  1. Re-run ldconfig after telling it where to find your library

    $ echo "<path-to-mylib>" > /etc/ld.so.conf.d/my-new-library.conf
    $ ldconfig -v
    
  2. If running things as root is not an option, export LD_LIBRARY_PATH with the correct directory for every execution of the process

    $ echo "export LD_LIBRARY_PATH=<path-to-mylib>" >> ~/.bashrc
    $ export LD_LIBRARY_PATH=<path-to-mylib>
    $ # then run your stuff...
    
多像笑话 2024-11-24 11:52:17

你尝试过须藤吗?

在开发过程中使用固定路径而不是 $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

Did you try sudo?

Instead of $ORIGIN, use fixed paths during development because they will work on setuid programs. Don't change your main build process, just use patchelf to set the rpath to what you need. You could make a shell script which does something like:

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

Then your binary will no longer search $ORIGIN/../lib but /devel/myprog/lib/../lib

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文