大多数浏览器和
Developer App 均支持流媒体播放。
-
构建 Endpoint Security App
系统扩展可提高 macOS 的可靠性和安全性。 了解有关可替代 Kernel Authorization KPIs 的当代产品信息,并探索使用 Endpoint Security 框架制作优良的安全产品的相关技巧。
资源
相关视频
WWDC22
WWDC20
WWDC19
-
下载
(你好) (2020全球开发者大会) 你好 欢迎来到全球开发者大会 (打造Endpoint Security应用) 嘿 我叫马修 是安全工程与架构团队成员 今天我们来讲讲Endpoint Security框架 macOS Catalina中去年首次引入这个框架 用于替代Kauth KPI 不支持的Mac内核框架和OpenBSM审计轨迹
内核扩展或叫做KEXT 很难开发 更难调试 而且 KEXT还会带来维护噩梦 因为内核接口经常更改
KEXT也会降低系统整体安全性和稳定性 因为即使小缺陷也常会导致内核崩溃
而有了EndpointSecurity框架 你就不再需要开发内核扩展了 可以专注实现产品的真正目标
使用EndpointSecurity或称ES的产品 可以从普通应用程序接入富事件流 ES目前支持约100种事件 且后续不断增加
事件类型分为两大类别 告知操作正在进行的NOTIFY事件 还有AUTH事件 让你可以 控制操作是否继续 我们将讨论 EndpointSecurity子系统是如何工作的 你的产品怎么利用好事件流 以及你还可以使用哪些高级功能
虽然可以将ES应用程序作为独立产品分发 但将产品作为 基于EndpointSecurity的系统扩展交付 在我们看来可以获得很多好处 macOS Catalina中去年也引入了系统扩展 支持多种类型的扩展 包括网络扩展 用于编写VPN和内容过滤器等应用程序 控制硬件的DriverKit 还有针对端点检测与响应 等产品的EndpointSecurity 我们不打算在这里详细介绍系统扩展 但你应该了解下2019年全球开发者大会 《系统扩展与DriverKit》讲座相关内容
首先 这个扩展安装后 受到系统完整性保护功能的防护 防止你的扩展和资产遭到意外或恶意篡改
我们还为用户守护进程提供了高级别保护 保护级别类似系统守护进程 这意味着我们甚至能阻止root用户 卸载你的launchd作业
还有些EndpointSecurity功能 是系统扩展才能使用的 例如系统启动期间 在其他第三方应用执行之前 执行并设置事件流 我总是喜欢举例说明 所以我们先快速浏览下开始使用 EndpointSecurity所需的关键组件 注意 这个框架作为C语言库提供 可能稍微不同于 你可能遇到的很多其他Apple框架 用C语言可以更好地控制 某些内存和性能特性 而且 我们的目标是能够提供 现有产品可以快速采用的库 用C语言 这个库就能被许多语言调用 包括Swift、Objective-C和Rust
这个例子中你可以看到 我们先用API es_new_client初始化一个新的事件流 函数在输出参数中返回es_client_t句柄 重要的是 还定义了事件处理代码块 只要有事件待处理 就会调用这里传输的代码块
这个例子中的代码块只打印事件类型 接下来 我们设置事件流订阅 采用 es_subscribe API 本例中 数组里只有NOTIFY_EXEC一个事件
例子中还使用了es_delete_client API 只要订阅设置出错 就可以靠这个API清理 之前用es_new_client获得的资源
最后 我们调用dispatch_main 让程序继续执行 通过上面提交的事件处理代码块处理事件
为帮助理解EndpointSecurity的运行机制 我们从高层架构设计的角度出发 当你的进程使用es_new_client API 连接EndpointSecurity子系统时 会设置通道处理消息队列 这张图中有两个基于ES的应用程序
其中一个多次调用 es_new_client 设置了两个事件流 另一个只有一个通道 我们通常将这些通道称为ES客户端 每个ES客户端都可以有自己的订阅集 用来控制接收哪些事件
如果内核中有事件被触发 而我们的客户端订阅了该事件 EndpointSecurity会拦截这个事件 采用利于ES客户端分析的信息丰富事件 我们一会儿再详细讨论收集到的信息 但这些数据收集后封装在消息信封中 然后消息发往所有适当的ES客户端 排队等待事件处理代码块处理 所有客户端同时接收消息队列 对熟悉EndpointSecurity的用户而言 这在行为上略有不同 以前事件是串行传递给客户端的
我们稍后要讨论的一些事件会要求响应 这种情况下原始操作会在内核中挂起 直到接收到响应为止 而正常通知事件 或收到AUTH事件响应后 操作在内核中立即解锁 继续执行
关于这幅图 要注意的最后一点是 EndpointSecurity会尽量缓存 好减少需要为AUTH事件 传递的消息数量 缓存相关信息还有很多 我们稍后再讲
刚刚提到的消息信封指es_message_t结构 用来封装通过事件处理代码块 传给ES客户端的所有ES事件
每条消息主要包含三类信息 首先 消息元数据 包含事件类型、消息生成时间等信息 无论事件类型是AUTH还是NOTIFY 还有用于兼容性的消息版本号 稍后再讲
接下来 所有消息都包含 触发事件的进程的相关信息 进程信息包括可执行文件的信息 例如完整文件状态信息 还有代码签名、进程及用户ID等许多信息
最后 每条消息都含有特定于事件的信息 例如SIGNAL事件就包含收到信号的 进程相关信息和信号编号 EXEC事件包含被执行文件 和可执行参数等信息 OPEN事件含有被打开文件 和打开标志的相关信息
(检查时间、使用时间) 检查时间使用时间问题非常重要 开发ES产品时需要注意 我们来快速熟悉一下这个概念 之前检查为真的状态在使用时不再为真 但程序依然假定为真就会发生此类问题 文件打开操作分两步 先检查文件存在 然后打开文件 就是此类问题的典型例子 如果系统中某人在你的程序检查完 文件存在性但还没打开文件时删除了文件 而你的程序未正确处理打开失败异常 就有可能引发非预期行为
ES消息中提供的信息及时反映快照
系统继续并发处理多个线程 而在你的应用程序有机会检查消息之前 这些线程可能做出会改变系统状态的操作 也就是说 某些情况下消息中某部分的值 可能与你自己查询的信息不一样
产品中应该小心 检查时间、使用时间这样的问题 这跟当今基于内核扩展的产品 所面对的问题没什么两样 在深入演示之前还需要指出一点 EndpointSecurity有少量运行时要求 程序必须满足要求才能成功建立ES事件流
首先 应用程序必须拥有恰当的ES权限 这是一项有限权限 你可以通过这个链接申请配置文件
如果你的应用程序作为系统扩展捆绑 那包含应用包还需要额外的权限 才能安装这个扩展 系统扩展文档里可以找到相关信息 而且 系统扩展要用户同意才能完成安装 使用系统扩展API 开始扩展安装过程后 用户必须在通用面板上的 安全性与隐私偏好对话框中同意安装
然后 为增强用户隐私 我们要求你的应用程序获得用户同意 通过获得完全磁盘访问权限的方式 安全性与隐私偏好对话框的 隐私面板上可以设置这个权限
如果作为系统扩展部署 安装时我们在对话框里预填了你的扩展 让用户更容易开启这些权限
如果你的产品要部署在托管设备上 可以用两种MDM负载辅助分发 第一种 定义扩展的负载 定义无需用户同意即可自动安装的扩展 第二种 隐私偏好负载 用于自动开启完全磁盘访问权限 好的 现在我们进入第一个演示 我们将在演示中查看通知消息 并扩充一个现有ES扩展
这就是我们NOTIFY演示的主函数 我们可以很快看出这代码非常像 我们在前几张幻灯片中见过的示例代码 先用es_new_client设置新客户端事件流 这里的处理代码块调用handle_event函数 我们一会儿来查看这个函数 然后 我们设置订阅并调用es_subscribe 得到NOTIFY_EXEC和NOTIFY_FORK事件类型
一旦订阅就位 我们调用dispatch_main 让我们的程序继续执行并处理这些事件 我们转到handle_event 我们用switch语句分拣消息事件类型 条件匹配就在屏幕上输出事件消息 这个扩展已经获准在系统上安装并运行了 我们来看看到底会发生什么 我们先在这里设置日志流 用个谓词把注意力集中在 我即将进行的操作上 接下来 我用ps实用程序做例子
现在 我们执行ps 看到两条消息 先是Z shell复制出一个新子进程 然后这个复制出的进程 执行新的可执行程序 /bin/ps 现在 我们来扩展这个演示 添加EXIT事件获取完整进程生命周期信息 我们在事件数组中 将ES_EVENT_TYPE_NOTIFY_EXIT 添加到我们的订阅列表里
在handle_event函数中添加这个新条件
我得先加上break语句 防止一会儿忘了 在这里记录这个事件信息 设置几行OS日志函数样板代码 格式化字符串 像前面一样添加启动进程信息 还有pid
我知道EXIT事件包含一些事件特定信息 与进程退出状态相关 我们把这些也获取了
好的 现在 为这个格式化字符串填充数据 我们要先找到启动进程 可以在消息结构的进程成员中查找
我们可以查看可执行文件并最终获取路径
接下来 此进程的pid 至于所有进程的 可用EndpointSecurity审计令牌获取 里面包含了用户ID和进程ID之类的信息 可用BSM库函数audit_token_to_pid抽取 于是 我们再次深入进程字段 拉取audit_token
最后 EXIT事件释放的事件特定信息 也就是退出状态码 为此 我们查看消息的事件成员 从中拉取EXIT事件 最终在stat字段找到状态码
好了 我们开始编译链接这个扩展 然后我们需要安装扩展 提示一下 我设置了系统扩展开发者模式 可以更快部署测试扩展
要说明的另外一点是 系统扩展要求 包含应用包要在/Applications目录下 才可以安装扩展 所以我们要把 刚生成的包含应用拖入/Applications
然后执行应用并安装扩展 现在就是在执行更新了 新扩展如今已在系统上安家落户正常运行 我们再次以ps实用程序为例 可以看到 我们获取了第三条EXIT消息 包含状态码0 表明进程成功退出 作为快速示例 我们可以给ps传无效标志 然后我们可以看到状态码是256了 表示进程可能出问题了
刚刚我们演示了通知事件实例 接下来我们讨论AUTH事件 这是EndpointSecurity的重要功能 可以在系统上授权操作 AUTH事件是同步的 也就是说 我们为ES客户端排队消息后 操作在内核中挂起 无法继续 直到收到响应或过期退出
接收到的每条AUTH消息都有截止期字段 就包含在消息结构内部 你的ES客户端必须检查每条消息的截止期 确保在过期前执行完任务 如果客户端无法在截止期前响应 应用程序就会被终止
如果你的应用程序是系统扩展 我们为你提交的launchd作业将自动重启 强调一下 每条消息都有自己的截止期 不保证每条消息 都有相同的响应时间 这些值随时间改变
错过截止期时 会用隐式ALLOW作为响应 但不会缓存结果 以便能够重新评估将来的操作
有两个API可用于响应AUTH事件 大多数事件类型只要求ALLOW或DENY响应 使用es_respond_auth_result API
另一响应API es_respond_flags_result 用在事件有多个可以允许或拒绝的选项时 比如可以用只读 而非读/写权限打开文件
应查看文档了解每种事件类型适用的API 但目前仅AUTH OPEN事件使用标志结果API
如果系统上多个客户端订阅同一AUTH事件 所有客户端的响应便会 通过应用最严格的响应组合起来 所以 即使有4个客户端用ALLOW响应事件 只要有1个响应DENY 总体结果也是拒绝
标志响应同理 仅允许全部客户端所设标志的子集
你还应注意 ES不发送自省AUTH事件 因为这会导致简单死锁 事件会被隐式允许 但我们会向进程触发事件发送NOTIFY消息
使用标志结果API时应注意 你的ES客户端进程 应该以所允许的全部标志响应 不一定只是单个事件请求的标志 这与缓存有关 我们稍后再详细讨论 启用屏蔽 ES客户端可以不用接收 应用程序不感兴趣的进程发来的消息 有两种实现途径
第一种 使用es_mute_process ES应用程序提供唯一标识进程的审计令牌 客户端通常会从上一消息里获取审计令牌 ES子系统会自动跟踪进程退出情况 从你客户端的屏蔽进程集中移除退出进程 不必手动使用es_unmute_process API 除非你的客户端想再次开始接收 此前屏蔽进程的消息
ES还支持es_mute_path_literal完整路径 和es_mute_path_prefix路径前缀屏蔽
如名称所示 这一机制可阻止 匹配相应路径的启动进程发来的消息 我们建议ES客户端谨慎使用后两种API 尽管我们利用了可快速查询的数据结构 添加大量路径还是有可能 对性能造成不利影响 用进程审计令牌屏蔽事件通常更好些 不会产生那么多开销
很多AUTH事件可以缓存 ES客户端响应中的组合结果 存储在所有ES客户端共享的全局缓存中
EndpointSecurity使用的缓存策略很好 条目可在任何时刻过期 EndpointSecurity跟踪一些操作 自动无效化已缓存的条目 如文件被执行写入、截断、删除等操作时
尽管我们不保证会缓存响应 但如果ES客户端置零响应API的缓存标志 ES会保证不缓存这个结果 即使另一客户端确实请求缓存这个结果 ES客户端会拒绝缓存的一些原因 可能是EXEC事件 其中可执行文件非常依赖可执行参数 或环境变量 比如解释器 解释器中你可能想检查将执行的脚本
ES应用程序可用es_clear_cache API清除 整个缓存 但不支持无效化单个缓存条目
还需注意 ES会在新客户端连接 或现有客户端断开连接时自动清除缓存 这么做支持其余客户端以不同于 此前组合缓存结果响应的多种场景
我在前面提到过一条API使用重要警告 谨慎使用es_respond_flags_result API
虽然乍看有点反直觉 但响应必须包含 ES客户端可能为操作开启的所有标志 这是因为标志响应缓存的操作方式 和AUTH响应的相同
新事件发生时会首先查询缓存 如果存在已缓存条目 此条目中的标志 与新操作请求的标志相比较 不用产生AUTH消息就应用此比较结果
考虑进程以只读标志打开文件的情况 并假定这份文件对你的应用程序无关紧要 也就是说 你的应用程序想要允许进程 以任意所需方式操作这份文件 你的ES客户端进程以标志结果做出响应时 应设置所有合适的标志 包括WRITE标志 即使这个特定事件并未请求 因为如果不设置WRITE标志 如果进程将来要打开这份文件写入数据 而缓存的结果仍然存在 那写操作就会被自动拒绝 连AUTH消息都不会产生 即使这不是你的产品想要的结果 既然两种事件都介绍过了 我们来快速 对比下AUTH和NOTIFY这两种事件类型
NOTIFY事件总是异步的 我们为客户端排队消息 但操作立即继续 且可在ES客户端有机会看到消息前 就执行完毕了
跟前面讲过的一样 AUTH事件是同步的 没接收到响应之前操作一直挂起
至于消息传递 NOTIFY消息总会传递 但AUTH消息只在没有缓存结果时才传递 且消息不传递给 触发事件的那个进程
无论AUTH还是NOTIFY消息都不传递 如果触发事件的进程被屏蔽掉的话
最后 两种消息在结构上略有差异 NOTIFY消息包含 EndpointSecurity应用的结果 也就是相应AUTH消息的ALLOW或DENY结果 如果没有ES客户端订阅AUTH消息 或事件不存在AUTH消息 结果是隐式允许
至于AUTH消息 显然尚不存在结果信息 但是 消息含有截止期值 且要求ES客户端进程响应 现在我们做AUTH事件类型的演示 看看我们怎么编写客户端处理和响应消息 好的 我们再次从主函数开始 你会马上注意到这跟上一个演示长得很像 这里有点细微差别 我们将在异步的dispatch_queue上 执行一些异步操作 我们先设置队列 然后初始化我们的新客户端事件流 用es_new_client初始化 处理代码块再次调用handle_event函数
本演示中我们分析 AUTH_EXEC和AUTH_OPEN事件类型 订阅后我们再次调用dispatch_main 让我们的程序继续执行并处理这些事件
我们来看handle_event函数 又是switch语句 我们在这里为每个事件类型 调用恰当的处理函数 先从EXEC开始
这里需要注意的是 我们以ES_AUTH_RESULT_ALLOW 为所有EXEC事件 调用es_respond_auth_result 但留了条TODO来拒绝 匹配签名ID的新EXEC事件 我们通常期望多数产品要求更严格的策略 比如匹配CD哈希 但出于演示目的 观察我们要阻止的东西更加清晰 我们可以怎么做呢? 方式之一 我们可以对将要执行的新进程 应用简单的字符串比较 然后将签名ID与我们想要阻止的ID作对比
因为我们查看的是事件特定数据 我们深入到事件联合结构体中 我们可以在这里查看目标进程 拉取signing_id数据
与signing_id_to_block做比较 如果相同就拒绝 我们可以用es_respond_auth_result API 在这里向我们的客户端传递消息参数 然后定义我们的结果 也就是AUTH_RESULT_DENY
允许缓存这个结果 要完成这个功能 我们要在else语句中放入这个已有结果 如果新可执行文件 匹配我们想要阻止的签名ID 我们会以DENY结果响应而允许其他进程
现在我们来看看OPEN条件
handle_open函数可能看起来没那么熟悉 我们需要介绍几个 之前没怎么谈到的概念 建议你的ES客户端不要在事件处理代码块 执行太多任务 这通常指的是你不应执行大量I/O 或CPU密集型任务 这里的目标是你的事件处理代码块 应该尽可能快 好能返回并持续离队消息 保持消息队列规模较小 防止弃置消息
这个函数中 我们复制消息采用的是 es_copy_message API 稍后会详细讨论
消息复制后 我们异步调用handle_open_worker函数 调用完成就释放被复制的消息
那么 我们的工作者函数做些什么呢? 我们要考虑三种情况 首先 EICAR文件测试 解释一下 EICAR文件是个测试文件 杀毒软件产品通常用来在不往系统中引入 真实恶意代码的情况下测试杀毒操作 所以 演示中这个函数做些什么并不重要 只要知道它需要打开文件并检查内容就好 这个函数能很好地解释为什么要异步操作
假设这是个EICAR文件 我们要用es_respond_flags_result API 你可以看到 我们已经定义了全零掩码 基本上所有比特位清零 还将拒绝这个文件的所有打开操作
下面这里 我们留了个TODO
这里发生了什么?在if语句中 你可以看到 我们检查被打开文件的 打开事件特定数据 将之与只读前缀做比较 这里定义为/usr/local/bin 我们想阻止任何人操作这些目录中的文件
为此 我们可以 再次使用es_respond_flags_result API 传入客户端消息参数 现在我们得去定义标志 这里我们要拒绝的唯一操作 是写操作 我们可以定义之前设为全零的掩码 采用一些按位操作来清除写标志
这里你可能会注意到 EndpointSecurity为OPEN事件提供 内核版本的标志 而不是你熟悉的系统调用open的那套标志 OPEN事件的文档中有说明 你应该看一下
最后 我们允许缓存此结果 然后这里的最后一个条件已经编写好了 其他OPEN操作我们都设置了掩码 允许这些OPEN操作成功继续
我们来回顾一下
我们的程序要做三件事 首先 拒绝文本编辑应用程序打开 我们还没安装扩展 所以现在还能打开 文本编辑器还可以成功打开 我们还想拒绝写入/usr/local/bin中文件 作为例子 我们编写了hi.sh脚本 在屏幕上打印出“hi”
我们执行来看看 忠实执行了你期望它做的事 最后 home目录我放了个EICAR文件 我们把它打印出来 可以看到标准EICAR测试文件定义
好的 现在我们来生成我们的扩展
我们需要再次安装系统扩展 把它拖动到/Applications目录
现在我们启动包含应用包 安装新扩展 好了 我们的AUTH演示程序开始运行了 我们可以先尝试打开文本编辑应用程序 图标跳动了 但什么都没启动
接下来 我们修改usr/local/bin中的文件 可以看到 我们试图修改hi.sh脚本 想让它打印“Bye” 但是 现在已经不允许修改了 但这个文件还是可以只读打开的 而且脚本仍然可以运行
最后 我们想阻止所有操作的EICAR文件 我们可以看到 即使只读文件都不再允许 看过ES客户端中可以轻松处理AUTH事件后 我们深入一些更高级的话题 消息结构中包含版本字段 可以让你的ES应用程序保持兼容性 方便部署在不同版本的操作系统上
各种EndpointSecurity结构 都可以随时间发展添加新的字段 让我们可以向你的ES客户端提供其他信息 版本号是一个整数值 一个OS版本中所有消息都共享同一版本号
如果OS版本结构调整可能影响到兼容性 其版本号就会增加 使用新字段的客户端必须先检查消息版本 确保字段可用 没做检查可能导致未定义的行为 请密切关注ES结构的头文件文档 这些文档说明了哪些版本中添加了新字段
我们以创建事件的acl字段为例 初始版本中没有这个字段 添加后我们将消息版本增加到2 这个小例子中我们用 handle_notify_create函数 操作NOTIFY_CREATE事件 我们看到 访问acl成员之前 函数先检查消息版本 大于等于2
所谓的早期启动功能 是EndpointSecurity的有力机制 提醒一下 这个功能仅在 作为系统扩展的ES产品中可用 独立的ES应用程序中不可用 扩展可以通过在输入/输出列表中 设置NSEndpointSecurityEarlyBoot键 启用这个功能 系统启动中有注册早启动客户端时 系统仍然正常启动 但不会允许任何第三方应用程序执行 除非所有早期启动扩展都已就绪 为发送就绪信号 你的扩展需要至少 调用一次es_subscribe API
所有早期启动客户端都执行首个订阅后 第三方应用才最终允许执行 这意味着 你的客户端应该准备好 在单次es_subscribe 调用中订阅全部必要事件 如果将事件分散到多个调用中 可能在额外的订阅就位前 第三方应用就开始执行了 你的客户端可能会漏掉事件
需要强调的是 EndpointSecurity子系统 强制要求截止期 所有早期启动客户端 都必须在截止期前发送就绪信号 一旦过期 所有第三方执行自动允许继续
你的扩展应该注意防止错过事件 不要在订阅前执行长初始化过程
我们不认为截止期值是API 也不认为它会随时间变化 但我们认为 这个值有利于你的产品启动就绪 避免对最终用户造成很大影响
你们如果用过EndpointSecurity框架 就会注意到我们不提供 联网操作相关的事件 这是故意为之 因为这些事件 在NetworkExtension框架得到更好呈现
但UNIX域套接字是个小例外 ES确实为这些套接字提供事件
你还应该知道 EndpointSecurity和NetworkExtension 两个框架都能通过一个组合系统扩展使用 对于此类产品 系统扩展API和安装流程 都应该像使用单个扩展那样 正常使用和进行
另外 你可以在扩展的info.plist中组合 特定于网络扩展 或EndpointSecurity扩展的键值 系统会恰当应用这些键值
ES按发生顺序为客户端提供消息 例如 客户端订阅FORK和EXEC事件时 通常情况下 当新进程产生 客户端处理代码块总会在相关EXEC事件前 接收FORK事件 需注意 这个消息排序 适用于单个ES客户端上的订阅 如果你的应用程序创建了多个ES客户端 且订阅分散其间 事件的顺序就只 相对于每个ES客户端的订阅了 如果需要的话 你可以用消息结构体中 包含的消息生成时间重构全局顺序
传递给ES客户端的消息每次一条 且只在ES客户端事件处理代码块处理完 上一条消息返回时才传递 处理代码块接收的消息结构 仅在调用处理代码块 处理那条消息期间有效 一旦从代码块返回 就不该继续访问消息 因为这么做会导致未定义行为
如果你需要延长消息的寿命 就像我们演示程序中需要做的一样 你可以使用es_copy_message API 这个函数会返回消息的句柄 直到调用es_free_message API前都有效
这里面反映出一个重要特性 我们不一定需要在处理代码块返回前 响应AUTH事件 也就是说 AUTH事件未必需要 按传递给ES客户端的相同顺序响应
你的应用程序应当先检查未来的消息 好在上一条消息的基础上做决策 这种情况下 ES应用程序可以先复制消息 从处理代码块返回 开始检查其他消息 然后恰当响应先前复制的消息 别忘了最后要在不再需要时释放那条消息 如果你需要做一些异步消息处理 比如使用异步调度队列 你要确保按适用于你应用程序的 服务质量等级初始化调度队列 这可能取决于很多因素 例如你是否订阅AUTH事件、预期事件规模 或者你想使用多少CPU或系统资源 下面 我们分享几条有用的建议 帮助开发很棒的EndpointSecurity产品
你可能已经注意到消息结构中的 布尔类型成员is_es_client ES应用程序无法授权自身操作 因为这些内省事件是自动允许的 但系统上可能有多个ES客户端 ES客户端确实可以授权其他客户端的操作 无论AUTH还是NOTIFY消息 is_es_client字段都将被设置为真值 如果启动进程含有 EndpointSecurity客户端权限
ES客户端应检查此字段并采取恰当操作 确保不会不当干扰这些客户端的操作 也不会执行可能造成反馈循环的操作
路径屏蔽是种很奇妙的方式 可以防止你的客户端被消息淹没 还能通过减少需处理或授权的消息数量 帮助改善系统整体性能 举个例子 如果你的客户端不在意 Mac OS索引文件的聚焦服务 适当屏蔽索引进程 可以大幅减少某些事件类型收到的消息
利用缓存的应用程序 应注意仅将缓存用于性能目的 缓存从来不应该用于策略目的
这是因为 正如前面所说的 缓存条目随时可能过期 举个例子 如果你的应用程序 决定拒绝某个进程打开任何文件 并允许缓存响应 你就不应该屏蔽此进程 考虑此缓存条目稍后失效或被移除的情况 即使这个进程尝试 重新打开文件 也不会产生任何AUTH事件 因为你的ES客户端已经屏蔽了这个进程 这些打开操作会被自动允许
下一条建议是在订阅AUTH事件时 仔细调试你的ES应用程序 响应截止期是无法禁用或延长的 即使应用程序遇到断点 你也要在截止期前响应队列中的AUTH事件 否则你的进程将会按正常规则终止
最后 如果消息队列满了 EndpointSecurity可能会 丢弃消息而不传递给客户端 客户端可以判断是否发生了这种情况 方法就是检查消息结构中的序列号字段 序列号每客户端每事件类型独有 所以你可以确定 每种事件类型具体漏掉了多少 掉漏率高的客户端可以利用 更高级的EndpointSecurity API使用模式 比如屏蔽、异步处理 以及跨多个ES客户端分割订阅
今年 我们宣布放弃审计子系统 这主要是指与审计事件相关的功能 例如写入审计轨迹文件的事件 通常是/var/audit目录里的那些 还有为想要实时事件流的应用程序 发送到Auditpipe伪设备的事件 审计令牌和审计会话等不适用 这些仍然是系统的核心部分 应当迁移依赖审计事件的产品 使用EndpointSecurity框架 macOS Big Sur有什么新功能?
首先 EXEC事件有新的事件特定API可用 ES现在提供 文件描述符和文件描述符类型列表 新进程从这里开始执行 我们还提供Pipe文件描述符专用唯一标识 让你能够跟踪多个进程通过Pipe进程间 通信机制通信的情况 性能所限 不是所有文件描述符都能提供 主要关注点在标准输入 标准输出和标准错误描述符上 但如果存在的话 我们也提供更多描述符 而且客户端能获悉有无其他描述符 是我们还没有枚举的
至于性能 EndpointSecurity框架的早期采用者 可以对macOS Big Sur抱有很大期待 我们重新编写了 很多数据结构来减少内存分配 和增加事件吞吐量 我们调整了缓存 期望清除无效化瓶颈 并改善整体内存性能 所有这些增强都能带来更好的系统性能 和更少的掉漏 我们认为这也能赋予你的 EndpointSecurity产品更好的性能特征
macOS Big Sur还加入了一些新事件类型 其中一些是 已有NOTIFY事件的新增AUTH变体 一些就是全新的事件了 我在这里点出两个 第一个 应广泛要求新增的跟踪事件 这个事件会通知你的客户端进程正在调试
第二个 我们很高兴地 推出CS_INVALIDATED事件 众所周知 签名进程执行时 内核不断验证分配了内存页的代码 是否匹配这个二进制文件的页面哈希 发现不匹配 进程就更新代码签名标志 清除CS_VALID标志位 以前 ES客户端不得不等待将来的消息 检查启动进程的代码签名标志 判断是否已经无效 而借助这个事件 客户端就能得到即时通知 需要指出的是 使用强化运行时功能的二进制文件 例如设置了CS_KILL代码签名标志的那些 只要发现哈希不匹配 仍会被系统自动终止
接下来要做什么呢? 首先 你可以使用上面这个链接 开始请求有限EndpointSecurity权限 然后 你可以在Apple Developer网站上 查看EndpointSecurity 和系统扩展API官方文档 我建议你仔细阅读SDK中的 EndpointSecurity头文件文档 我们在里面添加了 网站上可能没有的很多注释和细节 可以回答常见问题并帮你构建很棒的产品 最后 我们将公开示例代码 很大程度上基于今天的演示程序 帮你入门EndpointSecurity框架使用 感谢参加 我们期待见证你打造的产品 尽享精彩2020全球开发者大会 (2020全球开发者大会) (你好) (2020全球开发者大会)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。