AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 454686
Accepted
ng.newbie
ng.newbie
Asked: 2018-07-12 04:24:00 +0800 CST2018-07-12 04:24:00 +0800 CST 2018-07-12 04:24:00 +0800 CST

fakeroot 如何不是 Linux 中的安全漏洞?

  • 772

在阅读了这个问题的一些非常好的答案之后,我仍然不清楚为什么你要假装自己是 root 却没有获得任何真正成为 root 的好处。

到目前为止,我可以收集到的是,fakeroot 用于为解压缩/tar 时需要 root 的文件授予所有权。我的问题是,为什么你不能用 chown 来做呢?

此处的 Google Groups 讨论指出,您需要 fakeroot 来编译 Debian 内核(如果您想从非特权用户那里编译)。我的评论是,您需要成为 root 才能编译的原因可能是因为没有为其他用户设置读取权限。如果是这样,fakeroot 允许编译不是安全违规吗(这意味着 gcc 现在可以读取用于 root 的文件)?

这里的这个答案描述了实际的系统调用是使用用户的真实 uid/gid 进行的,那么 fakeroot 又有什么帮助呢?

fakeroot 如何阻止 Linux 上不必要的权限提升?如果 fakeroot 可以欺骗 tar 制作一个属于 root 的文件,为什么不使用 SUID 做类似的事情呢?

根据我收集到的信息,当您想将构建的任何包文件的所有者更改为 root 时,fakeroot 非常有用。但是你可以用 chown 做到这一点,那么我对这个组件的使用方式缺乏了解吗?

linux chown
  • 3 3 个回答
  • 7573 Views

3 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-07-12T04:50:33+08:002018-07-12T04:50:33+08:00

    到目前为止,我可以收集到的是,fakeroot 用于为解压缩/tar 时需要 root 的文件授予所有权。我的问题是,为什么你不能用 chown 来做呢?

    因为您不能只使用 来做到这一点chown,至少不能作为非 root 用户。(如果您以 root 身份运行,则不需要fakeroot。)这就是 : 的全部意义所在fakeroot:允许期望以 root 身份运行的程序以普通用户身份运行,同时假装需要 root 的操作成功。

    这通常在构建包时使用,以便正在安装的包的安装过程可以继续进行而不会出错(即使它运行chown root:root,或install -o root等)。fakeroot记住它假装提供文件的虚假所有权,因此查看所有权的后续操作看到的是这个而不是真实的;这允许后续tar运行,例如将文件存储为 root 所拥有的。

    fakeroot 如何阻止 Linux 上不必要的权限提升?如果 fakeroot 可以欺骗 tar 制作一个属于 root 的文件,为什么不使用 SUID 做类似的事情呢?

    fakeroot不会欺骗tar做任何事情,它会保留构建想要进行的更改,而不会让这些更改在托管构建的系统上生效。您不需要fakeroot生成包含 root 和 suid 拥有的文件的 tarball;如果您有一个二进制文件evilbinary,以普通用户身份运行tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary,将创建一个包含evilbinary由 root 和 suid 拥有的 tarball。但是,除非您以 root 身份执行此操作,否则您将无法提取该 tarball 并保留这些权限:这里没有权限提升。是一种fakeroot特权-升级工具:它允许您以普通用户身份运行构建,同时保留构建以 root 身份运行时的效果,允许稍后重播这些效果。“真正”应用效果总是需要 root 权限;fakeroot没有提供任何获取它们的方法。

    要更详细地了解 的使用fakeroot,请考虑典型的发行版构建涉及以下操作(以及许多其他操作):

    • 安装文件,由 root 拥有
    • ...
    • 归档那些仍归根用户所有的文件,这样当它们被提取时,它们将归根用户所有

    如果您不是 root,第一部分显然会失败。但是,当在 下运行时fakeroot,作为普通用户,进程变为

    • 安装文件,由 root 拥有 - 这失败,但fakeroot假装成功,并记住更改的所有权
    • ...
    • 归档那些仍然归 root 拥有的文件——当tar(或正在使用的任何归档程序)询问系统文件所有权是什么时,fakeroot更改答案以匹配它之前记录的所有权

    因此,您可以在没有 root 身份的情况下运行包构建,同时获得与真正以 root 身份运行时相同的结果。使用fakeroot更安全:系统仍然无法执行用户无法执行的任何操作,因此恶意安装过程不会损坏您的系统(除了触摸您的文件)。

    在 Debian 中,构建工具已经过改进,不再需要这个,您可以构建没有fakeroot. 这由指令dpkg直接支持(请参阅 参考资料)。Rules-Requires-Rootrootless-builds.txt

    要了解 的目的fakeroot以及是否以 root 身份运行的安全性方面,考虑打包的目的可能会有所帮助。当您从源代码安装一个软件以在系统范围内使用时,您将按照以下步骤进行:

    1. 构建软件(无需特权即可完成)
    2. 安装软件(需要以 root 身份完成,或者至少以允许写入适当系统位置的用户身份完成)

    当你打包一个软件时,你在延迟第二部分;但要成功做到这一点,您仍然需要将软件“安装”到软件包中,而不是安装到系统中。所以当你打包软件的时候,流程就变成了:

    1. 构建软件(没有特权)
    2. 假装安装软件(同样没有特权)
    3. 将软件安装捕获为一个包(同上)
    4. 使包可用(同上)

    现在,用户通过安装软件包来完成该过程,这需要以 root 身份完成(或者再次,具有适当权限的用户可以写入适当的位置)。这是延迟特权进程实现的地方,也是该进程中唯一需要特权的部分。

    fakeroot通过允许我们在不以 root 身份运行的情况下运行软件安装过程并捕获它们的行为来帮助执行上述步骤 2 和 3。

    • 37
  2. ctrl-alt-delor
    2018-07-12T04:49:54+08:002018-07-12T04:49:54+08:00

    不。假根允许您运行权限操作和报告工具,它将一致地报告。但是,它实际上不会授予这些权限。它看起来就像你拥有它们(假的)。它不会改变环境之外的任何东西。

    如果您想创建一个目录结构,其中包含您的用户无法设置的所有权和权限,那么您将使用 tar、zip 或其他程序包,这很有用。

    它并没有真正提升权限,它是假的。它不允许你做任何你不能做的事情(删除、写、读)。你可以在没有它的情况下生产包(理论上)。没有它,你可能会得到一份虚假的报告 ( ls)。

    这不是一个安全漏洞,因为它不允许访问,或者没有它你不能做的任何事情。它在没有特权的情况下运行。它所做的只是拦截对 , 等的调用chown。chmod它使它们成为无操作,除了它记录会发生的事情。它还拦截对stat等的调用,以便它从自己的内部数据库报告权限和所有权,就好像其他命令已经完成一样。这很有用,因为如果您随后压缩目录,它将具有假权限。如果您随后以 root 身份解压缩,则权限将变为真实。

    任何以前不可读/写的文件都将保持不可读/写。创建的任何特殊文件(例如设备)都没有特殊权限。任何 set-uid(给另一个用户),文件都不会 set-uid。任何其他权限提升都不起作用。

    它是一种虚拟机:一般来说,虚拟机可以模拟任何环境/操作系统,但不能对主机做任何其他应用程序无法做的事情。在虚拟机中,您似乎可以做任何事情。您可以将安全系统重新设计为相同或不同,但是这将全部存在于主机上,作为运行虚拟环境的进程的用户/组所拥有的资源。

    • 7
  3. FeRD
    2018-07-13T00:42:31+08:002018-07-13T00:42:31+08:00

    这里已经有两个很好且非常详细的答案,但我只想指出,原始 fakeroot 手册页1的介绍性段落实际上非常清晰简洁地解释了它:

    fakeroot在似乎具有文件操作的 root 权限的环境中运行命令。这对于允许用户创建包含具有 root 权限/所有权的文件的档案(tar、ar、.deb 等)很有用。如果没有fakeroot,则需要具有 root 权限才能创建具有正确权限和所有权的档案的组成文件,然后将它们打包,或者必须直接构建档案,而不使用存档器。

    Fakeroot 允许非 root 用户创建包含 root 拥有的文件的存档,这是在 Linux 中生成和分发二进制软件包的关键部分。如果没有fakeroot,则必须在以实际 root 身份运行时生成包存档,以便它们包含正确的文件所有权和权限。那将是一个安全风险。如果使用 root privs 来构建和打包可能不受信任的软件,则会带来巨大的风险。多亏了fakeroot,拥有非特权文件的非特权用户仍然可以生成包含具有 root 所有权的文件的档案。2

    但这不是安全风险,因为在文件被EXTRACTED之前,档案中的任何内容实际上都不归 root所有。即使这样,如果由特权用户完成,文件也只会在其根权限完整的情况下被提取。这一步——由特权用户提取包含“根”文件的辅助存档——是“假”根最终成为真实的地方。直到那时,还没有获得或绕过任何实际的 root 权限。fakeroot

    笔记

    1. Fakeroot 催生了一些竞争者/模仿者,它们将伪装成fakeroot已安装,包括fakeroot-ng和pseudo. 但是恕我直言,“模仿者”的手册页都几乎没有清楚地说明这个问题。坚持原创,唯一的fakerootOG
    2. 其他发行版/打包系统通过在其包档案中不使用根所有权来克服这一点。例如,在 Fedora 上,软件可以由非特权用户编译、安装和打包,而无需fakeroot. 这一切都在用户的$HOME/rpmbuild/空间内完成,并且通常特权的步骤make install(通过类似--prefixand的机制DESTDIR)被重定向到$HOME/rpmbuild/BUILDROOT/可以被视为一种“fakechroot”空间的层次结构(实际上没有使用fakechroot)。

      但即使在 期间make install,一切都以非特权用户的身份执行并归非特权用户所有。默认情况下,提取的文件所有权和权限将设置为root,root和0644(或0755可执行文件),除非在包定义 ( .spec) 文件中被覆盖,在这种情况下,它们将作为元数据存储在最终包中。因为直到 rpm 包的(特权)安装过程才实际应用权限或所有权,所以fakeroot在打包过程中既不需要 root,也不需要。但fakeroot实际上只是获得相同结果的不同途径。

    • 4

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve