NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

祝贺滴滴开源第八个项目——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:18808

评论

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

在线文本列表交集计算工具

入门小站

工具

Java 8 开始新增的 Optional 类 - Optional 中的方法

HoneyMoose

Java 8 开始新增的 Optional 类 - Optional 对象中的异常

HoneyMoose

万字长文!一文搞懂InheritedWidget 局部刷新机制

岛上码农

flutter ios 前端 安卓 5月月更

☕️从 Java8 到 Java17 的新特性(四):Java11 的新特性

看山

Java Java11 LTS

☕️从 Java8 到 Java17 的新特性(五):Java12 的新特性

看山

Java Java12

焱融看|2022 年存储自动化的 5 大趋势

焱融科技

云计算 分布式 云原生 高性能 文件存储

Java 8 开始新增的 Optional 类 - 创建 Optional 对象

HoneyMoose

[数据分析实践]-Image Matching-2DTo3D-1

浩波的笔记

人工智能 机器学习 数据分析

看透说破:客户服务首解率(FCR)的迷思

龙国富

客户体验 首解率

【LeetCode】验证外星语词典Java题解

Albert

LeetCode 5月月更

基于SVN的CICD调研方案

ZuccRoger

5月月更

Vue数据响应Object.defineProperty

空城机

vue.js 5月月更

记一次简单易上手的内网渗透实战

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

零基础学Java第二节(运算符、输入、选择流程控制)

编程攻略

Java学习 5月月更

☕️从 Java8 到 Java17 的新特性(三):Java10 的新特性

看山

Java Java10

前端学习笔记(一):css学习笔记

恒山其若陋兮

5月月更

总工程师直播解析:隐私计算是什么,都有哪些核心技术和典型应用场景? | 第17 期

OpenAnolis小助手

隐私计算 龙蜥社区 sig 龙蜥大讲堂 海泰方圆

ArrayList源码分析-迭代器

zarmnosaj

5月月更

一文读懂Move2Earn项目——MOVE

西柚子

linux之sudo使用技巧汇总

入门小站

Linux

在线TSV某一列提取下载

入门小站

工具

难对齐、难保障、难管理?一文了解字节跳动如何解决数据SLA治理难题

字节跳动数据平台

字节跳动 数据治理 SLA 数据研发

JavaWeb JDBC

Emperor_LawD

javaWeb JDBC 5月月更

Java 8 开始新增的 Optional 类 - 检查 Optional 的值

HoneyMoose

【刷题第 11 天】26. 删除有序数组中的重复项

白日梦

5月月更

四、容器安全风险分析

穿过生命散发芬芳

云原生安全 5月月更

☕️从 Java8 到 Java17 的新特性(二):Java9 的新特性

看山

Java Java9

Redis「6」实现消息队列

Samson

学习笔记 Redis 核心技术与实战 5月月更

一文读懂Move2Earn项目——MOVE

小哈区块

【活动预告】云上数字工厂与中小企业数字化转型创新论坛

阿里云弹性计算

数字化转型 中小企业 云盒

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