苹果补丁历史

图片


今年a1exdandy在VolgaCTF和KazHackStan会议上发表讲话,谈到了用Objective-C编写的补丁区分程序,以及如何使用它来搜索和查找Apple产品中的0天和1天漏洞。 您可以在此处观看演示文稿的视频,并阅读该文章,欢迎来到cat。


二进制区分是比较两个可执行文件以便发现它们之间的异同的过程。 当将具有漏洞的文件与固定文件(带补丁的文件)进行比较时,补丁差异是二进制差异的一种特殊情况。 因此,您可以找出开发人员进行了哪些更正并了解漏洞是什么。


几年前(即在2013年), 发表了一篇有关Windows程序的Patch Diffing 的文章 ,我们也对此有所帮助。 如果您对与Windows操作系统有关的本主题感兴趣,我们建议您熟悉它。 在同一篇文章中,我们将讨论Apple OS程序的分析。


二进制差异和补丁差异如何有用?


Binary Diffing的主要任务是跟踪对应用程序进行了哪些更改。 为此,您需要使用旧版本并将其与新版本进行比较,以查看开发人员添加了哪些更改以及如何实现它们。


让我们看一下可能有用的情况:


  • 程序开发分析 :比较新旧版本,您可以了解应用程序的开发方式,添加了哪些新功能,删除了哪些功能以及现有代码进行了哪些更改。
  • 导入现有知识 :在不使用符号信息的程序中,逆向工程师必须花更多的时间来研究逻辑和搜索漏洞。 但是碰巧,在某些版本的软件中,开发人员意外或故意留下了符号信息。 这些信息可以从那里移植到所需的软件版本。 例如 ,使用Binary Diffing的Google Project Zero的员工能够从其他操作系统的旧版本中获得Adobe Reader的Windows新版本的字符,这有助于他们发现漏洞。
  • 实际软件方面的培训 :我们认为,Patch Diffing是一种很好的方法,可以从研究小型CTF问题顺利过渡到研究实际软件。 浏览该补丁程序,您可以查看具有其所有功能的大型软件产品中的实际漏洞(同时确保知道该漏洞已存在于代码中)。 通过探索产品中的错误,您可以逐步找到相同的漏洞。 另外,您可以尝试为他们编写漏洞利用程序;
  • 创建1天漏洞利用程序 :开发人员已发布补丁程序后,您可以对其进行快速分析,编写此漏洞的漏洞利用程序并获得1天漏洞利用程序。 同时,存在所谓的补丁程序间隔-补丁程序发布到客户端直接安装之间的时间。 在这段时间内,为期1天的漏洞利用可以成功进行并使其作者受益(及时安装更新!),直到每个人都安装了开发人员发布的补丁为止。 在某些情况下,库中已修复漏洞,但程序仍使用库的过时版本。 以下是一些有趣的ChromeWebKit修补程序差距示例;
  • 搜索0天漏洞 :不管听起来多么奇怪,分析补丁,您还可以找到以前未知的漏洞(0天漏洞)。 开发人员也会犯错,因此,在创建补丁的过程中,该漏洞可能无法正确关闭。 因此,通过分析补丁,您可以找到解决方法。 例如,Apache Struts开发人员修复了五次漏洞,但该补丁仅在其第六版中有效! 另外,通常,开发人员明确地完成了为他解决特定漏洞的任务后,可能不会注意到代码相邻部分中正在发生的事情。 附近可能存在完全相同的漏洞,一旦检测到,它将是0天。 研究检测到的开发人员错误的模式并尝试在同一程序中找到相似的内容非常重要。 如果开发人员在某个地方犯了一个错误,那么在其他地方重复同一错误的可能性就很高。

有一个神话,隐藏漏洞补丁程序信息可以提高安全性。 但是,通常,攻击者已经开发了用于分析补丁的基础结构,因此他们可以快速找到他们感兴趣的数据。 隐藏漏洞会使负责保护系统的人员的工作复杂化,因为如果无法完全访问信息,就无法了解此补丁对公司的重要性。 在此问题上,我们强烈建议您阅读研究员Halvar Flake撰写的“披露的罗生门”文章,从不同的角度审视这种情况。


并非总是发现漏洞是有意隐藏的。 开发人员可能不会特别重视其产品的某些缺陷,并在未公开的情况下修复它们,例如常规的错误。


我们确信并非在所有情况下都可以使用Binary Diffing和Patch Diffing,并且在注释中可以编写自己的脚本。


工具包


从理论上我们逐步走向实践。 自然地,手动执行Binary Diffing是一项疯狂的工作。 长期以来,已经开发出了一个广泛的工具包,包括用于流行的二进制分析器的独立程序和插件:Diaphora,BinDiff,DarunGrim,YaDiff,rizzo,Realyze,Turbodiff,patchdiff2,rematch等。


图片
BinDiff接口。


图片
贴膜接口


实际上,我们主要只使用前两个(它们在上面的屏幕快照中显示)。 不幸的是,当前大多数工具要么对工作质量没有鼓励作用,要么被完全抛弃。 现在有使用ML的新工具,但是它们的质量还有很多不足,尽管它们对于比较不同体系结构的二进制文件有一些有趣的想法。


我还要特别注意一下最近出现的用于比较二进制文件中的开源代码的工具:Pigaios和Karta。 这是一个非常有趣和有用的方向。 他们从源代码中收集指标,然后使用它们比较二进制文件中的函数。 在没有字符和静态链接的情况下,这非常有用。 这些工具的任务是将一个文件中的功能映射到另一个文件中的功能。


Apple操作系统补丁的比较


通常,Apple OS的应用程序在Objective-C上编写。 这是C的面向对象扩展,基于Smalltalk语言范例及其自己的运行时。


如果我们在某个二进制分析器中在Objective-C上打开程序(在我们的例子中,这是一个IDA),我们将看到类似的东西:C / C ++中的函数将具有抽象名称,而Objective-C中的函数将被非常漂亮地调用。 (我们马上要说的是,我们不会考虑代码混淆的情况-这是一个独立的故事。)这使逆向工程师更加容易:很容易看到调用了哪个对象,使用了哪种方法以及它具有哪些参数。 同样,此符号信息极大地简化了比较二进制文件的工具的工作。 它使您能够快速且以最少数量的错误映射功能。


图片


当没有符号时,工具必须使用内部算法进行分析,启发式等。 自然,它们并不总是能正常工作。


补丁差异非常有用的用例


如果最近,Apple几次都没有让世界研究界感到惊讶,那么这个演示文稿(以45分钟的格式)和这篇文章可能就不会诞生。 让我们看看这些情况。


案例1:CVE-2019-8606


2019年5月,发布了适用于iPhone的iOS 12.3,该漏洞修复了可以安装越狱的漏洞。 同年7月,苹果发布了12.4版,越狱后又开始工作:员工不小心删除了保护性补丁。 经过更正的版本仅在一个月后发布:一直以来,最新版本的任何设备都可以轻松进行越狱操作。 这一切都得益于补丁差异。


图片


情况2:CVE-2019-7278和CVE-2019-7286


安全研究员Stefan Esser描述了在Box in the Hack in the Box大会上Patch的个人经验,他从Apple的安全补丁中重新创建iOS 0天越狱 。 他谈到了CVE-2019-7278和CVE-2019-7286-由于Google威胁分析小组在攻击者的实际使用中(ITW,在野外)而发现了它们,因此它们是著名的。 苹果收到了有关它们的信息,但是他们和谷歌的家伙都没有透露技术细节。 然后,斯特凡想知道攻击者在使用什么。 我们强烈建议您阅读他的报告,因为它还谈到了比较内核和用户空间组件的过程。
有趣的事实:在Stefan演讲前一两天,“零号伊恩·比尔计划”发表了一系列文章“深入研究在野外发现的iOS漏洞利用链” ,这使研究人员的地图有些困惑;)


情况3:checkm8


苹果设备使用两个引导程序:Bootrom和Iboot。 设备打开后,第一个设备便开始工作。 它位于只读存储器中,无法更新。 Iboot是二级引导加载程序,可改进在引导链中运行的身份验证。
加载程序的独特之处在于它们共享代码。 去年年初,专家比较了Iboot的更新,发现Apple修复了USB堆栈中的漏洞。 他们知道在Bootrom的未更新部分中使用了相同的代码,因此他们意识到该漏洞也存在于此。 然后,开始开发checkm8漏洞利用程序。 现在,所有基于A5到A11芯片(从iPhone 4s到iPhone X)的设备都完全脆弱,可以在它们上运行您自己的代码。 同时,在版本XR和11的设备上,此漏洞已经关闭,并且没有来自Apple的报告。
因此,了解修补程序的位置以及代码的拆分方式后,您会发现一些非常酷的东西!


我们的故事:CVE-2019-8574


图片
苹果在5月发布了针对其设备的新更新。 我们查看了已修复漏洞的列表,并找到了sysdiagnose实用程序。 该程序从各种来源收集诊断信息,并将其以存档的形式传输给用户,以进行进一步的分析,支持或服务中心。 似乎不可能影响她收集信息的方式。 补丁说明指出,该漏洞可用于提升特权,并且是内存损坏错误,这更引起了我们的兴趣。 该发现的作者本人并没有发表自己的任何描述...


图片


您可以通过按Ctrl + Option + Shift +。或使用sudo sysdiagnose命令在macOS上调用sysdiagnose。 在iOS设备上,您需要上下按住电源键和音量键。


在实践中打补丁苹果


如果要打补丁差分Apple设备,则需要获取两个版本的更新(旧的和新的)。 在macOS上,您可以分析“软件更新目录”中的文件。 由于Apple删除了一些更新,因此此方法并不总是有用。 也可以在/ Library / Updates目录中找到更新。 您可以在ipsw.me网站上找到适用于iOS设备的固件。
对于macOS,您需要使用Suspicious Package实用程序提取可执行文件,库文件,框架和内核。
对于iOS设备,情况要复杂一些。 更新本身是一个ZIP存档。 在此存档中,您需要找到kernelcache文件:内部是内核及其扩展名。 但是,在分析之前,您需要将文件转换为Mach-O格式。 可以使用img4tool,joker,jtool2等实用程序来完成。
用户区域组件固件可以在最大的DMG映像中找到:它包含根系统和可执行文件。 但是,如果您查看共享库和框架,它们将不存在。 事实是为了优化它们放置在dyld_shared_cache中的空间。 该文件包含iPhone上的所有库,占用的内存超过1 GB,这使分析变得复杂。 如果需要下载ipsw文件的单独部分,请使用ipsw实用程序( https://github.com/blacktop/ipsw )。


补丁转移CVE-2019-8574


为了研究补丁CVE-2019-8574,我们从库/更新中获取了一个文件,并使用可疑软件包提取了两个sysdiagnose可执行文件(旧的和新的),然后通过实用程序检查更新以比较二进制代码,例如Diaphora或BinDiff(它们很多比十六进制编辑器更好)。


补丁如何工作


对于x86_64架构,我们发现只有一个更改的功能。 ARM中有更多更改,但这些更改微不足道。


图片


问题出在[SDTask start]方法上:它添加了新的检查。 在该图中,您可以看到如何调用某个isAppleInternal函数,并检查了某个路径中子字符串/ usr / local的存在。


图片


如前所述,sysdiagnose从各种来源收集信息。 源可以是文件(例如,事件日志),也可以是某些信息命令的输出(例如,使用ps列出进程或线程)-这些任务作为SDTask对象存储在sysdiagnose中。 [SDTask start]方法开始执行任务。 在下图中,您可以看到组成所有任务的代码。 可执行文件的所有路径及其参数都直接写在程序中,并且有来自各个目录的任务,包括/ usr / local。


图片![](./ asset / 8.png)


因此,在安装补丁之前,无论可执行文件位于何处,都可以执行任何任务。 安装补丁后,将调用isAppleInternal函数,该函数检查设备是否为Apple的内部测试设备。 如果这是内部设备,则以标准方式执行任务,如果是客户端,则检查任务可执行文件路径中子字符串/ usr / local /的存在。 如果找到子字符串,则该任务将无法完成。


回想一下,在漏洞描述中曾说这是内存损坏错误,但在补丁程序中我们没有注意到类似的错误……在我们看来,这是一个被良好且稳定利用的逻辑漏洞。


如何利用它


要利用此漏洞,您必须执行以下步骤:
创建sysdiagnose从/ usr / local / bin启动的任何可执行文件(二进制或Shell脚本),并将有效负载放在此处。 有效文件列表如下。 将brew软件包管理器安装在系统上很重要:它允许用户在/ usr / local /中创建文件而无需提升特权。


有必要调用sysdiagnose。 同时,我们的有效负载将以root用户权限执行,其输出将放置在sysdiagnose形成的归档文件中。 因此,我们得到了特权升级。 但是,运行sysdiagnose本身需要提升的特权。 但是,如上所述,也可以使用键盘快捷键启动sysdiagnose,即使在macOS锁定屏幕上也可以使用。
此漏洞可用于创建各种恶意程序。


/usr/local/bin/airplayutil /usr/local/bin/amstool /usr/local/bin/apsclient /usr/local/bin/audioDeviceDump /usr/local/bin/cdcontexttool /usr/local/bin/cddebug /usr/local/bin/cdknowledgetool /usr/local/bin/dastool /usr/local/bin/idstool /usr/local/bin/imtool /usr/local/bin/keystorectl /usr/local/bin/pmtool /usr/local/bin/xcpm /usr/local/efi/bin/efi-perf 

有趣的是,其他漏洞可能与brew软件包管理器有关,或者与没有权限写入/ usr / local /的能力有关。


结论


通过这项研究,我们希望展示补丁扩散的重要性和重要性,不仅对于攻击者而言,而且对于提高软件产品的安全性也是如此。 不幸的是,该修补程序不仅可以关闭漏洞,而且还可以发挥攻击者的作用。


但是,这种方法不仅可以研究已知的漏洞,还可以搜索新的漏洞。 因此,我们认为斑驳扩散是每个研究人员都必须具备的。

Source: https://habr.com/ru/post/zh-CN479972/


All Articles