macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

admin 2025年7月1日17:22:02评论9 views字数 3167阅读10分33秒阅读模式

在这篇文章中,我们将讨论如何在 macOS 上通过 MACF 监控文件系统事件(包括文件打开、读取、写入、重命名和删除操作)和动态库加载。将在下面提供所有技术细节。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

背景

常规程序在其生命周期内执行文件操作是很常见的。

macOS 上的恶意软件是相同的。一般来说,恶意软件会弄乱文件操作。此外,恶意软件通常会动态加载 .dylib 作为其主要模块来执行其主要恶意活动。MACF 是一个强大的框架,用于在 macOS 上监控内核中的多种系统事件。它当然能够很好地监控文件系统和 dylib 加载事件。

监控文件系统事件

我开发的工具可以监控所有常见的文件系统事件,包括文件打开、读取、写入、重命名和删除操作。如头文件bsd/security/mac_policy.h所示,结构体mac_policy_ops包含300多个策略模块操作。下面列出了与文件系统事件相关的操作。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 1. 与文件系统事件相关的操作

结构体mac_policy_ops的初始化如下。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 2. 结构体 mac_policy_ops 的初始化

根据实现的不同,我将文件操作的五个回调分为两类。一种包括文件打开、读取、写入和删除操作,另一种是文件重命名操作。对于第一类,我们选择文件删除操作作为展示技术细节的示例。该类别中的其他操作类似于文件删除操作的回调。文件删除操作的回调是mpo_vnode_check_unlink。它的声明如下所示。它需要六个参数。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 3. 回调 mpo_vnode_check_unlink_t 的声明

回调 deleteFileHook 的实现如下所示。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 4. 回调 deleteFileHook 的代码片段

我们可以使用函数 vn_getpath 来获取要删除的 vnode 的路径。那就是要删除的文件的路径。我们还可以通过调用函数 kauth_getuid()、proc_selfpid() 和 proc_selfppid() 分别获取 uid、pid、ppid。然后我们通过调用函数proc_selfname获取进程名,通过调用proc_name获取父进程名。接下来,我们用我们获得的有用信息填充数据缓冲区。最后,我们使用函数 ctl_enqueuedata 发送数据缓冲区。

接下来我们继续看文件重命名操作的回调。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 5. 回调 mpo_vnode_check_rename_t 的声明

文件重命名操作的回调与其他文件操作的回调有些不同。在这个回调中,我们需要获取文件的原始路径和目标路径。以下是获取要重命名文件的完整路径的代码片段。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 6. 获取原始文件全路径的代码片段

变量 vp 表示要重命名的 vnode。我们可以通过调用函数 vnode_getname() 来获得它的名字。变量 dvp 代表目录 vnode。然后我们可以通过调用函数 vn_getpath() 来获取目录的路径。最后,我们通过将两个部分用字符“/”连接起来,得到要重命名的文件的完整路径。

一开始,我也使用相同的过程来获取要重命名的文件的目标路径。但是,有时变量 tvp 为 NULL,因此我通过 tcnp->cn_nameptr 而不是 vnode_getname(tvp) 获取目标 vnode 名称。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 7. 获取文件目标路径的代码片段

变量tcnp是一个指向结构体componentname的指针,定义如下:

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 8 结构组件名的定义

它的成员变量 cn_nameptr 是一个指向查找名称的指针。

至此,我们已经获得了要重命名的文件的原始路径和目的路径。其余工作与文件删除操作相同。

最后,我展示了在 macOS 上监视文件系统事件的工具。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 10. 监控文件重命名事件的输出

监控 Dylib 加载事件

动态加载器dyld旨在动态链接和加载macOS平台上的动态库。动态库的扩展名为 .dylib,类似于 Windows 操作系统上的 DLL 文件和 Linux 操作系统上的 .so 文件。为了监控一个dylib加载事件,我们首先需要了解dyld动态加载器内部是如何工作的。dyld 由 Apple 在https://opensource.apple.com/source/dyld/dyld-519.2.2/开源。

在这篇文章中,我不打算提供分析源代码的整个过程。你可以阅读 dyld 的源代码。在这里,我只提供代码的重点分析。以下是 ImageLoadMachO 类的函数 mapSegments 的代码片段。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 11. 函数 mapSegments

该函数用于将 Mach-O 二进制文件中的段映射到虚拟内存中。它使用函数 xmmap,它是用于执行映射的函数 mmap 的包装器。函数 mmap 的手册页可以在https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man2/mmap.2.html找到。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 12. 函数 xmmap 的定义

因为dylib是一个可执行程序,所以我们只关注具有PROT_EXEC权限的段。函数 mmap 中的参数 flags 采用 MAP_FIXED | MAP_PRIVATE。

在结构体 mac_policy_ops 中,模块操作 mpo_file_check_mmap 用于检查映射文件的访问控制。我们只过滤带有 PROT_EXEC 权限和 MAP_FIXED | 的映射。MAP_PRIVATE 标志。

回调mpo_file_check_mmap_t的声明如下所示:

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 13. 回调 mpo_file_check_mmap_t 的声明

下面是监听dylib加载事件的回调实现。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 14. 函数 dylibloadHook

第 4 个参数 prot 和第 5 个参数 flags 来自名为 mmap 的系统。PROT_EXEC 的常量变量是 0x04,MAP_FIXED 是 0x10,MAP_PRIVATE 是 0x02,它们在头文件 bsd/sys/mman.h 中定义。表达式 ((prot & 0x4) && (flags & 0x12)) 用于过滤具有 PROT_EXEC 权限和 MAP_FIXED | 的映射。MAP_PRIVATE 标志。另一个重要参数是第二个。它是一个指向结构fileglob的指针,它在头文件bsd/sys/file_internal.h中定义。由于结构文件 glob 是私有类型,因此在 XCode 中无法导入头文件 file_internal.h。因此,我们需要计算结构体fileglob中成员变量的对应偏移量,而不是直接通过fg->fg_data、fg->fg_cred、fg->fg_ops->取值

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

图 15. 结构 fileglob 的定义

结构 fileglob 表示文件到地图。所以我需要找到里面的vnode数据结构。我们可以看到成员变量 fg_data 代表 vnode 或套接字或 SHM 或信号量,具体取决于描述符类型。结构体fileops的成员变量fo_type简单地表示描述符类型。我们只过滤文件类型,表示fo_type等于DTYPE_VNODE。成员变量 fg_cred 表示与描述符关联的凭证。它在结构 fileglob 中的偏移量是 0x20,所以我检查凭据是否匹配。如果是,我们接下来继续检查 fo_type 是否为 DTYPE_VNODE。如果是我们要找的vnode的类型,我们计算fg_data在结构文件glob中的偏移量。偏移量等于 0x38。此时,变量 fg_data 代表 vnode。

到目前为止,我讨论了有关如何监控 dylib 加载事件的关键技术细节。最后,我将展示这个工具的屏幕截图。启动 Safari 和 Wireshark 后,我们可以看到我的工具可以很好地监控 dylib 加载事件。

macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

结论

在这篇文章中,我们讨论了有关如何使用 MACF 监控文件系统事件和 dylib 加载事件的关键技术细节。它对于监控 macOS 上恶意软件的恶意行为非常有用。

 

 

原文始发于微信公众号(安全狗的自我修养):macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年7月1日17:22:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   macOS EDR 底层原理之-通过 MACF 监控文件系统事件和 Dylib 加载http://cn-sec.com/archives/1022199.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息