【翻译】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)。主要特点:
-
事件类型格式:
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 客户端必须包含
-
关键函数:
es_new_client:初始化 ES API 客户端es_subscribe:订阅特定事件类型
-
逆向技术:
- 使用 Frida 挂钩
es_subscribe函数 - 分析事件订阅列表可了解 EDR 监控范围
- 使用 Frida 挂钩
网络扩展框架
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,RENAMEMOUNT,CLONE,SETMODE,SETOWNER,SETFLAGSSETEXTATTR,UNMOUNT,READDIR,DELETEEXTATTRSETATTRLIST,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,unlinkatrename,renameat,mkdir,mkdirat,rmdirlink,linkat,symlink,symlinkat
或挂钩内部内核函数:
vfs_open,vfs_unlink,vfs_rename,vfs_mkdirvfs_rmdir,vfs_link,vfs_symlink
网络事件
两种主要策略:
-
系统调用监控:
socket,bind,accept,setsockopt,socketcall
-
内部内核函数挂钩:
sock_create,inet_bind/inet6_bindinet_sendmsg/inet6_sendmsg,inet_recvmsg/inet6_recvmsginet_csk_accept,inet_accept,inet_listentcp_close,inet_release,tcp_v4_connect/tcp_v6_connectinet_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:在延迟窗口内修改系统调用参数
- 线程1:触发系统调用(如
-
影响:
- 可欺骗网络(
connect)和文件(openat)事件中的特定字段 - 需要
CAP_SYS_PTRACE权限(Linux 5.2+)
- 可欺骗网络(
-
防御:
- 监控内部内核函数而非系统调用
- 实施更严格的内存访问检查
总结
macOS 和 Linux 平台上的 EDR 实现各有特点:
macOS:
- 主要依赖用户态 Endpoint Security API
- 配合 NetworkExtension 框架实现网络监控
- 系统设计强制要求特定权限和签名
Linux:
- 多样化实现,主要基于内核跟踪技术
- 现代方案倾向于使用 eBPF
- 需考虑不同内核版本的兼容性
安全建议:
- 防御者应了解所用 EDR 的监控范围和能力
- 攻击者可研究 TOCTOU 等漏洞绕过监控
- 开发人员应注意平台特性和权限要求
通过深入理解这些平台的 EDR 内部原理,安全团队可以更有效地配置和监控这些系统,而攻击者也能开发更精准的规避技术。