固定链接 滴滴开源第八个项目——Kemon正式发布

滴滴开源第八个项目——Kemon正式发布

滴滴开源第八个项目——Kemon正式发布

今年我给 Black Hat USA Arsenal DEF CON 26 信息安全会议投了两个议题,分别是:Kemon: An Open-Source Pre and Post Callback-Based Framework for macOS Kernel Monitoring [1] 以及 Attacking the macOS Kernel Graphics Driver [2]。两个议题都是以我去年开发的 Kemon macOS 内核监控框架为基础,第一篇议题侧重于监控框架自身的设计与实现,第二篇则侧重于 Kemon 监控框架在 macOS 内核漏洞挖掘上的应用。在公司拥抱开源理念的鼓舞下,决定分享给大家。

 

Kemon 驱动监控框架的最早需求源自于去年的 macOS 内核监控及数据防泄密项目,在此之前我并没有 macOS 的开发经验。当评估完现有 macOS 内核监控接口之后,我发现这些接口对于第三方内核开发者而言并不是非常友好。具体来说,从 Mac OS X 10.4 Tiger 开始,苹果公司分别引入过两种内置的监控子系统:内核授权子系统 [3](Kernel Authorization Subsystem)和强制访问控制策略子系统 [4](Mandatory Access Control Policy Subsystem),但是它们或多或少的存在着缺陷。

 

内核授权子系统是在 2005 年被引入 Mac OS X 10.4 Tiger 内核的,这套系统目前存在非常明显的问题,我总结了五点:

 

1.自 2005 年至今,苹果公司并没有对该子系统进行过任何的维护或更新。

 

2.对于 KAUTH_SCOPE_FILEOP 事件类型的监听者而言,内核仅有七种内置事件可用。在实际的项目开发中,这些支持是远远不够的。

 

3.对于 KAUTH_SCOPE_FILEOP 事件类型的监听者而言,上述七种事件的形式仅为通知,监听者无法阻止事件的发生,而这往往是不可接受的。举例而言,假设我们检测到了某款勒索软件的爆发,但如果我们不能阻断该勒索软件的执行,这种安防能力就显得非常鸡肋了。

 

4.对于某些特定的事件而言,输入参数缺乏关键的上下文信息。具体来说,对于进程创建事件,输入参数缺乏进程命令行信息;对于文件打开事件,输入参数无法区分此次操作是“打开已存在的文件”还是“新文件被创建后打开”。虽然我们常说不要在意这些细节,但是,产品水平的高下往往就在这些不起眼的细节里。

 

5.对于 KAUTH_SCOPE_VNODE 事件类型的监听者而言,由于系统缓存机制的存在,并不是所有的 VNODE 操作都会触发我们的回调接口,而这也意味着我们的监控点可以被旁路。

 

无奈之下,我将目光投向了强制访问控制策略子系统。该子系统于 2007 年被苹果公司引入 Mac OS X 10.5 Leopard 操作系统内核,可是,我惊奇的发现这套接口在 2008 1 月被苹果公司禁止第三方调用 [5],也就是说这套细粒度的强制访问控制策略集是苹果的私有方法。在阅读了 XNU 关于 Mandatory Access Control Policy 所有的公开代码之后 [6],我发现了更多的问题。如果第三方内核开发者真的想冒着风险在驱动中使用私有接口,除了有潜在的法律问题外,他们还会遇到兼容性问题。

 

ERRORInnodb访问了一个undo log表空间之外的数据页。

 

兼容性问题 1:接口被直接删除或替换

兼容性问题 2:接口参数被随意修改或添加

兼容性问题 3:新的接口被插入到派遣函数表的中间位置

兼容性问题 4:接口被修改,但是苹果公司的开发人员忘记提升策略版本号,这会导致二义性问题

其中,情况 123 是完全不可接受的修改方法,这种级别的接口变动会导致第三方驱动程序崩溃、内核 Panic

 

为了给 macOS 内核监控带来一些变化,我打算实现自己的监控方法,个人内部代号 Kemon。由于 macOS 64 位系统里没有类似于微软 PatchGuard [7] 的内核自保护功能,使用 Inline Hook 修改内核变成了可能。我基于 Distorm3 [8] 反汇编器用汇编代码实现了一个 Inline Hook 引擎,并借鉴了 Windows 内核 Pre Post 回调的设计想法,为 macOS 内核引入了新的回调方案,即 Kemon 框架可为任意系统内核函数扩展前、后过滤功能。

 

简言之,在前回调接口中,第三方可为内核扩展输入参数过滤功能;在后回调接口中,第三方可为内核扩展返回数据过滤功能。基于此工程框架 Kemon macOS 内核实现了驱动防火墙、强制访问控制策略监视器、内核模糊测试器等新功能。

 

我在 Black Hat USA Arsenal 向现场的观众展示了 macOS Kemon 驱动防火墙:

另一个现场展示的功能是强制访问控制策略监视器。值得一提的是,在现有系统里没有任何方法可以窥探前述的 Mandatory Access Control 私有接口的使用情况,但是通过 Kemon 框架我们可以清楚地看到,苹果公司的 AMFIApple Mobile File Integrity)[9]、沙箱(Apple Seatbelt Sandbox)[10] 等模块都大量使用了上述接口:

如果想深入研究 macOSiOS 系统沙箱的设计与实现,也许这是一个好的起点。另外一个值得展开的细节是,在转储、遍历系统数据结构之前,我们需要先持有数据结构对应的保护锁,而 Mandatory Access Control 不会为第三方导出私有的互斥锁,那么如何正确持锁便成了一个难题。我通过阅读 XNU 的源代码找出了解决方案,具体实现请参阅 Kemon 驱动代码。

 

8 12 日的 DEF CON 26 黑客大会上,我着重向观众们介绍了 Kemon 的另一个应用:内核模糊测试器。通过使用自己开发的模糊测试器,去年我发现了 macOS 显卡驱动的大量漏洞,例如:CVE-2017-7155CVE-2017-7163CVE-2017-13883,该工作获得了苹果公司的致谢 [9]。

在会议的最后,我还向现场的观众们展示了 macOS 内核最新的零日漏洞(Zero-Day Vulnerability),目前苹果官方尚无针对此漏洞的补丁。在会议之前我已将上述问题报告给了苹果的安全中心,希望他们可以快速地修复漏洞、保障广大苹果用户的设备安全。

 

DEF CON 26 会议开始之前,苹果安全团队的三位小伙子请我吃了一顿算不上美味的墨西哥土豆卷饼,在 Las Vegas 待上一周我想大家都会想念中餐。但是我们愉快的探讨了我上报的零日漏洞细节、macOS 内核安全、内核监控与漏洞防护、iOS 系统安全等话题。一个小时过得很快,双方约定八月在 Apple Infinite Loop 总部再进行探讨。

关于 Kemon 的更多细节,请您参阅源代码:https://github.com/didi/kemon

 

本文作者:王宇,来源:滴滴技术微信号,原文【链接】

您的留言将激励我们越做越好