写点什么

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

王宇

  • 2019-09-15
  • 本文字数:2407 字

    阅读完需:约 8 分钟

祝贺滴滴开源第八个项目——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],我发现了更多的问题。如果第三方内核开发者真的想冒着风险在驱动中使用私有接口,除了有潜在的法律问题外,他们还会遇到兼容性问题。


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

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


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

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

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


其中,情况 1、2、3 是完全不可接受的修改方法,这种级别的接口变动会导致第三方驱动程序崩溃、内核 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 框架我们可以清楚地看到,苹果公司的 AMFI(Apple Mobile File Integrity)[9]、沙箱(Apple Seatbelt Sandbox)[10] 等模块都大量使用了上述接口:



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


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



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


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


本文转载自公众号滴滴技术(ID:didi_tech)。


原文链接:


https://mp.weixin.qq.com/s/idqfYTgS1qQKYatNcZUzeg


2019-09-15 23:181013

评论

发布
暂无评论
发现更多内容

面试突击72:输入URL之后会执行什么流程?

王磊

Java 面试

结合“xPlus”探讨软件架构的创新与变革

BizFree

敏捷开发 软件架构 数字化 信息化 软件定制

写给 Java 程序员的前端 Promise 教程

江南一点雨

Java spring 前端 springboot Promise

业务缓存之体系化设计与开发

Qunar技术沙龙

系统开发

Redis 定长队列的探索和实践

vivo互联网技术

redis 数据结构 消息队列 Lua脚本

Python逆向之 eval 函数解析,看着一篇就会了,案例掌房

梦想橡皮擦

Python 爬虫 8月月更

HMS Core分析服务智能运营6.5.1版本上线

HarmonyOS SDK

左益豪:用代码创造一个新世界|OneFlow U

OneFlow

实习 社区之星

开源一夏 | 牛plus,多层嵌套动态JSON该如何解析总结

知识浅谈

开源 8月月更

STM32F103ZE+SHT30检测环境温度与湿度(IIC模拟时序)

DS小龙哥

8月月更

在SAP分析云里根据业务数据绘制词云(Word Cloud)

汪子熙

SaaS SAP 词云 8月月更 word-cloud

Java 在Word中合并单元格时删除重复值

在下毛毛雨

java; 合并单元格 删除重复值

分分钟快速定制您的专属个性化软件应用——BizTool自动化工具简介

BizFree

软件开发 快速开发 低代码开发 个性化 应用开发

Spring(五、注解开发)

开源 8月月更

以技术御风险,护航云原生 | 同创永益 X 博云举办产品联合发布会

BoCloud博云

云计算 容器 云原生

一文读懂配置管理(CM)

SEAL安全

企业安全 企业it安全 代码安全

鲲鹏开发者创享日2022:鲲鹏全栈创新 与开发者共建数字湖南

科技热闻

【LeetCode】受限条件下可到达节点的数目Java题解

Albert

LeetCode 8月月更

PWA 应用 Service Worker 缓存的一些可选策略和使用场景

汪子熙

typescript 前端开发 angular Service Worker 8月月更

Kubernetes资源编排系列之四: CRD+Operator篇

阿里云大数据AI技术

大数据 运维

自动驾驶中的SLAM

博文视点Broadview

5S软件就是将软件应用全维度简单化的软件系统

BizFree

k8s 敏捷开发 软件架构 高性能 快捷调试

数据库不推荐使用外键的9个理由!

TimeFriends

8月月更

Dapr在Java中的实践 之 状态管理

万猫学社

Java 微服务 dapr Sidecar

易周金融分析 | 互联网系小贷平台密集增资;上半年银行理财子公司综合评价指数发布

易观分析

金融 分析 易周金融

转转商品系统高并发实战(数据篇)

转转技术团队

分布式 高并发

K8S之Flannel的vxlan网络模式初步源码解析

k8s flannel 签约计划第三季

Dapr在Java中的实践 之 环境准备

万猫学社

微服务 dapr Sidecar

Dapr在Java中的实践 之 服务调用

万猫学社

微服务 dapr Sidecar

如何用建木CI构建前端E2E质量自查

Jianmu

DevOps 前端 持续集成 代码质量 自动化测试

使用类似搭积木的低代码开发方式进行 SAP API 开发

汪子熙

低代码 云平台 SAP 8月月更 low-code

祝贺滴滴开源第八个项目——Kemon正式发布_文化 & 方法_InfoQ精选文章