CVE-2022-32832 是 AppleAPFSUserClient::methodDeltaCreateFinalize 外部方法(选择器 49)中的一个漏洞。以下是补丁前的反编译代码:
__int64 __cdecl AppleAPFSUserClient::methodDeltaCreateFinalize(AppleAPFSUserClient *this, void *a2, IOExternalMethodArguments *args)
{
void *ctx;
__int64 result;
ctx = this->deltaCreateCtx;
if ( !ctx )
return 0xE00002D8LL;
AppleAPFSContainer::deltaCreateTeardown(ctx);
result = 0LL;
this->deltaCreateCtx = 0LL;
return result;
}
AppleAPFSUserClient::externalMethod 未使用任何同步机制来序列化外部方法调用。这意味着攻击者可能通过在同一 userclient 上竞态调用两次 AppleAPFSUserClient::methodDeltaCreateFinalize,从而实现 delta_create_ctx_t 及相关属性的双重释放,因为两个调用都可能在 this->deltaCreateCtx 设置为 NULL 之前调用到 AppleAPFSContainer::deltaCreateTeardown(负责释放 delta_create_ctx_t 的方法)。
为了触发此漏洞,攻击者首先需要利用外部方法 AppleAPFSUserClient::methodDeltaCreatePrepare(选择器 36)在 userclient 上创建一个“delta create context”。此操作需要一个已卸载的卷才能正常运行,因此正常的利用流程要求攻击者还使用外部方法 AppleAPFSUserClient::methodVolumeCreate 创建一个目标卷,而该方法需要超级用户权限。正因如此,苹果将该漏洞的影响描述为:
具有 root 权限的应用可能能够以内核权限执行任意代码
本仓库包含一个针对该问题的概念验证利用,该利用通过下溢内核对象的引用计数来在受影响的 macOS 版本上导致内核恐慌。由于上述原因,该利用必须以 root 权限执行。
CVE-2022-32832 已通过在 AppleAPFSUserClient::methodDeltaCreateFinalize 中添加 IOLockLock 和 IOLockUnlock 调用来修复,从而保护了易受攻击的代码。