导语:近期,我们的第三方合作伙伴Syndis发现我们在Dropbox使用的Apple软件中存在漏洞,该漏洞不仅影响macOS,还影响当时最新版本的Safari,因此这些漏洞属于0 Day漏洞。
一、概述
近期,我们的第三方合作伙伴Syndis发现我们在Dropbox使用的Apple软件中存在漏洞,该漏洞不仅影响macOS,还影响当时最新版本的Safari,因此这些漏洞属于0 Day漏洞。当这些漏洞被组合利用时,攻击者可以通过诱导受害者访问特制的网页,实现在受害者的计算机上运行任意代码。
我们向Apple通报了这些漏洞,很快就得到了他们的确认。Apple在大约一个月内发布了针对这些漏洞的修复程序,这比“90天内修复”的行业标准要好很多。这些漏洞被指定了CVE编号,并且我们与Syndis共同验证了漏洞已经成功修复。本文将主要讲解这些漏洞的详细信息,及修复补丁的验证过程。
二、Safari自动下载和安装磁盘映像漏洞(CVE-2017-13890)
在CoreTypes中,定义了一个安全的统一类型标识符(UTI)列表,该列表将由Safari自动打开。上述内容可以在LSRiskCategorySafe中找到。我们特别感兴趣的是其中的com.real.smil。
如果我们使用Isregister检查Launch Services数据库,我们将会看到它在CoreTypes中定义,其描述为“同步多媒体集成语言”,并且似乎与Real Player媒体应用程序相关联。有许多文件扩展名都与这个UTI相关联,其中包括“.smi”。
$ touch a.smi $ mdls a.smi | grep -e "kMDItemContentType\s\|kMDItemKind" kMDItemContentType = "com.real.smil" kMDItemKind = "Self Mounting Image"
我们可以看到,“.smi”文件具有com.real.smil内容类型,但它被描述为“自挂载映像”(Self Mounting Image)。这是因为在macOS 10.12.6上,Disk Image Mounter应用程序也将自身与这一扩展名关联,并将自身列为该扩展名文件的默认处理程序。Disk Image Mounter应用程序为“.smi”扩展名指定了com.apple.disk-image-smi这一UTI,但CoreTypes中定义的com.real.smil具有优先权限。
该漏洞已被分配CVE-2017-13890,Apple官方通告参见:https://support.apple.com/en-us/HT208692
CoreTypes
适用于:OS X El Capitan 10.11.6、macOS Sierra 10.12.6
影响:在对一个恶意制作的网页进行处理的过程中,可能会导致安装磁盘映像。
修复方法:通过增加限制条件,修复了逻辑问题。
CVE-2017-13890:Apple、Syndis的Theodor Ragnar Gislason
三、挂载磁盘映像导致应用程序启动漏洞(CVE-2018-4176)
Bless实用程序用于设置卷的可启动性以及启动磁盘选项。其中,一个有趣的选项是–openfolder,可用于指定在系统安装卷时在Finder中打开的文件夹。尽管描述是这样说的,但如果–openfolder的参数指向了一个可加载的包,并且这些包时经过打包且文件名以“.bundle”结尾的应用程序,那么实际上将会启动指定的应用程序,而没有执行打开Finder的操作。这就意味着,用户可以通过访问Safari中的网页来自动启动应用程序。然而,这一漏洞对攻击者来说,其可用性仍然有限,因为攻击者无法借助这一漏洞运行任意代码。Gatekeeper仅允许运行从应用商店下载的应用程序,以及由已知开发者签名的应用程序,从而防范此类共计。Launch Services在启动应用程序时将会进行检查,并产生如下错误提示:
为了使这条漏洞利用链有效,我们需要绕过Gatekeeper,以避开这种检查。
该漏洞已被分配CVE-2018-4176,Apple官方通告参见:https://support.apple.com/en-us/HT208692
磁盘映像
适用于:OS X El Capitan 10.11.6、macOS Sierra 10.12.6、macOS High Sierra 10.13.3
影响:挂载恶意磁盘映像可能会导致启动应用程序。
修复方法:通过增加限制条件,修复了逻辑问题。
CVE-2018-4176:Syndis的Theodor Ragnar Gislason
四、Gatekeeper绕过漏洞(CVE-2018-4175)
我们需要注意上面的错误提示:“evil无法打开,因为它来自一个身份不明的开发人员”,与此同时,我们还注意到Safari下载的磁盘映像中有evil。Syndis随后注意到了几件事:
1、他们可以启动经过签名的应用程序包的副本,例如我们磁盘映像中的Terminal.app。
2、如果修改Bundle的Info.plist,并不会使签名无效。
借助Info.plist,可以指定使用应用程序打开哪些扩展名的文件,也可以注册新的文件扩展名,这样一来就能够确保该应用程序作为默认的处理程序。在启动应用程序后,Launch Services会在数据库中注册应用程序和这些文件扩展名。我们可以使用Isregister命令查看:
... -------------------------------------------------------------------------------- Container mount state: mounted bundle id: 2740 Mach-O UUIDs: 67FFA762-AB52-31F0-AC80-E72008760B13 sequenceNum: 2740 FamilyID: 0 PurchaserID: 0 DownloaderID: 0 installType: 0 appContainer: # dataContainer: # path: /Volumes/bundle/Terminal.app name: Terminal displayName: Terminal ... bundle flags: apple-internal has-display-name launch-disabled (0000000000000103) ... { CFBundleTypeExtensions = ( workingpoc ); CFBundleTypeRole = invalid; LSIsAppleDefaultForType = 1; }, ... } library: (null) schemesList: ssh, telnet, x-man-page ... -------------------------------------------------------- claim id: 15108 name: (null) rank: Default roles: Viewer flags: apple-default apple-internal doc-type icon: bindings: .workingpoc ...
这样一来,就提供了一种注册新文件扩展名并启动已经签名的应用程序的方法。但是,我们还没有办法启动自己的应用程序或运行自定义命令。考虑到我们的目标是运行任意命令,那么利用Terminal(终端)APP应该是一个合理的思路。但是,如果我们尝试使用上述技术启动Shell脚本,Gatekeeper会因为要对Safari下载的文件进行隔离而阻止其执行。
在这里,就用到了真正的技巧。如果我们能够使用与Terminal副本相关联的新扩展名打开文件,那么就不会检查标志中的隔离位(Quarantine Bit),并且我们的代码将在系统版本的Terminal中运行,不会出现任何提示。
该漏洞已被分配CVE-2018-4175,Apple官方通告参见:https://support.apple.com/en-us/HT208692
LaunchServices
适用于:OS X El Capitan 10.11.6、macOS Sierra 10.12.6、macOS High Sierra 10.13.3
影响:恶意制作的应用程序可能会绕过代码签名检查策略。
修复方法:通过加强验证,修复了逻辑问题。
CVE-2018-4175:Syndis的Theodor Ragnar Gislason
五、漏洞链利用
现在,我们就能够将这三个漏洞链接在一起,从而实现使用Safari访问特制网页即可导致任意代码执行。第一阶段中,包含终端应用程序的修改版本,该应用程序被注册为新文件扩展名(.workingpoc)的处理程序。此外,它将包含一个名为“test.bundle”的空白文件夹,该文件夹将被设置为默认的“openfolder”,将会自动打开/Applications/Terminal.app,并且不产生任何提示。第二阶段中,包含一个带有扩展名“.workingpoc”的未经签名的ShellScript,随后在没有提示的情况下,从正在运行的Terminal应用程序中执行。
演示视频:https://videos.files.wordpress.com/MdOSNvhK/poc_dvd.mp4
六、漏洞修复方式
Apple在2018年3月29日发布的更新中,为上述漏洞提供了修复程序。
6.1 CVE-2017-13890
我们看到,com.real.smil UTI似乎已经从CoreTypes中删除。我们对“.smi”文件进行了检查,发现其目前具有适当的内容类型:
$ mdls a.smi | grep -e "kMDItemContentType\s\|kMDItemKind" kMDItemContentType = "com.apple.disk-image-smi" kMDItemKind = "Self Mounting Image"
并且,通过比较10.12.6和10.13.4版本的Launch Services数据库,可以进一步验证这一点:
10.12.6
claim id: 3804 name: Self Mounting Image rank: Default roles: Viewer flags: apple-default apple-internal relative-icon-path doc-type icon: Contents/Resources/diskcopy-doc.icns bindings: com.real.smil, .smi
10.13.4
claim id: 22824 name: Self Mounting Image rank: Default roles: Viewer flags: apple-default apple-internal relative-icon-path doc-type icon: Contents/Resources/diskcopy-doc.icns bindings: com.apple.disk-image-smi, .smi
因此,Safari将不再使用Disk Image Mounter应用程序自动打开“.smi”文件。
6.2 CVE-2018-4176
在修复后,使用bless命令打开可加载的Bundle将不会再导致Bundle启动。相反,该目录是使用Finder应用程序打开的,正如命令描述中所说的那样。
6.3 CVE-2018-4175
在10.12.6中,我们的脚本在漏洞利用的第二阶段并没有及时启动。在10.13.4中,我们看到了一条警告,提示此前从未启动过这个应用程序:
即使前两个漏洞没有被修复,通过这一改进,通过Safari访问恶意网页的用户也会得到充分的警告,并被明确告知继续执行该操作可能存在安全风险。
如果我们点击“Open”,会注意到,我们修改后的Terminal的Bundle标志,已经不再包含Launch Services数据库中的launch-disabled。
... -------------------------------------------------------------------------------- Container mount state: mounted bundle id: 2740 Mach-O UUIDs: 67FFA762-AB52-31F0-AC80-E72008760B13 ... path: /Volumes/bundle/Terminal.app ... bundle flags: apple-internal has-display-name (0000000000000003) ...
七、时间节点
2018年2月19日 将漏洞详情报告给Apple
2018年2月19日 Apple确认报告
2018年2月21日 向Apple提供PoC
2018年2月21日 Apple感谢我们提供更多详情,并表示他们正在分析中
2018年3月29日 Apple发布安全更新( https://support.apple.com/en-us/HT208692