原文地址
https://www.zerodayinitiative.com/blog/2018/10/24/cve-2018-4338-triggering-an-information-disclosure-on-macos-through-a-broadcom-airport-kext
在用户状态下执行提升权限的代码是利用漏洞的一个关键,这个原则也同样适用于Pwn2Own入门、提交TIP或者应对一些实时的恶意软件。为了逃逸最新的沙盒,攻击者和研究人员需要了解内存的布局,否则为了找到正确的内存地址,就会随机喷堆。这是披露信息漏洞在过去几年中引起如此多关注的一个原因。虽然这个名称可能会让一些人觉得个人信息正在被泄露,但这些信息通常都是这些漏洞所针对的、关于内存布局的详细信息。
最近,向ZDI程序提交的一项报告显示了macOS如何做到只有这种类型的信息泄露漏洞。延世大学的Lee @ SECLAB
报道称,该漏洞存在于处理Broadcom AirPort kext
的过程中,如果您不熟悉它们,那么可以这么说,kext文件(内核扩展的简称)就是macOS的驱动程序,它就类似于Windows中的DLL。既然有了补丁,Lee的写作和分析值得仔细研究。
这个特定漏洞仅适用于开启了Wi-Fi状态的系统,虽然这种状态在通常情况下是无处不在的,但有时它也可能会被禁用。为了解决这个问题,可以使用脚本打开Wi-Fi。攻击者可以使用dlsym功能/System/Library/PrivateFrameworks/Apple80211.framework/Apple80211
,这将产生Apple80211Open
,Apple80211BindToInterface
和Apple80211Close
功能。您可以使用以下流程触发核心功能:
简而言之,此漏洞使得攻击者可以获取Apple OS X
局部环境中的提升权限的内核地址,它的根本原因在于AirPort.BrcmNIC.kext
,它不会检查输入值,并且它会导致Out Of Bounds(OOB)
。
发生这个错误是因为setOFFLOAD_NDP
函数不检查输入值,这意味着OOB Read
的堆栈值存储在ol_nd_hostip
变量中,攻击者可以使用getOFFLOAD_NDP
函数读取ol_nd_hostip
变量。
既然我们知道AirPort_BrcmNIC::setOFFLOAD_NDP
函数中发生了错误,我们只需要获取存储在ol_nd_hostip
变量中的值。再看一下需要删除的函数:
从setOffloadNdp
函数中可以看出,inp是该函数的局部变量。所述old_nd_hostip
变量存储了数值高达0x40
的字节,并且如果该值是0,它就可以被矫正。因此,由于返回地址是inp + 0x68
,因此它可以通过运行循环七次被保存,然后,您就可以使用该getOffloadNdp
函数泄漏堆栈值。
执行时,概念证明(PoC)代码应产生以下输出:
如果您希望自己测试一下,PoC应该适用于macOS 10.13及之前的版本。虽然这不能用于自动执行代码,但攻击者可以利用它与其他漏洞一起在内核的中执行代码。此外,它还表明找到正确的内存位置是漏洞链的重要组成部分。