缓冲区溢出攻击

缓冲区溢出攻击

今天刚刚在分布式系统课上了解到,内核为每个用户分配了一个地址空间,如果用户想要获得su权限,他需要转移到内核地址空间。

这是缓冲区溢出攻击的基础吗?如果用户超出其地址空间,则可能能够访问内核地址空间或只是覆盖它?

答案1

进程无法在其内存之外读取、写入或分支。这意味着它无法访问其他进程的内存、未分配的内存或内核内存。因此,即使攻击者在进程中触发缓冲区溢出并能够在该进程的上下文中执行任意代码,也不会授予攻击者内核级访问权限。

有一种解决办法:进程可以进行系统调用。这进行系统调用的确切方式取决于操作系统和处理器类型;在其最简单的形式中,处理器有一个“系统调用”指令。它分支到内核安装了系统调用处理代码的特定地址。

当执行系统调用时,处理器会更改内存的访问权限。通过这种方式,内核以提升的权限运行,包括读取、写入和分支到所有内存的能力,以及访问硬件设备的能力。同样,如何执行特权提升的细节很大程度上取决于系统调用在特定平台上的实现方式;例如,处理器可能保留两个访问控制表(一张用于用户空间,一张用于内核空间),并且系统调用指令可能在这两个表之间切换。

处理系统调用的内核代码对传递给进程的参数进行解码(参数的传递方式又高度依赖于平台)。系统调用可能会正确验证这些参数。例如,如果内核需要一个数组参数并且不检查整个数组是否适合进程的地址空间,则可能导致普通进程对内核执行缓冲区溢出攻击,并能够执行其内核代码选择。

对于远程攻击者来说,要获得内核级访问权限通常需要利用两个漏洞,一个位于网络进程中,一个位于内核中。有时,内核网络处理代码中存在允许一步攻击的错误。

答案2

不会。在大多数体系结构上,内核空间都受到处理器的保护,除非操作系统出现错误,否则尝试在其中写入将导致进程终止。

缓冲区溢出攻击(通常)会覆盖函数的返回地址,从而破坏攻击者手中的控制流。

相关内容