Sinter:macOS 全新的用户模式安全执行方案

Sinter 是首个完全用 Swift 编写的开源端点保护代理,支持苹果 EndpointSecurity API。本文详细解析其架构、实时决策机制、TOCTOU 风险缓解及系统扩展集成,为安全开发者提供迁移到用户模式的实践指南。

Sinter:macOS 全新的用户模式安全执行方案

TL;DR:Sinter 是首个完全用 Swift 编写的开源端点保护代理,从底层支持苹果的新 EndpointSecurity API。Sinter 展示了如何构建成功的事件授权安全代理,并解决了所有端点保护代理在 macOS 11 Big Sur 发布前从内核模式迁移到用户模式代理时将面临的诸多挑战。

简单、开源且基于 Swift

Sinter 是我们为 macOS 10.15 及以上版本开发的新开源端点安全执行代理,完全用 Swift 编写。我们从零开始构建它,作为 100% 用户模式代理,利用新的 EndpointSecurity API 从 macOS 内核接收一组安全相关事件类型的授权回调。Sinter 通过简单规则控制允许或拒绝事件,且不使用传统防病毒解决方案中昂贵的全系统扫描或基于签名的检测。

立即获取测试版安装程序并试用!

目前,Sinter 允许您编写一组规则来阻止或允许进程执行事件,并通过与 Santa 兼容的同步服务器或本地配置文件向代理提供规则(这是一个演示显式允许的示例规则)。然而,我们计划开发更复杂的规则语法,并为 API 支持的许多其他类型事件添加阻止能力,这也将意味着 Santa 规则兼容性的结束。

追求 100% 用户模式安全代理

实现端点安全解决方案(例如防病毒、反恶意软件)需要实时拦截和授权操作系统级事件。历史上,这意味着使用内核模式回调 API 或在未提供适当 API 时挂钩内核模式操作系统代码。操作系统开发者早就知道,像这样的第三方内核模式代码是系统不稳定和不安全的主要来源,因为内核代码中的任何小错误往往都会带来严重后果。

于是 macOS EndpointSecurity API 应运而生。2019 年底,苹果宣布在 macOS 中弃用对所有第三方内核扩展的支持,并将引入用户模式 API 和框架来替代第三方产品所需的功能。所有安全供应商都接到通知:在明年内弃用您现有的内核模式解决方案,并在下一个 macOS 版本(macOS 11 Big Sur)发布前迁移到 EndpointSecurity API。对许多团队来说,这显然不是一个有趣的前景,公告发布后不久,一位客户就委托我们开发一个用户模式解决方案,以减轻迁移的痛苦。

什么是 EndpointSecurity API?

EndpointSecurity 是一个 API,它在特定事件即将发生时实时实现从 macOS 内核的回调。EndpointSecurity 客户端订阅一种或多种事件类型,这些类型可以是 NOTIFY 类型或 AUTH(授权)类型。Notify 顾名思义,对于在主机上捕获简单活动日志非常有用。授权回调则强大得多;它让客户端进程决定允许或拒绝事件的发生。

EndpointSecurity 取代了 macOS 上实时事件授权的内核模式等效项(Kauth KPI 和其他不受支持的内核方法)以及只读事件监控 OpenBSM 审计跟踪。任何用于 macOS 的实时监控或保护产品都必须重写以使用 EndpointSecurity,以便兼容 macOS 11 Big Sur。

请注意,EndpointSecurity API 中没有网络相关事件(除了 UNIX 域套接字)。所有这些都在网络扩展框架中。您可以从一个系统扩展中结合使用这两种 API,但这里我们特别关注 EndpointSecurity API。

使用此 API,FireEye 的 Stephen Davis 和 Objective-See 的 Patrick Wardle 迅速发布了事件监控应用程序,可以实时显示例如进程相关和文件相关的事件。但遵循 Process Monitor(“ProcMon”)脚步的只读监控工具虽然有用,却只使用了 EndpointSecurity API 功能的一半(监控能力)。Google 的 Santa 是一个用 Objective-C 编写的开源 macOS 进程允许/拒绝解决方案,展示了使用 EndpointSecurity 授权事件的能力:其代理现在接收来自 EndpointSecurity 的进程事件并做出允许/拒绝决策。

我们看到掌握 EndpointSecurity API 至关重要,因为许多团队需要在其现有的 macOS 安全应用程序中迁移到它。通过 Sinter 的开发,我们深入研究了 EndpointSecurity,从经验中吸取了一些教训,并为我们遇到的各种挑战提供了解决方案——这样您就不必再经历这些。Sinter 还演示了用 Swift 编程语言实现 EndpointSecurity 客户端,这承诺比 Objective-C 提供更好的内存安全性和性能,同时保持与所有其他新 macOS API 的兼容性。

开发 Sinter:非胆小者所能为

实现事件授权代理比实现只读事件订阅者困难一个数量级。我们还通过艰难的方式了解到 EndpointSecurity API 的某些缺点。以下是我们

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计