如果我运行 su,它会询问目标用户的密码。如果我以 root 身份运行它,它不会要求输入密码。但是如果我在 fakeroot 中运行它,它怎么可能会要求输入密码呢? fakeroot不应该让所有程序都认为你是root吗?对于我自己的程序,执行此操作的唯一方法是尝试运行 su 并查看返回代码。但是 su 是怎么做到的呢?
答案1
su
什么也没检测到。
从man fakeroot
:
fakeroot 的工作原理是将文件操作库函数( 等)替换
chmod(2)
为stat(2)
模拟真实库函数的效果(如果用户确实是 root)。
这些包装器函数位于共享库/usr/lib/*/libfake‐root-\*.so
或平台上的类似位置。共享对象是通过LD_PRELOAD
动态加载器的机制来加载的。 (看ld.so(8)
)
su
,作为 setuid 可执行文件,始终以 root 身份运行 - 但不关心LD_PRELOAD
¹。因此,虽然“普通”程序被告知它们以 root 身份运行,并替换了它们所要求的函数,但su
从未看到这种修改。所以,su
就像平常一样运行。
¹ 这将是一个可怕的安全漏洞;你可以设置LD_PRELOAD
包含一个库来执行你想做的任何事情,如果你可以运行它会自动以 root 身份执行任何setuid 可执行文件
答案2
fakeroot
(请参阅)的文档man fakeroot
似乎为您回答了这个问题:
描述
fakeroot
在似乎具有文件操作 root 权限的环境中运行命令。
和,
例子只有用户无论如何都能做到的效果
joost
才会真实发生
最后,
安全方面
fakeroot
是一个常规的、非 setuid 的程序。它不会增强用户的权限,也不会降低系统的安全性。
在第一个块中,注意这个词出现。在示例摘录中,将用户joost
视为您。在最后一部分中,有一个明确的声明,它fakeroot
不会以任何方式增加权限或降低安全性。具体来说,这意味着它不会改变真实的su
工作方式。