Mapping the Underground City: How Hackers Chart the Secret Blueprint of Your Mac's Kernel?
IOKit is the hub through which macOS applications reach hardware. It holds enormous privilege, yet there is no official map. Treat it as an underground city: first read the kext blueprints through static analysis, then survey the ground with the IORegistry and hooks, marking every service, user client, external method, and argument format so the fuzzer stops hitting blindly. How you search matters more than what you find.

Phrack 第 72 期 · 第 9 篇
这篇文章是一份为“探险家”们准备的精密地图绘制指南。它没有公布某个惊天动地的宝藏(漏洞),而是教会了人们如何系统地绘制出通往宝藏的地图。
想象一下,在你的Mac电脑那光鲜亮丽的用户界面之下,隐藏着一座巨大而繁忙的“地下都市”。这座都市,就是macOS的内核核心之一,名为IOKit。
它不是一座普通的城市,而是连接“地上世界”(你日常使用的App,如浏览器、音乐播放器)和“地下基础设施”(硬件,如USB接口、显卡、键盘)的总枢纽。地上的每一个应用程序,想要和硬件“说话”,都必须通过IOKit这座地下城里的特定“办事处”来传达指令。
正因为如此,IOKit成了一座戒备森严却又充满诱惑的堡垒。它的权力极大,直接与操作系统的心脏相连,因此也成了安全研究员和黑客们最感兴趣的“探险圣地”。
然而,这座城市有一个大问题:它没有官方地图。它庞大、复杂,有成千上万个“办事处”和“服务窗口”,但苹果公司从未提供一份完整的导览图。对于想要检测其安全性的“探险家”来说,这就像在黑暗的迷宫里摸索,你甚至不知道总共有多少扇门可以去推一推、试一试。
由安全研究员Karol Mazurek撰写的这篇《在macOS上映射暴露给用户空间的IOKit方法》,正是为了解决这个问题。它不是一份“藏宝图”,而是一本**《探险家地图绘制手册》**。
IOKit的运作方式:地下都市的组织架构
要绘制地图,首先要了解城市的基本运作规则。
区(Services):IOKit被划分为许多功能区,比如“USB设备管理区”、“图形显示区”、“网络通信区”等。每个区都由一个驱动程序(Driver)管理。
公共办事大厅(User Clients):普通App不能直接闯进管理区的办公室。它们必须去每个区设立的“公共办事大厅”。同一个区可以设立多个不同的大厅,比如一个给普通市民(标准接口),一个给VIP(管理员接口)。
服务窗口(External Methods):在每个大厅里,都有一排排的服务窗口,每个窗口都有一个编号(Selector ID)。每个窗口只办理一项特定的业务,比如窗口#0负责“查询设备状态”,窗口#1负责“更新固件”。
申请表格(Arguments):在每个窗口办事,都需要填写格式正确的“申请表格”,比如,窗口#0可能需要你提供一个数字作为输入,并会返回一个数字作为输出。
对于安全探险家来说,他们的终极目标,就是绘制出一份详尽的地图,标明:这座城市里,有哪些区?每个区有哪些办事大厅?每个大厅有哪些服务窗口?每个窗口接受什么样的申请表格?
探险家的两步工作法:蓝图研究与实地勘察
作者提出了一套双管齐下的系统性方法来绘制这份地图。
第一步:研究城市规划蓝图(静态分析)
在真正进入城市之前,探险家会先去“城市规划馆”,找到所有的建筑蓝图——也就是驱动程序文件本身(.kext文件)。
通过分析这些二进制文件,可以得到大量理论信息:
城市里规划了哪些“区”(
IOService类名)。每个区计划开放哪些“办事大厅”(
newUserClient函数)。每个大厅里设计了哪些“服务窗口”(
externalMethod分派表)。每个窗口设计的“申请表格”是什么格式(参数类型和数量)。
这就像根据建筑图纸,在纸上画出了一份理论上的城市地图。
第二步:亲自下到城市里走一趟(运行时枚举)
蓝图可能是过时或不完整的。有些规划好的建筑可能从未建成(比如你的电脑没有连接某个特定设备,对应的驱动服务就不会启动)。
因此,探险家必须亲自进入“地下都市”进行实地勘察。
询问前台:他们首先会去城市入口的“总咨询台”(
IORegistry),索要一份“今日开放办事处列表”,看看哪些区和服务是真正在运行的。安装“窃听器”:然后,他们在各个交通要道上安装“窃听器”(Hooking技术),监听普通市民(正常App)是如何与各个办事处沟通的。他们会记录下市民们使用的“服务窗口”编号,以及他们提交的“申请表格”的真实格式。
建立档案库(Corpus):通过“窃听”,他们收集了大量真实、有效的“申请表格”样本。这为后续更大规模的自动化测试提供了宝贵的“弹药”。
最终的“宝藏”:一份精确的攻击地表图
当蓝图研究和实地勘察都完成后,探险家就拥有了一份终极地图。作者建议用一种结构化的格式(如YAML文件)来记录,上面清晰地标注着:
驱动程序名称:苹果图形驱动
办事大厅类型#0:标准用户接口
服务窗口#0(查询状态):需要2个数字输入,0个文件输入;返回1个数字输出,0个文件输出。
服务窗口#1(调整亮度):需要1个数字输入...
办事大厅类型#1:专业用户接口
- 服务窗口#5(刷新固件):...
这份地图,就是安全研究员的“圣经”。
所以呢?为什么这份地图如此重要?
你可能会问,费了这么大劲,只是画了张地图,并没有找到任何漏洞啊?
这正是这篇文章最核心的价值所在。在现代网络安全领域,尤其是面对像IOKit这样庞大而复杂的系统时,“如何找”比“找到什么”更重要。
这份地图的诞生,意味着:
攻击面完全透明化:以前,研究员们像是在黑暗中摸索,凭运气和经验去撞击可能存在的弱点。现在,他们有了一份完整的清单,可以确保每一个暴露的接口都得到测试,不会有任何遗漏。
自动化测试(Fuzzing)的效率指数级提升:有了这份地图,自动化“撞门”的“莽夫”(Fuzzer)变得“智能”了。它不再是胡乱撞墙,而是可以拿着地图,走到每一个服务窗口,用格式正确的“申请表格”,填上各种随机但合法的数据,进行高效率、高强度的压力测试。发现裂缝的概率大大增加。
为整个安全社区赋能:作者无私地分享了这套完整的“地图绘制学”,让更多的研究员能够系统地对macOS的底层安全进行审计和研究,从而在恶意黑客之前发现并报告漏洞,最终让所有Mac用户受益。
结语
Karol Mazurek的这篇文章,展现了顶级安全研究的真正面貌:它不是一次性的灵光一闪,而是基于深厚的技术功底、严谨的科学方法和巨大的耐心,所进行的系统性工程。它告诉我们,在最复杂的数字堡垒面前,最强大的武器,往往不是一颗炸弹,而是一份完美的地图。
Originally published on the WeChat account 网安志异, 2025-10-26 · original
Comments