从用户空间到内核空间的攻击# 从用户空间到内核空间的攻击
本章信息
- 介绍内核和现有内核利用
- 为什么用户空间利用不在好用
- 利用编写者眼中的内核
- 开源与闭源操作系统
简介
这张引入了我们的目标,内核。在一个简短的内核基础讨论后,我们分析了为什么利用作者已经将注意力从用户应用程转移到内核,我们简要描述了用户空间利用与内核空间利用的区别。除了探讨了Windows内核与UNIX内核的在一些情况下得区别。例如,同一段代码可能在32位系统上成功运行,而在64位系统上无效。或在x86机器上有效,而在SPARC系统上无效。最后通过探讨开源与闭源操作系统内核利用的区别,结束本章
介绍内核和现有内核利用
我们将从一个简单的任务开始我们的现有漏洞利用之旅。解释内核是什么?利用的含义是什么? 当您想到计算机时,最有可能您想到一组相互连接的物理设备(处理器,主板,内存,硬盘驱动器,键盘等)它让您执行简单任务,例如写电子邮件,观看电影,或冲浪网。在这些设备和你每天使用的应用程序之间有一个软件层。它负责让硬件有效工作,的同时构建了你每天使用的应用程序的基础。这层软件就是操作系统。他的核心就是内核。
在现代操作系统,内核负责一些对人们来说习以为常的事情:虚拟内存,硬盘驱动器访问,输入输出处理等等。内核通常比大多数用户应用程序大,是由一段复杂且迷人的代码构成。这段代码由汇编,机器语言和C语言混合编写而成。内核使用一些潜在架构特性去将自己与其他用户程序隔离。事实上,大多数指令集架构提供至少两种执行模式:特权模式,在特权模式下所有机器指令都可以被使用。另一种是非特权模式在这种模式下只有一部分指令可以被使用。此外,内核还通过实现在软件等级上的隔离来保护自己免受应用程序的影响。当内核建立起虚拟内存子系统时,内核可以确保它能访问所有其他进程的地址空间,而没有进程能够直接访问内核内存。因此我们管仅对内核可见的内存称作内核空间内存,仅对用户空程序可见得内存,称为用户空间内存。 在内核空间中运行的代码拥有最高权限,能访问所有系统上有效地内存地址。而在用户空间运行的代码被我们之前所描述的限制约束。这种基于硬件与软件隔离目的是为了保护内核免于恶意,或不良用户应用的程序,有意或者无意的破坏与篡改。
保护内核免受其他运行的应用程序影响是迈向安全稳定系统的第一步,但这显然是不够的,在不同的用户应用程序之间也应该存某种程度上的保护。考虑一个多用户环境,不同的用户期望拥有一个“私人”区域,他们可以存储数据在文件系统上,并且他们希望他们登录的应用程序,例如他们的邮件阅读器软件,不能被另一个人停止,修改或监视。 此外,对于一个可用系统,可以使用某种方式来识别,添加和删除用户或防止共享资源碰撞。 例如,恶意用户不应能消耗文件系统上可用的所有空间或系统Internet连接的所有带宽。
这种抽象在硬件中实现太昂贵,因此它由内核提供在软件级别。
系统中每个用户都与一个独一无二的userid绑定。在这些userid中
有一个id表示其对应的用户有最高权限,这个用户对所有必须被执行的管理任务负责,例如管理其他用户,设置使用权限,配置系统等等。在Windows系统中,这个用户被称作Administrator,在UNIX系统中他被称作root,通常root用户所对应的userid是0.在接下来的内容中,我们将使用super user做为以上二者的指代。
超级用户被赋予修改自身内核的能力。这样做得原因十分明显,就像其他软件一样,内核也需要更新。例如修复潜在bugs,扩展支持新的设备。一个人活得了超级用户,他就活得了整个系统的完全扩展。因此活得超级用户是攻击者的目标。