【问题标题】:How to use $ORIGIN and suid application?如何使用 $ORIGIN 和 suid 应用程序?
【发布时间】:2011-09-23 13:03:42
【问题描述】:

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

还有一些注意事项:

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

谢谢, 戴夫

【问题讨论】:

  • @Amir Rachum,在执行export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/yourlibrary"后运行你的程序

标签: linux shared-libraries ld rpath suid


【解决方案1】:

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

  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...
    

【讨论】:

    【解决方案2】:

    你试过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

    【讨论】:

    • sudo 有效,但我不想以 root 身份运行。我在构建过程中考虑过使用 patchelf ,但它很老套。没有类似 Solaris 的 crle 工具吗?那将是完美的。
    • @DaveyJones,这可能为时已晚……但我见过一些例子,其中一个文本文件被命名为libblah.so,但它似乎不是二进制文件类似于您在 Solaris 中看到的 ld.config 脚本。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多