fakeroot在Linux中如何不违反安全性?


18

在阅读了这个问题的一些不错的答案之后,我仍然不清楚为什么您要假装自己是root而没有获得实际root的任何好处。

到目前为止,我可以收集到的是,fakeroot用于为文件解压缩/压缩后需要root的所有权。我的问题是,为什么您不能只用chown呢?

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

这个答案在这里介绍了实际的系统调用与真实用户的UID / GID做,所以又在哪里呢fakeroot的帮助?

fakeroot如何阻止Linux上不必要的特权升级?如果fakeroot可以欺骗tar来创建root拥有的文件,那么为什么不对SUID做类似的事情?

根据我的收集,当您想要更改构建为root的任何软件包文件的所有者时,fakeroot才有用。但是您可以使用chown做到这一点,所以我对应该如何使用此组件的理解还不够呢?


1
您不需要fakeroot来编译内核。内核构建系统并不是那么疯狂。链接的讨论是关于制作Debian内核软件包的,其中实际的内核构建只是一步。

@ WumpusQ.Wumbley我会纠正这一点,你能告诉我为什么会这样吗?
ng.newbie '18

因为fakeroot是Debian的事情,而Linux不仅仅是Debian?

@ WumpusQ.Wumbley它可以在任何发行版上运行。
user253751

Answers:


33

到目前为止,我可以收集到的是,fakeroot用于为文件解压缩/压缩后需要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。如果您具有binary evilbinary,则以tar cf evil.tar --mode=4755 --owner=root --group=root evilbinary普通用户身份运行,将创建一个tarball,其中包含evilbinary,由root和suid拥有。但是,除非以root用户身份进行,否则您将无法提取tarball并保留这些权限:此处没有特权升级。fakeroot是一种特权-升级工具:它允许您以常规用户身份运行构建,同时保留以root身份运行时所产生的效果,并允许稍后重播这些效果。要“真实地”应用效果,始终需要具有root权限。fakeroot不提供任何获取方法。

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

  • 安装文件,由root拥有
  • ...
  • 存档那些仍由root拥有的文件,以便在提取文件时将它们归root所有

如果您不是root用户,那么第一部分显然会失败。但是,fakeroot以普通用户身份在下运行时,该过程将变为

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

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

在Debian中,对构建工具进行了改进,以便不再需要它,您可以在不使用的情况下构建软件包fakeroot。指令dpkg直接支持此功能Rules-Requires-Root(请参阅参考资料rootless-builds.txt)。

要了解的目的fakeroot以及是否以root用户身份运行的安全性方面,可能有助于考虑打包的目的。当从源安装软件时,要在系统范围内使用,请按以下步骤操作:

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

打包软件时,您要延迟第二部分。但是要成功完成此操作,您仍然需要将软件“安装”到软件包中,而不是“安装”到系统上。因此,当您打包软件时,该过程将变为:

  1. 编译软件(无特殊特权)
  2. 假装安装软件(同样没有特殊特权)
  3. 将软件安装捕获为软件包(同上)
  4. 使软件包可用(同上)

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

fakeroot 通过允许我们运行软件安装过程并捕获其行为而无需以root用户身份运行,从而对上面的步骤2和3有所帮助。


1
@ ng.newbie如果您需要其他解释:我完全有可能使用十六进制编辑器来手动构建tar文件,该文件包含root拥有的文件或具有任何其他可能的权限。毕竟,它只是捆绑了一些信息,在文件实际存在于系统中之前,它没有任何功能。
mbrig

@ ng.newbie您是否使用fakeroot或不使用fakeroot对其进行解压缩?
user253751 '18

2
@ ng.newbie另外,如果您出于恶意目的想要使用suid-root二进制文件创建tarball,则可以在其他计算机上将其作为真实root用户执行,然后将其复制到目标。那里不需要fakeroot。fakeroot只是帮助创建tar文件的工具,它消除了对tar --mode --owner添加到归档文件中的每个文件的使用需求(并且也可以与其他程序一起使用)。如果/当您将不可信的tar文件或归档文件解压缩为root时(而不是在创建时),可能会出现问题。
ilkkachu

7

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

如果要创建一个目录结构,其中包含用户无法设置的所有权和权限,这将很有用,然后您将使用tar,zip或其他软件包。

并没有真正提升权限,它是假的。它不允许您执行其他操作无法完成的任何操作(删除,写入,读取)。您可以在没有理论的情况下生产包装。ls没有它,您可能会得到虚假的报告()。

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

之前不可读/不可写的所有文件将保持不可读/可写。创建的任何特殊文件(例如设备)将没有特殊权限。(对于另一个用户)任何set-uid文件都不会设置set-uid。其他任何特权升级均无效。

它是虚拟机的一种:虚拟机通常可以模拟任何环境/ OS,但是不能对主机执行任何其他应用程序不能执行的操作。在虚拟机中,您似乎可以执行任何操作。您可以将安全系统重塑为相同或不同,但是,它们将作为运行虚拟环境的进程的用户/组拥有的资源全部存在于主机上。


@ ctrl-alt-decor正如我在上面的评论中所问的那样,在* nix中无法将所有者设置为从另一个未特权用户的根目录,对吗?因此,如果程序允许的话,那肯定有充分的理由,那它不是安全缺陷吗?
ng.newbie

@ ctrl-alt-decor fakeroot不允许我读取/写入/删除,但是如果我为syscall编写了包装器,那么我也可以执行这些操作。
ng.newbie '18

@ ctrl-alt-decor因此,fakeroot存在的唯一原因是将对文件的权限设置为root,而不是root。如果那不是安全漏洞,那么为什么Linux首先要禁止它?
ng.newbie

1
不,它允许您将设置用户伪造为任何用户,并伪造其他一些东西。尝试一下:运行fakeroot,从外部查看文件,尝试访问不应使用的文件。
ctrl-alt-delor

4

此处已经有两个很好且非常详细的答案,但是我只想指出,原始 fakeroot 手册页1的简介部分实际上非常清楚简洁地说明了这一点:

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

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

但这不是安全风险,因为在文件被EXTRACTED之前,归档文件中的任何内容实际上都不归root 所有。即使这样,如果文件是由特权用户完成的,则仅在保留其根权限的情况下提取文件。该步骤(fakeroot特权用户提取了包含“根”文件的辅助归档文件)是“伪”根最终变为真实的地方。到目前为止,还没有获得或绕过任何实际的root特权。

笔记

  1. Fakeroot催生了一些伪装成伪装的竞争者/模仿者fakeroot,包括fakeroot-ngpseudo。但是恕我直言,无论是“模仿者”的手册页,还是关于弄清这个问题的要点都不太清楚。坚持使用原始的,唯一的fakerootOG
  2. 其他发行版/打包系统则通过在其打包档案中使用根所有权来克服这一问题。例如,在Fedora上,无需特权的用户可以编译,安装和打包软件fakeroot。这些都在用户$HOME/rpmbuild/空间内完成,并且通常特权的步骤make install(例如--prefix,通过和机制DESTDIR)被重定向到$HOME/rpmbuild/BUILDROOT/可以视为某种“ fakechroot”空间的层次结构(实际上并未使用fakechroot)。

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


1
关于您的第一个注释,fakeroot-ng 声称取代fakeroot,但实际上它并没有取代它,并且AFAIK fakeroot仍然是Debian默认使用的工具(必要时)。
斯蒂芬·基特

@StephenKitt啊哈!谢谢。那时候我想过那个。最初,我很困惑,因为我一直在搜索fakeroot联机帮助页,而Google 却把我甩在fakeroot-ng的(伪装为fakeroot(1))上,我想我应该是高估了。但我现在看到的是fakeroot-ng 自2014年以来就没有更新过,而fakeroot仍然处于活动状态。几年前,似乎也有伪造的人成功了,但现在停滞了。我将相应地调整答案。
FeRD '18

1
是的,起初我也很困惑,因为Debian网站上fakeroot联机帮助页fakeroot-ng默认为的版本。请查看的最后一段,看看是否fakeroot-ng有一个有趣的转折;-)。
斯蒂芬·基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.