《最强iOS和macOS安全宝典》以苹果操作系统的安全为主题,主要面向苹果高级用户、系统管理员、安全研究人员和黑客。
本书主要分三个部分:第一部分重点介绍了苹果公司在macOS和iOS上部署的安全服务和安全防护机制,通过学习这些技术,读者可以更好地了解苹果操作系统;第二部分介绍了如何绕过这些安全机制并最终实现iOS越狱。在某种意义上,可以把第二部分看成是一份迷你的“iOS黑客越狱手册”,里面介绍了历年来极经典的苹果系统漏洞和越狱程序;第三部分提供了一份macOS安全加固指南,可以帮助系统管理员和用户更好地加固自己的操作系统、从而有效地抵御黑客的攻击。
深度剖析苹果底层系统,盘古团队专序推荐
这本书是我计划写的Mac OS X and iOS Internals, 2nd Edition系列中的第3本。然而,它不仅早于第1本和第2本出版,而且我原来的计划中根本就没有它。我最初计划的是将第1版的Mac OS X and iOS Internals扩充成2本,结果变成3本。由于涉及watchOS和tvOS,本书就不再只是关于iOS的了。因此,我选择了*OS作为书名的一部分。后来,苹果公司将Mac OS X中的“X”去掉了(但不是10?!)。因此,现在书名只能变成*OS Internals。
当我开始写Mac OS X and iOS Internals的时候,很快就意识到,最初想写成一个(很长的)章节的内容完全有能写成一本书。这一章初稿的篇幅在以惊人的速度增加。然而,越深入探究苹果公司精心设计的体系结构中隐藏的细节,就越认识到需要详尽讨论安全(我在第1版的附言中曾涉及的主题)的必要性,以便展示这无数个小片如何整合为一个整体,而这个整体要远大于其各部分之和。
因此,我决定重新调整该书的结构,将本来应该出现在第1本(用户模式)和第2本(内核模式)中的相应内容移到本书。仅仅这些内容就有十几章。但随后我想到,如果写一本以安全为主题的书,为什么不讲一讲风险呢?为什么不讨论结构的缺陷(主要指实现中的缺陷,以及程序中存在了几十年的漏洞)?这些缺陷可以用来突破系统安全防护,首先也是最重要的,就是用于对防守严密的*OS变体(iOS、watchOS和tvOS)越狱。
如果你读过前一个版本(那时书名还叫作Mac OS X and iOS Internals),就会发现本书有极大的不同——它已从各种限制中解脱出来。第1版的篇幅受到了我(当时)的出版商的限制。起初,我愚蠢地估计为500页,但实际上有800页左右,而他们拒绝了我增加篇幅的请求。最终的结果是,后面的章节越来越短,讲IOKit的那一章甚至不足30页。众多有深度的资料我想放入书中,都未能如愿。
另一个限制主要在于我被要求只能讨论苹果公司操作系统的非机密问题。从本质上讲,就是只能讨论从各种开放源码中获取的内容。我尽量突破各种限制,但总的来说,仍在界限之内。私有框架属于禁区,例如通过逆向工程获取的内容,都不能出现在书中。
但是现在,我自己就是出版商。我需要买回自己的出版权(我知道这事很恐怖),但打破这个桎梏的代价很小。在这一点上,仅有的枷锁,如果有的话,也是我加给自己的。我却因此获得了更大的自由。第一个限制——篇幅,使我将本书分为3本,每一本都相当于或多于第1版的篇幅。然而,更重要的是,我可以自由讨论每一件事情。利用配套网站的论坛,我收集了许多对主题有帮助的建议并加到书中,它们大多是没有正式文档描述的主题,绝对不是你可以在苹果公司开源网站上发现的内容。的确,这里所涉及的主题,特别是*OS领域,都是关于代码的,其来源绝不会冒险超出苹果公司的网络和VPN(虚拟专用网络)。同样,对提供安全特性的守护进程、框架、内核扩展的逆向工程方面的内容,书中都有详细的讲解。这也是本书需要这么长时间撰写的原因。
是的,写本书(第3卷)花了很长时间,我还要用更长的时间来写第1本和第2本。没有限制也有缺点——没有截稿日期。另一方面,花这么长的时间写作,能够使我确定再确定,你在书中读到的任何东西都适用于iOS 10。事实上,苹果公司在iOS 10b1中提供了一个未加密的64位内核缓存,我从中提取了真实的汇编代码片段,而不是内核内存转储。
当第1本出版时,你会看到关于XPC、launchd(很快,朋友们,很快就会出版)、dyld、Mach消息和用户模式中的API的详细讲解,以及关于Grand Central Dispatcher、Objective-C和Swift的讲解,还有很多其他重要的系统方面知识的讲解,而后者要么那时已经不是目前的形式(大约是OS X 10.7/iOS 5.x),要么由于严格的篇幅限制而被省略——可能到那时本书的页数已经超出范围了。同样,第2本将深入讲解内核,覆盖新增的内容,例如Mach vouchers和活动率追踪,以及苹果公司引入的重要的QoS增强措施。我将第一次分析内核区域(zone)管理、电源管理和图像处理等细节,并且进一步讲解IOKit,这是它的重要性所决定的:不但详细解释它的实现和数据结构,而且对一些突出的IOFamily进行探索。还将有专门的一章探索Mac和苹果设备。
这一次,我尝试采用类似《最强Android书:架构大剖析》一书的风格,那本书旨在模拟Russinovich、Solomon和Ionescu所著的传奇般的Windows Internals一书。与第1版不同——第1版中许多页面被代码所占据(特别是XNU的代码),这一版尽可能回避代码片段,选择用框图来展示通过精心编写的代码搜集到的信息。然而,下列情况则属于例外:
1. 如果是一个特别相关而且很重要的代码片段时。例如该片段含有一个漏洞。这种情况在第二部分相对常见,该部分讨论程序漏洞和对这个漏洞的利用。
2. 如果正在讨论的代码反汇编或反编译自苹果公司操作系统的二进制文件或越狱软件,而该代码并没有开放源码时。如果是后者,我会在代码中添加注释,以方便阅读。
3. 如果该代码是“实验”的一部分时。该实验为了获得想要的输出结果,要求按照特别的顺序输入指令。
总而言之,我想你会发现这个新版——所有的3本——是值得从头阅读的,它完全淘汰了前一版。随着macOS和iOS家族不断升级版本,我计划不断更新本书,使它“保持活力”,像我对Android Internals一书所做的一样。尽管本书出版后内容就无法再更改了,但由于每次印数较少,使我能在随后每个印次的版本中都进行少量的更新和修改。如果iOS 13出现时,我仍在做这些工作(谁知道呢?),就有可能撰写本书的第3版。
┃ 目标读者
尽管本书是*OS Internals三部曲中的一本,但它几乎是独立且完整的,而且依然以安全为主题。因此,有安全意识的人会最先发现这本书有用。本书的第一部分面向macOS系统管理员、高级用户、安全研究人员和审计员。我已经公开和记录下来的关于内部API的内容可以作为模糊测试的基础,对于希望使用这些子系统接口的程序员,这部分内容也可能是有用的。
第二部分讲了很多底层的内容,有很强的技术性,可能不适合心理脆弱的初学者,或者对英特尔和(或)ARM64框架深恶痛绝的人。然而,逆向工程师和黑客可能会喜欢这个部分。它不仅讲述了漏洞形成的原因和越狱的深层细节,而且给出了使用调试器逐步跟踪的步骤,以及大量的反汇编例子。
┃ 本书内容概览
本书分为两个部分。老实说,其中的内容足够写两本书了,但与《英特尔架构手册》不同,我决定不再进一步划分内容的组织结构了。
第一部分
第一部分重点介绍苹果公司为macOS中的安全服务和/或锁定*OS系统而提供的安全机制和技术。大多数的实现在所有平台(特别是从macOS 10.11开始)都是相同的,但*OS仍然是苹果公司投入最大的部分。
? 第1章讲述身份验证,它基本是macOS的特性,因为*OS(目前)是单用户系统。虽然我们讨论了传统的master.passwd文件,但重点在于macOS可插拔认证模块(PAM)和OpenDirectory的实现,以及与外部域(即NIS)和Microsoft的Active Directory的集成。
? 第2章讨论了审计,即追踪用户或进程的操作(无论是授权还是尝试),并提供详细的日志跟踪记录。macOS中的审计是从Solaris借过来的一个功能,实际上是默认开启的——但几乎无人知晓。审计为其客户(通常是管理人员或监控软件)对系统所有方面(无论大的方面还是小细节,用户还是内核)进行前所未有的监控。
? 第3章通过探索身份验证——允许或拒绝用户或进程(第1章中所讲的身份验证)的操作来完成AAA(Authentication、Auditing和Authorization)三位一体。有一个KPI(内核编程接口)被称为KAuth (由于它是对内核扩展的非官方支持,因此在*OS中不可用)。
? 第4章将进一步深入探讨身份验证和内核,并详细介绍强制性访问控制框架,通常称为MACF。这是借用了其他系统的另一个功能(来自TrustedBSD)。MACF比审计的功能更强大,后者在事件发生之后发送通知,而MACF实际上可以拦截操作(允许或拒绝操作,甚至修改它们)。苹果系统所有的安全都建立在MACF提供的基石之上,特别是*OS。迄今为止,它是最强大的授权机制(能力远远超过KAuth),但不幸的是,它被认为是苹果公司的私有KPI。
? 第5章讨论代码签名,它是MACF最直接的应用,是苹果公司自iOS以来在*OS中一直执行的安全措施,最近也开始在macOS上实施。虽然苹果公司的操作系统不是唯一使用代码签名的操作系统,但它们的实现迄今为止是最先进的。代码签名与授权配合,成为应用级安全的基础。
? 第6章是关于macOS的,讨论了其软件限制机制:从macOS GateKeeper开始,苹果公司在macOS 10.7.5中引入这个机制,试图打击针对macOS的恶意软件。GateKeeper与诸如authd和syspolicyd等守护进程,以及一个名为Quarantine隔离区的专用内核扩展互通。随后,讨论的话题转到macOS的“托管客户端扩展”,它们被用于企业环境和家长控制。
? 第7章讨论AppleMobileFilelntegrity(AMFI),一个它的朋友和敌人都知道的名字。虽然名字中有“Mobile”,其实作为iOS代码签名的执行者,AMFI从macOS 10.10开始就在macOS中出现,而且它在macOS 10.11中还有更大的作用,也就是所谓的SIP(系统完整性保护)。本章将通过逆向MACF策略、MIG消息和IOUserClient,深入探索iOS和macOS版本的实现。
? 第8章讨论了苹果公司的沙盒,这也是一个基于MACF的应用程序,苹果公司早在macOS 10.5时首次尝试该应用程序,那时将其命名为“SeatBelt”。尽管当初的实现相当幼稚,而且还是选择性实施的,但是现在它已经有相当大的发展,并成为iOS上最强大的监狱。对沙盒的介绍先从其基础开始,到macOS的“AppSandbox”,再到加固的iOS实现。第8章详细介绍了其配置文件、容器和其他构建模块,为讨论macOS 10.11的SIP和iOS 10的平台配置文件奠定了基础。
? 第9章讨论macOS的SIP:一旦建立基础设施(AMFI和沙盒),SIP就只是一种全系统政策的定义而已。虽然iOS 9.x中不存在SIP,但其在*OS上的使用只是时间问题,并且iOS 10的平台策略已经显著加固了。
? 第10章讨论隐私,在所有操作系统中,它都是由一个小型的无文档描述的守护进程TCCd处理的。该守护进程驻留在一个数据库中,该数据库定义了哪些应用可以访问哪些存储,并提供一个由私有TCC.framework包装的XPC API。这一章进一步分析了唯一标识符(尤其是在iOS上),因为许多软件供应商都要寻找并识别他们的软件安装在什么设备上。
? 第11章的重点是数据保护。关于这个特性,macOS的实现与*OS的实现再次有所不同。macOS的解决方案是FileVault 2,它与CoreStorage一起在macOS 10.7中引入。*OS的解决方案更加深入,通过硬件支持的密钥来增强加密,有时候对每个文件都进行加密。
第二部分
第二部分审视了第一部分介绍的所有精巧构造——苹果工程师最好的设计,讨论了它们是如何出其不意被利用的。这部分中的每一章都会剖析以前出现过的(不同类型的)漏洞(现在均已被修补),并且这些漏洞可能被macOS中的恶意软件或iOS越狱软件利用。
对于macOS漏洞,我会强调那些主要困扰macOS 10.10(在其每个次要版本中都有重要意义)的漏洞,以及几个macOS 10.11的漏洞。对于iOS漏洞,我决定按照越狱软件的时间表进行跟踪:没有比越狱更好的例子来展示这些漏洞以及其利用方法了。每个越狱软件都是在用多个漏洞构建巧妙的拼贴组合,以正确的方式利用它们就能解除iOS(及其衍生系统)的束缚。
在某种意义上,可以把第二部分看成是一份迷你的“黑客手册”,我认为我所提供的细节有足够的深度,知识覆盖面也很广,相对很多逆向工程或安全类图书来说算是前所未有了。虽然我认识不少越狱天才,但是我仍然抵制了“作弊”的冲动,从研究人员的角度逆向了越狱软件的二进制文件。在这个过程中,我用的是自己的工具,并且在本书的配套网站提供了这些工具。
最后,本书附录包含一个macOS安全加固指南。最初我认为不会写这么多,但是Sebastien Volpe提的一个问题让我觉得这是个好主意——在详细介绍许多安全功能并分析漏洞后,用这个内容作为本书的非正式“总结”是有道理的。
┃ 阅读建议
如果第一部分各章所讲的内容是专门针对mac OS或*OS的主题,则会在标题中指出;否则,这些内容可能适用于所有操作系统。在某些情况下,某一章中特定的小节也会有类似的标注。仅对某个操作系统感兴趣的读者可以轻松选择阅读哪些章节。
如果你只重点关注*OS,可以跳过专门讲述macOS的章节(第1~3章、第6章和第9章),但绝对应该阅读其余的章节。关注macOS的读者应该阅读第一部分的所有内容,也许可以跳过特定于*OS的那些部分(当然,章名中也有标记)。虽然第二部分主要讲的是越狱,但我确实希望关注macOS的读者能稍微提起一点兴趣看一眼这部分,因为在越狱软件中利用的许多XNU漏洞也是macOS的常见代码。
第二部分的大部分内容涉及越狱,主要是由逆向工程驱动的。越狱软件(除了一些已经开源的老项目)仍然是闭源的,其中一些(特别是Pangu)甚至对代码做了混淆。这可能是为了劝阻他人窃取代码或将他们的产品作为武器,以及阻止苹果公司立即修复和更新系统。
对于越狱软件,我“专门”在配套网站上提供了逆向时所使用的确切版本的二进制文件,因此你可以按照示例进行操作——主要是使用jtool进行反编译和逆向。为了让你做起来更简单,我还提供了jtool的配套文件,所以如果你用-d进行反汇编,jtool会自动标注符号并插入注释。
不幸的是,对于动态分析(即使用调试器),你的选择可能会很有限,因为苹果公司对iOS的严格升级政策使其(在很大程度上)是不可逆向的。我自己不得不通过eBay才找到足够的“样本”设备(从iOS 6.0到iOS 9.x的不同版本),分别进行越狱和调试。不管怎样,如果你手头有指定iOS版本的越狱设备,而我在书中展示的特定二进制文件足够详细,且与你使用的越狱二进制文件足够相似(越狱软件的内部版本可能有细微差异),这样你就可以(仔细地)在设备上跟随书中的步骤进行操作。
注意事项:如果你想实时调试越狱二进制文件,记得提前设立断点,并记住有可能要重新启动越狱软件(特别是在苹果设备上的untether组件)。大多数越狱软件检测到该设备已经越狱,就不会重新越狱,但是如果你使用调试器更改越狱流程,则有可能再次启动越狱。
本书不可避免地引用了第1本和第2本中的内容。这不是说让你阅读前两本,而是一些主题,主要是dyld、XPC和iCloud(在第1本中讲述),以及内核原理、扩展、网络连接和引导(在第2本中讲述)涉及的内容太深了,无法在本卷中重新介绍一遍。第2本还讨论了应用程序防火墙,无疑这是一个以安全为中心的主题,但由于该主题与网络堆栈的关系太过错综复杂,难以在本卷中解释。
一些约定
? 书中的文件名是这样指定的:苹果公司极长的路径名称已被缩写,只要可以,我会将/System/Library/Frameworks缩写为/S/L/F,PrivateFrameworks缩写为PF,Caches缩写为C,等等。com.apple.通常被缩写为c.a。对于#include后尖括号中的内容,可以在相应的SDK目录中找到与之相关的文件。GUID(引用它并没有什么用,还占用大量空间)被缩写为几个字符,因此可以遵循GUID的唯一性。来自项目(通常是XNU)的文件通常在其上下文中提及,并以相对路径而不是绝对路径显示。
? comands(1)、systemCalls(2)或classes框架类都采用这种方式指定:括号中的数字代表使用macOS的man(1)时,描述它们的查询条目的类别(如果有的话)。
此外,本书中有很多图、代码清单和输出清单。图用来显示组件或消息流。代码清单通常是静态文件,而输出清单通常是一个命令序列,属于实验的一部分。我希望用输出清单来显示命令的流程和使用情况,所以输出清单中有完整的注释。例如:
# Comment, explaining what's being done
user@hostname (directory)$/# User input
Output...
Output.. # Annotation, explaining output
请注意,用户提示符(和终止符“$”或“#”)会告诉你该命令是否需要root权限。主机名告诉你尝试启动命令的设备。“Zephyr”是macOS 10.10,如果在它上面尝试过某个命令,则表示可以在任何macOS 10.10及更高版本的macOS上尝试该命令。“Simulacrum”是macOS 10.12(在虚拟机中),而其他所有的主机名都是各种苹果设备。在讲越狱的章节中,通过上下文可以知道该设备上运行的越狱软件所涉及的特定iOS版本。
对于苹果公司最喜欢的XML格式的属性列表,我选择使用自己的工具进行演示。我称之为“SimPLISTic”,它类似于macOS的plutil(1),可以处理所有格式(binary1、json和xml1,以及NSXPC中使用的无文档说明的bplist16),它也可以大大简化这些烦人的、麻烦的和占用空间的XML标签。和我的大部分工具一样,我已经将这个工具为*OS甚至Linux(有意不使用简单但不可移植的CF * API)开源,并使其可编译。希望读者(甚至是苹果公司)会发现它很有用。
最后,你应该知道,“*OS”是指iOS及其变体(即iOS、watchOS和tvOS),而不是macOS。当macOS还是“Mac OS X”时,一切简单明了,但是Craig Federighi毁了我这个不错的区分方式。面对是改为“^[^M].*OS”还是保持简单的抉择时,为了可读性我选择了后者。
请注意,我尽可能准确地记录(注:记录什么?最好加上几个字。每页的批注好像有限制,这里没法再批注了。我试了一下,下一页又可以了),但是对于快速变化的版本而言(尤其是iOS变体),这太难了。因此,具体案例,特别是逆向的案例,通常需要引用与其源头一模一样的iOS版本。即使如此,请记住,XPC接口、Mach消息、IOUserClient调用和其他的调用会经常更改,而不另行通知。
┃ 最后……
与《最强Android书:架构大剖析》一样,这本书完全是“我自己”出版的,也就是“独奏”。我又一次使用vim以及手工输入HTML5标签 ,这绝对是一项望不到头的工作,因为我不得不使用标签对代码示例进行注释和着色。幸运的是还可以使用jtool的--html选项,而且效果不错。尽管如此,原始的HTML文件只是稍微超过1 MB的ASCII文本,直到最后一个标签都是手工输入的。你正在阅读的实际上是由Safari的“打印”选项生成的PDF文件转换的A4开本页面,每一页的容量更大 。这次书中的插图是从Microsoft PowerPoint提取的纯嵌入式PNG格式截图,大部分借鉴了我为Technologeeks的macOS/iOS安全培训班制作的幻灯片。因为没有与出版商合作,所以本书没有索引——我只能做到这个程度了,抱歉!
我的插图技巧还不如4岁小孩,所以对于封面设计,我寻求了帮助,找的不是别人,正是Jon Hooper,Hexley(Darwin吉祥物)的创作者。Hooper不仅允许我使用他的毛茸茸的小恶魔 (它的三叉戟为封面增加了神韵),还同意为所有三卷图书提供封面!
特别感谢我亲爱的朋友Ronnie Federbush,在他的帮助下,“自我出版”的书诞生了,我打破了传统出版的枷锁。最初是《最强Android书:架构大剖析》,现在是这本书。一旦走上这条路,你就永远回不去了。我感谢Eddie Cornejo(和那本关于安卓的书一样),他发现了无数的输入错误,并提出了非常好的建议(我在本书的1.1版中采纳了这些建议)。1.1版中的拼写错误也是@Timacfr发现并报告的,在1.2版中它们已被修正。
虽然苹果公司从来没有感谢过我(并无视我的电子邮件,现在我对他们不抱希望了),但是我应该感谢Cupertino 的优秀的工程师们,实际上是他们编写的软件在进行大冒险,而我只是谦卑的抄写员。macOS和iOS真的是“世界上最先进的操作系统”,这种说法并不夸张。如果这些系统更加开放,那么其他人肯定会惊叹于这些贯穿于核心的创新!
再次感谢Amy!她容忍我日日夜夜粘在Mac电脑边、容忍我不停出差,很多日夜不在她身边。当我对日益增加的工作量感到沮丧时(写书通常都是这样子!),从未对我失去信心。她给予我无限的支持和理解(以及偶尔的刺激)来鞭策我前进。
与第1版一样,你可以在本书的配套网站上找到大量的资源、文章和工具。尽管它现在是一本“新书”,如果你想参与讨论和(或)询问我任何问题,仍然可以去NewOSXBook论坛。
我在Twitter上的账号为@Morpheus_____,尽管我并没有怎么使用Twitter交流,而是用它来发布我的工具或文章的更新。主要的更新通常由我公司的账号@Technologeeks转发。Mac OS X and iOS Internals是我们的“深入macOS/iOS逆向工程师”培训的基础,本书是我们最新的培训内容——*OS应用安全。你可以在Technologeeks的网站上找到完整的课程列表。我经常自己负责这门课,所以如果你喜欢本书,并想要相对有经验的人授课,请考虑注册一个公共课程,或者为你的公司申请一个私人课程。
好吧,我说的够多了。请开始阅读吧!
注册下载,等书到货👨🏿💻👨🏿💻👨🏿💻👨🏿💻