曲速未来 披露:由macOS NFS客户端中的缓冲区溢出引起的内核RCE

区块链安全咨询公司 曲速未来 消息:有安全人员在Apple的macOS操作系统内核中发现的几个堆栈和堆缓冲区溢出。Apple将这些漏洞归类为内核中的远程代码执行漏洞,因此它们非常严重。攻击者可能会利用它们远程入侵Mac。或者,通过物理访问计算机,攻击者可以作为访客用户登录(无需密码),然后使用这些漏洞提升其权限并控制计算机。

这些漏洞存在于客户端NFS实现中,用于将网络驱动器(如NAS)安装到Mac的文件系统中。

严重程度和缓解

这些漏洞已在Android版本10.13.6中得到修复,Apple于2018年7月9日发布了该版本。Apple要求安全人员不要透露漏洞,直到另行通知为止。这就是他们所说的:

NFS被广泛使用,特别是在大型企业中,它用于共享驱动器和联网的主目录。但它也用于家庭NAS设备,通常用作媒体服务器。在macOS中,安装NFS共享不需要特殊权限,因此任何用户都可以触发漏洞,甚至是访客帐户(不需要密码)。此外,许多计算机(尤其是企业环境中的计算机)配置为在启动时自动挂载NFS共享。这意味着这些漏洞至少有两个攻击媒介:

  1. 这些漏洞可能被用于在使用NFS文件管理器的公司中快速传播病毒。要做到这一点,攻击者需要在文件管理器上安装恶意版本的NFS服务器软件,或者找到一种方法将恶意文件管理器放在网络上并开始拦截某些NFS流量。
  2. 这些漏洞可用于获取升级的权限。例如,有人可能以guest用户身份登录,然后发出单行命令连接到恶意NFS服务器(可能是Internet上的任何位置),并在计算机上获得内核级访问权限。

Apple分配了五个CVE,因为代码包含多个类似的错误:CVE-2018-4259,CVE-2018-4286,CVE-2018-4287,CVE-2018-4288和CVE-2018-4291。为避免意外泄露任何可能未修复的错误,所以只写关于Apple工作概念验证漏洞的两个漏洞。

概念验证漏洞利用

安全人员编写了一个概念验证漏洞,它用0覆盖4096字节的堆内存并导致内核崩溃。还可以改变利用率来发送尽可能多的数据。任何大于128字节的数字都会触发堆缓冲区溢出。也完全控制了写入的字节值。因此,尽管PoC只破坏了内核,但可以合理地假设可以使用这些缓冲区溢出来实现远程代码执行和本地权限提升。

漏洞

安全人员编写PoC的两个漏洞是在这个看似无害的代码行中(nfs_vfsops.c:4151):

这行代码的目的是fh从nmrepNFS服务器发送回Mac的回复消息()中读取文件句柄()。文件句柄是NFS共享上的文件或目录的不透明标识符。NFSv3中的文件句柄最多为64个字节,NFSv4中的文件句柄最多为128个字节(搜索FHSIZE)。fhandle_tXNU中的类型有足够的空间容纳128字节的文件句柄,但是他们忘记检查nfsm_chain_get_fh宏中的缓冲区溢出:

由于宏的大量使用,这段代码很难遵循,但它的作用实际上非常简单:它从消息中读取一个32位无符号整数(FHP)->fh_len,然后直接从消息中读取该字节数(FHP)->fh_data。没有边界检查,因此攻击者可以使用他们选择的任何字节序列覆盖任意数量的内核堆。被覆盖的文件句柄的内存在nfs_socket.c:1401中分配。

安全人员写的PoC for的第二个错误是nfsm_chain_get_opaque宏中的整数溢出:

此代码使用nfsm_rndup宏圆LEN高达4的倍数,但它使用的原始值LEN的调用bcopy。如果值LEN是0xFFFFFFFF然后加入在nfsm_rndup将溢出和的值rndlen将是0。这意味着与比较(NMC)->nmc_left会成功,bcopy将与被调用0xFFFFFFFF作为大小参数。这当然会导致内核崩溃,因此它只能用作拒绝服务攻击。

使用QL查找错误

QL的一大优势是能够找到已知错误的变种。今年早些时候,就有安全人员在Apple的NFS无盘启动实现中发现了两个漏洞,CVE-2018-4136和CVE-2018-4160。该查询旨在查找bcopy可能具有用户控制的大小参数的调用,该参数可能为负。一个简单的变化是查找bcopy用户控制源缓冲区的调用。这样的调用可能很有趣,因为它们将用户控制的数据复制到内核空间中。

上面的查询相当简单,因为它查找对bcopy从mbuf内核空间复制数据的任何调用。只要正确检查size参数的边界,这样的调用就没有错。然而事实证明,很大一部分结果是nfsm_chain_get_fh宏的使用,它不进行任何边界检查。因此,尽管此查询很简单,但它发现了许多重要的安全漏洞。在其当前形式中,即使修复了错误,查询仍将继续报告相同的结果。最好改进查询,以便在有适当的边界检查时不会报告结果。

实现边界检查的常用方法是这样的:

还写了这个谓词来检测上面的模式:

它使用Guards库来查找在受控制的控制流位置中使用的大小表达式guard。然后它使用globalValueNumber库来检查条件本身是否出现相同大小的表达式。该GlobalValueNumbering库使谓词能够检测非平凡大小表达式的相等性,如下所示:

最后,它使用一个名为的实用程序relOpWithSwapAndNegate来检查size表达式是否小于限制。它使谓词也能处理这样的场景:

有时实现边界检查的另一种方式是通过调用min,如此谓词所检测到的:

然后将这两个谓词组合如下:

请注意,习惯lowerBound确保不存在负整数溢出的可能性。唯一剩下要做的就是checkedSize在isSink方法中使用,以减少误报的数量。这是完成的查询:

总结

 

区块链安全咨询公司 曲速未来 表示:与大多数其他开源项目不同,XNU无法在LGTM上查询。这是因为LGTM使用Linux工作程序来构建项目,但XNU只能在Mac上构建。即使在Mac上,XNU也非常容易构建。

本文内容由 曲速未来 (WarpFuture.com) 安全咨询公司整理编译,转载请注明。 曲速未来提供包括主链安全、交易所安全、交易所钱包安全、DAPP开发安全、智能合约开发安全等相关区块链安全咨询服务。

猜你喜欢

转载自blog.csdn.net/WarpFuture/article/details/83589262