操作系统是计算机系统的基础,它管理硬件资源,为应用程序提供运行环境。操作系统的安全性直接影响整个系统的安全性。如果操作系统被攻破,运行在其上的所有应用程序都可能受到影响。
操作系统安全涉及多个层面:进程隔离、内存保护、权限管理、内核安全等。理解这些安全机制,以及攻击者如何绕过这些机制,有助于理解整个系统的安全架构。

操作系统安全是计算机安全的基础。如果操作系统不安全,上层应用的安全机制可能形同虚设。理解操作系统安全机制,有助于理解整个系统的安全架构。
这一部分我们将讨论进程与内存隔离、内核安全、权限提升、安全内核、可信计算基等核心概念,以及现代操作系统的安全机制。
进程隔离是操作系统安全的基础。每个进程应该只能访问自己的内存空间,不能访问其他进程的内存空间。这防止了一个进程读取或修改另一个进程的数据,也防止了恶意进程影响系统或其他进程。
现代操作系统使用虚拟内存来实现进程隔离。每个进程有独立的虚拟地址空间,操作系统通过内存管理单元(MMU)将虚拟地址映射到物理地址。不同进程的虚拟地址空间是隔离的,即使它们映射到相同的物理地址(通过写时复制等技术),它们也看不到彼此。
虚拟内存还提供了内存保护。操作系统可以为不同的内存区域设置不同的权限:只读、读写、执行等。这防止了进程修改只读数据,也防止了进程执行数据区域(防止代码注入攻击)。
虚拟内存隔离不是绝对的。如果操作系统存在漏洞,攻击者可能通过内核漏洞绕过进程隔离。或者,如果进程共享内存(如共享库),一个进程可能影响另一个进程。
进程隔离防止了进程直接访问彼此的内存,但进程之间可能需要通信。操作系统提供了多种进程间通信(IPC)机制:管道、消息队列、共享内存、信号量等。
但这些IPC机制可能成为攻击面。如果IPC机制没有适当的访问控制,恶意进程可能通过IPC攻击其他进程。或者,如果IPC机制的设计存在缺陷,攻击者可能利用这些缺陷来绕过进程隔离。
容器和虚拟化提供了更强的隔离。容器使用命名空间(Namespace)和控制组(Cgroup)来隔离进程,虚拟化使用虚拟机监控器(Hypervisor)来隔离整个操作系统。
但容器和虚拟化也有安全挑战。容器共享主机内核,如果内核存在漏洞,容器隔离可能被绕过。虚拟化提供了更强的隔离,但虚拟机监控器本身可能成为攻击目标。
内核是操作系统的核心,拥有最高权限。内核可以访问所有硬件资源,可以修改任何内存区域,可以控制所有进程。如果内核被攻破,整个系统就被攻破了。
现代处理器提供不同的执行模式:用户态(User Mode)和内核态(Kernel Mode)。在用户态,进程只能访问自己的内存空间,不能直接访问硬件。在内核态,可以访问所有内存和硬件。
进程在用户态运行,当需要执行特权操作(如系统调用)时,切换到内核态。系统调用完成后,切换回用户态。这种设计限制了用户进程的权限,只有内核可以执行特权操作。

从用户态到内核态的切换是攻击者的目标。如果攻击者可以执行内核代码,他们就获得了系统的完全控制。内核漏洞可能导致权限提升,这是最严重的安全问题之一。
系统调用是用户进程请求内核服务的方式。用户进程通过系统调用接口请求内核执行特权操作,如文件操作、网络操作、进程管理等。
系统调用接口是攻击面。如果系统调用的实现存在漏洞,攻击者可能利用这些漏洞来攻击内核。或者,如果系统调用的参数验证不充分,攻击者可能传递恶意参数来攻击内核。
内核漏洞可能导致权限提升。攻击者可能通过内核漏洞从用户态执行内核代码,获得系统完全控制。内核漏洞可能来自:
防御内核漏洞需要:代码审计、安全编程实践、内核加固、最小权限原则等。
权限提升(Privilege Escalation)是攻击者从低权限提升到高权限的过程。攻击者可能从普通用户提升到管理员,或者从用户态提升到内核态。

水平权限提升是攻击者从一个用户账户提升到另一个用户账户。如果两个用户有相同的权限级别,这种提升可能不会增加攻击者的权限,但可能让攻击者访问不同的资源。
水平权限提升可能通过:密码破解、会话劫持、社会工程等方式实现。
垂直权限提升是攻击者从低权限提升到高权限。这是更严重的威胁,因为高权限账户可以执行更多操作,访问更多资源。
垂直权限提升可能通过:利用应用程序漏洞、利用操作系统漏洞、利用配置错误等方式实现。
权限提升是攻击链中的关键步骤。攻击者通常首先获得低权限访问,然后通过权限提升获得高权限,最后执行攻击目标。防止权限提升需要多层防护。
最小权限原则要求用户和进程只拥有必要的权限。这限制了权限提升的影响范围。即使攻击者获得了某个账户的权限,如果该账户只有最小权限,攻击者的影响也是有限的。
实现最小权限原则需要:细粒度的权限模型、权限分离、定期审查权限等。
安全内核是一个最小化的内核,只包含安全相关的功能。安全内核的设计目标是减少可信计算基(TCB)的大小,因为TCB越小,需要验证的代码越少,系统越安全。
可信计算基(Trusted Computing Base,TCB)是系统中必须可信才能保证系统安全的部分。TCB包括:硬件、操作系统内核、安全相关的软件等。
确定TCB的边界是安全设计的关键。TCB应该尽可能小,因为TCB中的任何漏洞都可能影响整个系统的安全性。
但TCB的边界不是固定的。不同的安全策略可能需要不同的TCB。比如,如果安全策略只要求进程隔离,TCB可能只包括内存管理单元和进程调度器。如果安全策略要求网络隔离,TCB可能还包括网络栈。
TCB越小,系统越安全,因为需要验证的代码越少。但TCB太小可能影响系统功能。在安全性和功能性之间找到平衡是安全设计的关键。
验证TCB的正确性是确保系统安全的关键。可能的方法包括:

ASLR随机化进程的内存布局,使得攻击者难以预测内存地址。这防止了攻击者通过硬编码地址来攻击系统,也防止了某些代码注入攻击。
但ASLR不是完美的。如果攻击者可以泄露内存地址,ASLR可能失效。或者,如果攻击者可以多次尝试,ASLR可能被绕过。
DEP防止数据区域被执行。这防止了代码注入攻击,因为攻击者无法在数据区域执行代码。
但DEP可能被绕过。如果攻击者可以控制代码区域,他们可能使用代码重用攻击(如ROP)来绕过DEP。
CFI确保程序执行遵循预期的控制流。这防止了控制流劫持攻击,如ROP、JOP等。
但CFI的实现可能不完美。如果CFI检查不够严格,攻击者可能仍然可以执行意外的控制流。
沙箱限制进程的权限,即使进程被攻破,影响也是有限的。沙箱可能使用:命名空间、能力(Capability)、强制访问控制等机制。
现代操作系统的安全机制提供了多层防护。即使某个机制失效,其他机制仍然可以提供保护。这是纵深防御的体现。
操作系统安全是计算机安全的基础。进程隔离、内存保护、权限管理、内核安全等机制共同保护系统安全。权限提升是攻击链中的关键步骤,防止权限提升需要最小权限原则、多层防护等机制。 安全内核和TCB的概念帮助我们理解信任的边界,以及如何最小化需要信任的代码。
现代操作系统实现了多种安全机制,如ASLR、DEP、CFI、沙箱等,提供了多层防护。但没有任何机制是完美的,我们还是需要结合使用多种机制来提供全面的保护。
在下一个部分中,我们将讨论文件系统与存储安全,理解数据在存储层面的安全保护方法。