我在 Linux Mint 21.2 Victoria 系统上运行 GNU bash,版本 5.1.16(1)-release(x86_64-pc-linux-gnu)。
如果有人能帮我解释一下,我将不胜感激,因为我找不到任何相关文档。一切都按我期望的方式运行,但我不知道是什么机制允许“用户”在未经许可的情况下写入“根”文件。
如果需要的话我很乐意提供进一步的文件。
概要:
anacron 以“root”身份调用“foo”,并重定向 2>&1 来创建/覆盖调试文件
'root' 调用 'foo',并调用 'runuser' 以 'user' 身份调用 'foo',重定向 2>&1 来创建/覆盖或附加调试文件
“runuser”重定向到同一个文件还是不同的文件并不重要
“runuser”重定向是否创建/覆盖或附加到文件并不重要
anacron/runuser 重定向的输出文件归 'root' 所有 - 权限为 '0644')
'root' 对 'foo' 的调用退出,并写入其拥有的调试文件
“用户”调用“foo”运行,附加/覆盖“root”拥有的调试文件
“用户”对“foo”的调用退出,并写入“root”拥有的调试文件
在终端会话中以“用户”身份调用“foo”并重定向到“root”拥有的调试文件时会出现“权限被拒绝”的情况
答案1
一些事情:
- 当进程尝试打开文件时,所有权和模式很重要。
- 类似 中的重定向由 shell 在启动之前
foo >logfile
执行(即打开) 。shell 派生,派生的副本打开文件并将其自身替换为。logfile
foo
foo
- 子进程通常会继承父进程的打开文件描述符集的副本;其中包括 stdin、stdout、stderr。
runuser
,su
或者sudo
可以以其他用户身份运行某些程序。此类或类似工具可能会故意关闭某些文件描述符,但一般来说,至少 stdin、stdout 和 stderr 会被继承。- 进程可以复制描述符而无需重新打开相应的文件。 中的重定向
foo 2>&1
就是这样,它由 shell 在foo
启动前执行,但此时文件(即无论 stdout 是什么)已被打开。
在您的“anacron 案例”中,无论哪个进程打开了文件,它都是以 root 身份运行的进程。最后一个未提升权限的实例foo
能够使用该文件,因为它继承了相关文件描述符的副本。
如果foo
以普通用户身份从未提升的 shell 进行调用,则没有提升的进程可以打开该文件,并且可能让其未提升的子进程继承该描述符的副本。