macOS Kernel & System Extensions

支持 HackTricks

XNU 内核

macOS 的 核心是 XNU,代表“X 不是 Unix”。这个内核基本上由 Mach 微内核(稍后讨论)和来自伯克利软件分发(BSD)的元素组成。XNU 还通过一个名为 I/O Kit 的系统提供 内核驱动程序的平台。XNU 内核是 Darwin 开源项目的一部分,这意味着 其源代码是公开可用的

从安全研究人员或 Unix 开发者的角度来看,macOS 感觉与 FreeBSD 系统非常 相似,具有优雅的 GUI 和一系列自定义应用程序。大多数为 BSD 开发的应用程序可以在 macOS 上编译和运行,而无需修改,因为 Unix 用户熟悉的命令行工具在 macOS 中都存在。然而,由于 XNU 内核包含 Mach,因此传统 Unix 类系统与 macOS 之间存在一些显著差异,这些差异可能导致潜在问题或提供独特优势。

XNU 的开源版本:https://opensource.apple.com/source/xnu/

Mach

Mach 是一个 微内核,旨在 与 UNIX 兼容。其设计原则之一是 最小化内核 空间中运行的 代码 数量,而允许许多典型的内核功能,如文件系统、网络和 I/O,作为用户级任务 运行

在 XNU 中,Mach 负责内核通常处理的许多关键低级操作,如处理器调度、多任务处理和虚拟内存管理。

BSD

XNU 内核包含 大量来自 FreeBSD 项目的代码。这些代码 与 Mach 一起在内核中运行,在同一地址空间中。然而,XNU 中的 FreeBSD 代码可能与原始 FreeBSD 代码有很大不同,因为需要进行修改以确保与 Mach 的兼容性。FreeBSD 贡献了许多内核操作,包括:

  • 进程管理

  • 信号处理

  • 基本安全机制,包括用户和组管理

  • 系统调用基础设施

  • TCP/IP 堆栈和套接字

  • 防火墙和数据包过滤

由于 BSD 和 Mach 具有不同的概念框架,理解它们之间的交互可能很复杂。例如,BSD 使用进程作为其基本执行单元,而 Mach 基于线程操作。这种差异在 XNU 中通过 将每个 BSD 进程与一个包含恰好一个 Mach 线程的 Mach 任务关联 来调和。当使用 BSD 的 fork() 系统调用时,内核中的 BSD 代码使用 Mach 函数来创建任务和线程结构。

此外,Mach 和 BSD 各自维护不同的安全模型Mach 的 安全模型基于 端口权限,而 BSD 的安全模型基于 进程所有权。这两种模型之间的差异偶尔会导致本地特权提升漏洞。除了典型的系统调用外,还有 Mach 陷阱,允许用户空间程序与内核交互。这些不同的元素共同构成了 macOS 内核的多面性混合架构。

I/O Kit - 驱动程序

I/O Kit 是 XNU 内核中的一个开源、面向对象的 设备驱动程序框架,处理 动态加载的设备驱动程序。它允许在内核中动态添加模块化代码,支持多种硬件。

macOS IOKit

IPC - 进程间通信

macOS IPC - Inter Process Communication

macOS 内核扩展

macOS 对加载内核扩展(.kext)非常严格,因为代码将以高权限运行。实际上,默认情况下几乎不可能(除非找到绕过方法)。

在以下页面中,您还可以看到如何恢复 macOS 在其 kernelcache 中加载的 .kext

macOS Kernel Extensions

macOS 系统扩展

macOS 创建了系统扩展,而不是使用内核扩展,提供用户级 API 与内核交互。这样,开发人员可以避免使用内核扩展。

macOS System Extensions

参考文献

支持 HackTricks

Last updated