导语:近期,我们的第三方合作伙伴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在启动应用程序时将会进行检查,并产生如下错误提示:

1.png

为了使这条漏洞利用链有效,我们需要绕过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中,我们看到了一条警告,提示此前从未启动过这个应用程序:

2.png

即使前两个漏洞没有被修复,通过这一改进,通过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

源链接

Hacking more

...