什么是 rootkit?

信息安全 术语 Rootkit
2021-08-26 08:01:15

作为“ Tripwire - Is It Security Theater ”的后续,我希望更好地了解什么是 rootkit。为了更清楚:

  • 什么是内核模块?
  • 在高层次上,它的加载流程是什么,为什么/什么内存是有价值的?
  • linux 内核是否收到补丁或有其他防御措施来阻止已经获得 root 权限的人安装 rootkit(至少在远程用户的实时系统上)?

含义:哪些输入/输出创造了需要 ring-0 访问 rootland 的价值?

如果不清楚,我不希望对系统进行 root,或者就如何这样做提供建议,但我对熟悉 rootkit 的人如何定义其性质的方式和原因感兴趣。

如果将主题限制在 Linux 上是有用的,那对我来说很好。

3个回答

rootkit 是您在目标机器上运行的一组工具,当您以某种方式以 root 级权限访问它时。rootkit 的重点是将这种短暂的访问转变为一扇永远敞开的门。rootkit 的一个示例是对sshd二进制文件的修改,以便它始终接受“ 8gh347vb45”作为 的密码root,而不管 root 的“正常”密码是什么。它允许攻击者稍后再回来,而不必再次经历他首先使用的漏洞。

rootkit 的首要任务是隐藏自己,并抵制升级。如果rootkit 只是修改sshd(这是一个例子),openssh的下一次升级将删除rootkit。更具抵抗力的 rootkit 也会改变包管理器,因此在openssh升级时,新的sshd会自动修改,以便攻击者的额外访问点保持打开状态。

最强大的 rootkit 会修改内核,这是实际管理硬件的软件。所有进程(对于所有用户,包括root),当他们访问数据或硬件资源(例如读取或写入文件)时,通过很好地询问内核来做到这一点。安装在内核中的 rootkit 可以非常有效地隐藏文件,并且可以在每次内核升级时重新安装自己,因为这样的升级将包含内核代码的文件替换为另一个文件 - 即必须经过的操作内核。

内核模块是一段动态加载到内核中的代码在 Linux 中,直到 1.3.x 系列中的某个时间点,它是由引导加载程序一次性加载到 RAM 中的单个整体代码块。模块是可以在以后添加到实时内核的代码块;他们最初的目的是允许内核潜在地处理数百种硬件,而不必始终在 RAM 中包含相应的驱动程序代码。这个想法是,当在机器上检测到新硬件时,会加载相应的代码并将其链接到内核,就好像它从一开始就在那里一样。

root用户有权要求加载模块因此,这是一些具有root特权的代码将一些任意代码插入内核本身并以授予内核的权力运行的一种方式,即掌握所有硬件和进程(x86 世界中所谓的“ring 0”) )。这正是内核 rootkit 所需要的。

编辑:至于第三个问题(你能对 rookits 打补丁吗),一般答案是否定的(通过构造,在 Unix 系统上,root 可以在机器上做任何事情),但具体答案可以是yes例如,有一些安全框架会限制大多数根进程可以执行的操作(例如SELinux),并且可以禁止内核模块加载。这意味着攻击者设想的临时 root 访问不是真正的root 访问,只是“几乎是 root”。另一个可能的功能是签名模块(内核会拒绝没有经过加密签名的模块,因此 rootkit 必须在安装自己的模块之前找到并使用私钥,如果该密钥没有存储在机器本身上,这可能是不可能的)(我我不确定 Linux 内核中当前是否集成了签名模块支持)。此外,模块必须与内核代码链接,这使得它们对内核版本之间的变化非常敏感——因此即使没有任何实际对策,rootkit 也很难在升级时可靠地重新感染新内核。

将 Tom Leek 的答案应用于其他操作系统时,有几件事毫无价值:

  1. 尽管内核模块在 BSD、OSX 和 Windows 上的工作方式不同,但相关概念保持不变。
  2. 大多数驱动程序都包含在内核模块中。因此,有时内核模块被不加选择地(并且错误地)称为驱动程序。我发现在 Windows 上尤其如此。

起初,“rootkit”一词仅与 NIX 域有关(root 不是一个随意的词),但现在它指的是每一个允许您在每个操作系统中获得“root”权限的软件。该软件可以在用户空间或内核空间中(因此在后者中您需要内核模块或驱动程序)。通常,rootkit 在内核空间中运行,因为隐藏它们和删除它们的踪迹更容易。但是您可能拥有一个用户空间应用程序,该应用程序利用特权应用程序中的缓冲区溢出来为您提供 root 权限!

但这是真的:当我们使用 rootkit 术语时,我们认为内核代码可以获得高权限。

在这种情况下,您的以下问题非常广泛。我想你可以找到他们在谷歌上搜索每一个论点。因此,对于内核模块,您必须区分 Linux 或 Windows 或 Mac。基本的原则是 +/- 相同的,但你知道魔鬼在细节中!:-)