用户将调试数据写入 root 拥有的文件

用户将调试数据写入 root 拥有的文件

我在 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 派生,派生的副本打开文件并将其自身替换为。logfilefoofoo
  • 子进程通常会继承父进程的打开文件描述符集的副本;其中包括 stdin、stdout、stderr。
  • runusersu或者sudo可以以其他用户身份运行某些程序。此类或类似工具可能会故意关闭某些文件描述符,但一般来说,至少 stdin、stdout 和 stderr 会被继承。
  • 进程可以复制描述符而无需重新打开相应的文件。 中的重定向foo 2>&1就是这样,它由 shell 在foo启动前执行,但此时文件(即无论 stdout 是什么)已被打开。

在您的“anacron 案例”中,无论哪个进程打开了文件,它都是以 root 身份运行的进程。最后一个未提升权限的实例foo能够使用该文件,因为它继承了相关文件描述符的副本。

如果foo以普通用户身份从未提升的 shell 进行调用,则没有提升的进程可以打开该文件,并且可能让其未提升的子进程继承该描述符的副本。

相关内容