【翻译】macOS 和 Linux 的 EDR 内部原理
字数 3728 2025-08-22 18:37:22

macOS 和 Linux 的 EDR 内部原理深度解析

前言

本文深入探讨 macOS 和 Linux 平台上的端点检测与响应(EDR)系统内部工作原理,揭示这些平台特有的安全监控机制。相比 Windows 平台,macOS 和 Linux 的 EDR 实现较少被公开讨论,但这些平台同样承载着关键业务和敏感数据,理解其安全机制对防御者和攻击者都至关重要。

EDR 基本架构

EDR 代理由多个传感器组成,主要功能包括:

  • 从一个或多个遥测源收集事件
  • 将原始遥测数据格式化为标准格式
  • 将格式化数据转发到日志聚合器

EDR 代理通常会收集以下核心事件类型:

  • 身份验证尝试
  • 进程创建和终止
  • 文件访问、修改、创建和删除
  • 网络流量

macOS EDR 实现

端点安全 API (Endpoint Security API)

Apple 推荐的现代 EDR 实现方式,取代了传统的内核扩展(KEXT)。主要特点:

  1. 事件类型格式ES_EVENT_TYPE_<RESPONSE TYPE>_<EVENT TYPE NAME>

    • 响应类型:NOTIFY(通知)或AUTH(授权)
    • 事件类型名称:描述具体事件
  2. 开发要求

    • 需要使用受限权利签署可执行文件
    • 或需在目标系统上禁用 SIP(System Integrity Protection)
  3. 网络事件:ES API 不直接提供网络事件监控,需配合 NetworkExtension 框架

分析 ES API 客户端

  1. 权限检查

    • 所有 ES 客户端必须包含 com.apple.developer.endpoint-security.client 权利
    • 可使用 codesign 工具检查应用包权限
  2. 关键函数

    • es_new_client:初始化 ES API 客户端
    • es_subscribe:订阅特定事件类型
  3. 逆向技术

    • 使用 Frida 挂钩 es_subscribe 函数
    • 分析事件订阅列表可了解 EDR 监控范围

网络扩展框架

NetworkExtension 框架提供网络监控能力,主要提供程序类型:

  1. DNS 代理

    • 代理 DNS 查询
    • 可获取源进程元数据(签名标识符、应用审计令牌)
  2. 内容过滤器

    • 允许/拒绝网络连接
    • 适用于数据包检查和防火墙应用
  3. 数据包隧道

    • 主要用于 VPN 客户端应用

macOS 事件类型详解

身份验证事件

  • AUTHENTICATION:通用认证事件(登录、sudo 使用等)
  • PTY_GRANT/CLOSE:伪终端设备事件(包括 SSH 会话)
  • LW_SESSION_LOGIN/LOGOUT:用户正常登录事件
  • OPENSSH_LOGIN/LOGOUT:SSH 登录事件(含失败尝试)

进程事件

  • EXEC:进程执行
  • FORK:进程派生
  • EXIT:进程退出

文件事件

  • CREATE, OPEN, CLOSE, LINK, UNLINK, RENAME
  • MOUNT, CLONE, SETMODE, SETOWNER, SETFLAGS
  • SETEXTATTR, UNMOUNT, READDIR, DELETEEXTATTR
  • SETATTRLIST, REMOUNT, TRUNCATE, SETACL

网络事件

通过 NetworkExtension 内容过滤器提供程序实现

特定事件

  • REMOTE_THREAD_CREATE:远程线程创建
  • PROC_SUSPEND_RESUME:进程暂停/恢复
  • XP_MALWARE_DETECTED/REMEDIATED:XProtect 检测/修复
  • GET_TASK_READ/INSPECT/NAME:进程任务端口访问
  • CS_INVALIDATED:代码签名失效
  • SIGNAL:进程信号发送
  • UIPC_CONNECT:UNIX 域套接字连接
  • BTM_LAUNCH_ITEM_ADD:启动项添加(持久化机制)

Linux EDR 实现

监控技术

  1. 内核函数跟踪

    • Kprobes 和 Return Probes:可挂钩任意内核函数
    • Tracepoints:内核内置跟踪点
    • Raw Tracepoints:高性能系统调用跟踪
    • Fentry/Fexit 探针:GCC 添加的入口/出口探针
  2. eBPF(扩展伯克利包过滤器)

    • 允许将小型可验证程序加载到内核
    • 比传统 LKM(可加载内核模块)更安全稳定
    • 内核版本要求较高(4.x 及以上)

分析 eBPF 程序

  1. 工具使用

    • bpftool prog list:列出加载的 eBPF 程序
    • bpftool prog dump:查看 eBPF 程序字节码
    • bpftool map list:列出 eBPF 映射
    • bpftool map dump:查看映射内容
  2. 关键组件

    • 程序:监控特定内核函数
    • 映射:与用户模式代理通信的数据结构

Linux 事件类型详解

身份验证事件

  • 挂钩 PAM 函数:
    • pam_authenticate:包含失败登录
    • pam_open_session:用户会话关联
  • 监控文件:
    • /var/run/utmp
    • /var/log/btmp:失败登录记录

进程事件

  • sched_process_exec:进程执行(常用跟踪点)
  • finalize_exec:内部 execve 相关函数
  • sched_process_fork:进程派生
  • sched_process_exit/taskstats_exit/sys_exit/set_sid_exit:进程终止

文件事件

系统调用监控:

  • open, openat, creat, close, unlink, unlinkat
  • rename, renameat, mkdir, mkdirat, rmdir
  • link, linkat, symlink, symlinkat

或挂钩内部内核函数:

  • vfs_open, vfs_unlink, vfs_rename, vfs_mkdir
  • vfs_rmdir, vfs_link, vfs_symlink

网络事件

两种主要策略:

  1. 系统调用监控:

    • socket, bind, accept, setsockopt, socketcall
  2. 内部内核函数挂钩:

    • sock_create, inet_bind/inet6_bind
    • inet_sendmsg/inet6_sendmsg, inet_recvmsg/inet6_recvmsg
    • inet_csk_accept, inet_accept, inet_listen
    • tcp_close, inet_release, tcp_v4_connect/tcp_v6_connect
    • inet_dgram_connect(UDP), inet_stream_connect(TCP)
    • sock_common_recvmsg, sk_attach_filter

特定事件

  • security_bpf_map:eBPF 映射访问监控
  • security_ptrace_access_check:ptrace 尝试监控
  • security_netlink_send:netlink 接口监控
  • madvise:可疑内存操作监控(如 Dirty COW 漏洞利用)

攻击案例:Linux 系统调用欺骗

Phantom Attack v1

  1. 原理

    • 利用 TOCTOU(Time-of-Check Time-of-Use)漏洞
    • 针对系统调用跟踪而非内部内核函数监控的 EDR
  2. 攻击步骤

    • 线程1:触发系统调用(如 connect)
    • 线程2:使用 userfaultfd 延迟内存页面错误处理
    • 线程3:在延迟窗口内修改系统调用参数
  3. 影响

    • 可欺骗网络(connect)和文件(openat)事件中的特定字段
    • 需要 CAP_SYS_PTRACE 权限(Linux 5.2+)
  4. 防御

    • 监控内部内核函数而非系统调用
    • 实施更严格的内存访问检查

总结

macOS 和 Linux 平台上的 EDR 实现各有特点:

macOS

  • 主要依赖用户态 Endpoint Security API
  • 配合 NetworkExtension 框架实现网络监控
  • 系统设计强制要求特定权限和签名

Linux

  • 多样化实现,主要基于内核跟踪技术
  • 现代方案倾向于使用 eBPF
  • 需考虑不同内核版本的兼容性

安全建议

  • 防御者应了解所用 EDR 的监控范围和能力
  • 攻击者可研究 TOCTOU 等漏洞绕过监控
  • 开发人员应注意平台特性和权限要求

通过深入理解这些平台的 EDR 内部原理,安全团队可以更有效地配置和监控这些系统,而攻击者也能开发更精准的规避技术。

macOS 和 Linux 的 EDR 内部原理深度解析 前言 本文深入探讨 macOS 和 Linux 平台上的端点检测与响应(EDR)系统内部工作原理,揭示这些平台特有的安全监控机制。相比 Windows 平台,macOS 和 Linux 的 EDR 实现较少被公开讨论,但这些平台同样承载着关键业务和敏感数据,理解其安全机制对防御者和攻击者都至关重要。 EDR 基本架构 EDR 代理由多个传感器组成,主要功能包括: 从一个或多个遥测源收集事件 将原始遥测数据格式化为标准格式 将格式化数据转发到日志聚合器 EDR 代理通常会收集以下核心事件类型: 身份验证尝试 进程创建和终止 文件访问、修改、创建和删除 网络流量 macOS EDR 实现 端点安全 API (Endpoint Security API) Apple 推荐的现代 EDR 实现方式,取代了传统的内核扩展(KEXT)。主要特点: 事件类型格式 : ES_EVENT_TYPE_<RESPONSE TYPE>_<EVENT TYPE NAME> 响应类型: NOTIFY (通知)或 AUTH (授权) 事件类型名称:描述具体事件 开发要求 : 需要使用受限权利签署可执行文件 或需在目标系统上禁用 SIP(System Integrity Protection) 网络事件 :ES API 不直接提供网络事件监控,需配合 NetworkExtension 框架 分析 ES API 客户端 权限检查 : 所有 ES 客户端必须包含 com.apple.developer.endpoint-security.client 权利 可使用 codesign 工具检查应用包权限 关键函数 : es_new_client :初始化 ES API 客户端 es_subscribe :订阅特定事件类型 逆向技术 : 使用 Frida 挂钩 es_subscribe 函数 分析事件订阅列表可了解 EDR 监控范围 网络扩展框架 NetworkExtension 框架提供网络监控能力,主要提供程序类型: DNS 代理 : 代理 DNS 查询 可获取源进程元数据(签名标识符、应用审计令牌) 内容过滤器 : 允许/拒绝网络连接 适用于数据包检查和防火墙应用 数据包隧道 : 主要用于 VPN 客户端应用 macOS 事件类型详解 身份验证事件 AUTHENTICATION :通用认证事件(登录、sudo 使用等) PTY_GRANT/CLOSE :伪终端设备事件(包括 SSH 会话) LW_SESSION_LOGIN/LOGOUT :用户正常登录事件 OPENSSH_LOGIN/LOGOUT :SSH 登录事件(含失败尝试) 进程事件 EXEC :进程执行 FORK :进程派生 EXIT :进程退出 文件事件 CREATE , OPEN , CLOSE , LINK , UNLINK , RENAME MOUNT , CLONE , SETMODE , SETOWNER , SETFLAGS SETEXTATTR , UNMOUNT , READDIR , DELETEEXTATTR SETATTRLIST , REMOUNT , TRUNCATE , SETACL 网络事件 通过 NetworkExtension 内容过滤器提供程序实现 特定事件 REMOTE_THREAD_CREATE :远程线程创建 PROC_SUSPEND_RESUME :进程暂停/恢复 XP_MALWARE_DETECTED/REMEDIATED :XProtect 检测/修复 GET_TASK_READ/INSPECT/NAME :进程任务端口访问 CS_INVALIDATED :代码签名失效 SIGNAL :进程信号发送 UIPC_CONNECT :UNIX 域套接字连接 BTM_LAUNCH_ITEM_ADD :启动项添加(持久化机制) Linux EDR 实现 监控技术 内核函数跟踪 : Kprobes 和 Return Probes:可挂钩任意内核函数 Tracepoints:内核内置跟踪点 Raw Tracepoints:高性能系统调用跟踪 Fentry/Fexit 探针:GCC 添加的入口/出口探针 eBPF(扩展伯克利包过滤器) : 允许将小型可验证程序加载到内核 比传统 LKM(可加载内核模块)更安全稳定 内核版本要求较高(4.x 及以上) 分析 eBPF 程序 工具使用 : bpftool prog list :列出加载的 eBPF 程序 bpftool prog dump :查看 eBPF 程序字节码 bpftool map list :列出 eBPF 映射 bpftool map dump :查看映射内容 关键组件 : 程序:监控特定内核函数 映射:与用户模式代理通信的数据结构 Linux 事件类型详解 身份验证事件 挂钩 PAM 函数: pam_authenticate :包含失败登录 pam_open_session :用户会话关联 监控文件: /var/run/utmp /var/log/btmp :失败登录记录 进程事件 sched_process_exec :进程执行(常用跟踪点) finalize_exec :内部 execve 相关函数 sched_process_fork :进程派生 sched_process_exit / taskstats_exit / sys_exit / set_sid_exit :进程终止 文件事件 系统调用监控: open , openat , creat , close , unlink , unlinkat rename , renameat , mkdir , mkdirat , rmdir link , linkat , symlink , symlinkat 或挂钩内部内核函数: vfs_open , vfs_unlink , vfs_rename , vfs_mkdir vfs_rmdir , vfs_link , vfs_symlink 网络事件 两种主要策略: 系统调用监控: socket , bind , accept , setsockopt , socketcall 内部内核函数挂钩: sock_create , inet_bind / inet6_bind inet_sendmsg / inet6_sendmsg , inet_recvmsg / inet6_recvmsg inet_csk_accept , inet_accept , inet_listen tcp_close , inet_release , tcp_v4_connect / tcp_v6_connect inet_dgram_connect (UDP), inet_stream_connect (TCP) sock_common_recvmsg , sk_attach_filter 特定事件 security_bpf_map :eBPF 映射访问监控 security_ptrace_access_check :ptrace 尝试监控 security_netlink_send :netlink 接口监控 madvise :可疑内存操作监控(如 Dirty COW 漏洞利用) 攻击案例:Linux 系统调用欺骗 Phantom Attack v1 原理 : 利用 TOCTOU(Time-of-Check Time-of-Use)漏洞 针对系统调用跟踪而非内部内核函数监控的 EDR 攻击步骤 : 线程1:触发系统调用(如 connect ) 线程2:使用 userfaultfd 延迟内存页面错误处理 线程3:在延迟窗口内修改系统调用参数 影响 : 可欺骗网络( connect )和文件( openat )事件中的特定字段 需要 CAP_SYS_PTRACE 权限(Linux 5.2+) 防御 : 监控内部内核函数而非系统调用 实施更严格的内存访问检查 总结 macOS 和 Linux 平台上的 EDR 实现各有特点: macOS : 主要依赖用户态 Endpoint Security API 配合 NetworkExtension 框架实现网络监控 系统设计强制要求特定权限和签名 Linux : 多样化实现,主要基于内核跟踪技术 现代方案倾向于使用 eBPF 需考虑不同内核版本的兼容性 安全建议 : 防御者应了解所用 EDR 的监控范围和能力 攻击者可研究 TOCTOU 等漏洞绕过监控 开发人员应注意平台特性和权限要求 通过深入理解这些平台的 EDR 内部原理,安全团队可以更有效地配置和监控这些系统,而攻击者也能开发更精准的规避技术。