gpt4 book ai didi

c++ - 将 $ORIGIN 与 setuid 应用程序一起使用不会按预期失败

转载 作者:IT老高 更新时间:2023-10-28 22:30:19 49 4
gpt4 key购买 nike

我有一个 librandom.so 库和一个 main 可执行文件,编译如下:

$ clang++ -o main main.o -lrandom -L. -Wl,-rpath,"\$ORIGIN"

它们都在同一个目录中。由于 main 在它的 rpath 中有 $ORIGIN,所以它工作正常 - ./main 返回没有错误。

现在,我将 main 设置为以 setuid 作为 root 运行:

$ sudo chown root main
$ sudo chmod a+s main
$ ./main

我预计 main 会失败,因为 $ORIGIN 未在 setuid 应用程序中展开。令人惊讶的是,它有效。

如果我从另一个目录运行 main,它确实会按预期失败:

$ cd /tmp    
$ /path/to/main
/path/to/main: error while loading shared libraries: librandom.so: cannot open shared object file: No such file or directory

为什么当我从其包含目录运行 main 时它会起作用?

最佳答案

I expected main to fail since $ORIGIN is not expanded in setuid applications.Surprisingly, it works.

Glibc 在扩展 $ORIGIN 方面有着悠久的历史,即使是 suid 二进制文件(参见例如 CVE-2010-3847 )。这背后的动机是使用 $ORIGIN 作为 rpath 的 suid 二进制文件在设计上被破坏了,因此 Glibc 开发人员从不费心去修复这个问题。一些下游发行版在库存 Glibc 之上提供了补丁,这些补丁禁用了 ORIGIN 扩展,因此具体情况取决于您的发行版。

很有趣,只有独立的 $ORIGIN 会被扩展 - 如果你用例如替换它$ORIGIN/libs 它会开始失败。

Why does it work when I run main from its containing directory?

移动文件后,$ORIGIN 将扩展至不再包含所需库的不同文件夹。

关于c++ - 将 $ORIGIN 与 setuid 应用程序一起使用不会按预期失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39486866/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com