深入浅析 Sock Port 漏洞之 Mach OOL Message 泄露 Port Address
2024-01-09 12:21:59
在上一篇文章中,我们初步介绍了 UAF 原理,并提到了 iOS 10.0 - 12.2 的 Socket 代码中含有一个针对 in6p_outputopts 的 UAF Exploit,它是整个 Sock Port 漏洞的关键。从这篇文章开始,我们将逐行分析 Sock Port 漏洞的这个 UAF 漏洞。
首先,我们先来复习一下 UAF(Use-After-Free,释放后使用)漏洞。UAF 漏洞是指,当一块内存被释放后,又再次被程序访问或使用,从而导致程序出现不可预测的行为,甚至崩溃。在 iOS 中,Sock Port 漏洞正是利用了 in6p_outputopts 内存块的 UAF 漏洞来实现任意地址的读写。
Sock Port 漏洞的这个 UAF 漏洞是如何产生的呢?简单来说,就是由于 in6p_outputopts 内存块的释放时机不当造成的。在 Sock Port 漏洞中,in6p_outputopts 内存块是在函数 in6_pcbconnect() 中释放的。在函数 in6_pcbconnect() 中,当调用完函数 in6_pcbsel() 之后,in6p_outputopts 内存块就被释放了。但是,在函数 in6_pcbsel() 中,还存在对 in6p_outputopts 内存块的访问。这就导致了 in6p_outputopts 内存块被释放后,又被访问,从而产生了 UAF 漏洞。
Sock Port 漏洞的这个 UAF 漏洞是如何被利用的呢?简单来说,就是利用 UAF 漏洞来泄露 Port Address。在 Sock Port 漏洞中,攻击者首先会利用 UAF 漏洞来控制 in6p_outputopts 内存块。然后,攻击者会将 in6p_outputopts 内存块中的某些字段修改为指向攻击者控制的内存区域。最后,攻击者就可以通过访问 in6p_outputopts 内存块来访问攻击者控制的内存区域,从而泄露 Port Address。
Sock Port 漏洞的这个 UAF 漏洞是如何被修复的呢?苹果公司在 iOS 12.3 中修复了这个 UAF 漏洞。苹果公司在 iOS 12.3 中修改了函数 in6_pcbconnect() 的代码,将 in6p_outputopts 内存块的释放时机改到了函数 in6_pcbsel() 返回之后。这样,就避免了 in6p_outputopts 内存块被释放后又被访问,从而修复了这个 UAF 漏洞。
Sock Port 漏洞的这个 UAF 漏洞是一个非常严重的漏洞。这个漏洞允许攻击者在 iOS 10.0 - 12.2 的设备上实现任意地址的读写。攻击者可以利用这个漏洞来窃取用户数据、安装恶意软件、甚至控制整个设备。苹果公司已经修复了这个漏洞,因此用户应该及时更新自己的 iOS 设备到 iOS 12.3 或更高版本。