hacktricks/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture
2023-09-28 19:47:23 +00:00
..
macos-ipc-inter-process-communication Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2023-09-28 19:47:23 +00:00
macos-function-hooking.md Translated ['macos-hardening/macos-security-and-privilege-escalation/REA 2023-09-25 17:47:28 +00:00
macos-kernel-extensions.md Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2023-09-28 19:47:23 +00:00
macos-system-extensions.md Translated to Chinese 2023-08-03 19:12:22 +00:00
README.md Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'macos-ha 2023-09-14 00:00:07 +00:00

macOS内核和系统扩展

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

XNU内核

macOS的核心是XNU,它代表着"X不是Unix"。这个内核基本上由Mach微内核稍后将讨论和来自Berkeley Software DistributionBSD的元素组成。XNU还通过一个名为I/O Kit的系统提供了一个用于内核驱动程序的平台。XNU内核是达尔文开源项目的一部分这意味着它的源代码是免费可访问的

从安全研究人员或Unix开发人员的角度来看macOS可能会感觉非常类似于一个带有优雅GUI和许多自定义应用程序的FreeBSD系统。大多数为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内核中的开源、面向对象的设备驱动程序框架,负责添加和管理动态加载的设备驱动程序。这些驱动程序允许将模块化代码动态添加到内核中,以便与不同的硬件一起使用。它们位于以下位置:

  • /System/Library/Extensions
  • 内置于OS X操作系统的KEXT文件。
  • /Library/Extensions
  • 第三方软件安装的KEXT文件
#Use kextstat to print the loaded drivers
kextstat
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
Index Refs Address            Size       Wired      Name (Version) UUID <Linked Against>
1  142 0                  0          0          com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2   11 0                  0          0          com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3  170 0                  0          0          com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4    0 0                  0          0          com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5  175 0                  0          0          com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6  154 0                  0          0          com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7   88 0                  0          0          com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8  106 0                  0          0          com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9    2 0xffffff8003317000 0xe000     0xe000     com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10   12 0xffffff8003544000 0x92000    0x92000    com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>

直到数字9列出的驱动程序在地址0处加载。这意味着它们不是真正的驱动程序,它们是内核的一部分,无法卸载

要查找特定的扩展,您可以使用:

kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id

要加载和卸载内核扩展,请执行以下操作:

kextload com.apple.iokit.IOReportFamily
kextunload com.apple.iokit.IOReportFamily

IPC - 进程间通信

{% content-ref url="macos-ipc-inter-process-communication/" %} macos-ipc-inter-process-communication {% endcontent-ref %}

macOS内核扩展

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

{% content-ref url="macos-kernel-extensions.md" %} macos-kernel-extensions.md {% endcontent-ref %}

macOS系统扩展

macOS创建了系统扩展来替代内核扩展它提供了用户级别的API与内核进行交互。开发人员可以通过使用系统扩展来避免使用内核扩展。

{% content-ref url="macos-system-extensions.md" %} macos-system-extensions.md {% endcontent-ref %}

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥