关于Linux内核安全性的一些基本问题

关于Linux内核安全性的一些基本问题

我对Linux内核了解不多,有一些疑问。

  1. 将内核内存与用户空间内存分离的主要目的是什么?确保用户应用程序不会对内核做任何坏事?

  2. 用户级应用程序有多少种方式将控制权转移到内核?我能想到的包括(1)调用系统调用,(2)将内存映射到内核(但我认为映射()也是一个系统调用),以及(3)加载内核模块(但我猜lsmod还调用一些系统调用)。我对么?还有其他我错过的方法吗?

  3. 攻击内核有多少种方法?我可以了解一些关于他们的简要细节吗?

  4. 如果我获得了root权限,是否就意味着我完全控制了内核?也就是说,我可以用内核和硬件做任何我想做的事?或者我对内核的权力仍然有限?

如果有人能帮助我找出这些问题的答案,我将非常感激。

答案1

我将尝试尽可能简短地回答问题。您提出的问题通常在大学的操作系统入门课程中得到解决,但我假设您没有参加过这样的课程。

  1. 用户空间进程的内存隔离是非常可取的——不仅可以保护内核免受恶意用户空间程序的侵害,还可以保护用户空间程序彼此免受攻击。这通常被称为虚拟内存。它还使实现分页变得更容易,这也是出于其他原因(更简单的碎片、更简单的链接器/加载器等)而需要的。

  2. 中断(并非所有中断都由用户级应用程序控制)。放弃处理器也会夺走进程的“控制”(例如,wait这也是系统调用)。内核可能自己决定取消调度应用程序。

  3. 这是一个非常广泛的问题。系统调用实施不当的内核很容易受到攻击。写入物理内存的能力将是另一种方式。执行不当的指令还可能导致其他漏洞(例如 Intel 处理器中的 sysret 漏洞)。

  4. Root 权限与内核权限不同。以 root 用户身份运行的应用程序仍然使用虚拟内存,仍然必须进行系统调用,仍然必须遵守任何用户级应用程序必须遵守的其他规则。

如果您希望我提供有关某些答案的更多详细信息,请告诉我。

如果有人可以改进某些答案,请随时指出。

相关内容