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 及相关属性进行双重释放(double-free),因为两者都能够在 this->deltaCreateCtx 被设置为 NULL 之前调用 AppleAPFSContainer::deltaCreateTeardown(负责释放 delta_create_ctx_t 的方法)。
为了触发该漏洞,攻击者首先需要使用外部方法 AppleAPFSUserClient::methodDeltaCreatePrepare(选择器 36)在 userclient 上创建一个“delta create context”(增量创建上下文)。该方法需要一个未挂载的卷才能正常工作,因此常规的利用流程要求攻击者还使用外部方法 AppleAPFSUserClient::methodVolumeCreate 创建一个目标卷,这需要超级用户权限。正是出于这个原因,Apple 将该漏洞的影响描述为:
具有 root 权限的应用或许能够以内核权限执行任意代码
此仓库包含针对该问题的概念验证漏洞利用代码,它通过使内核对象的引用计数下溢,在受影响的 macOS 版本上导致内核崩溃(kernel panic)。出于上述原因,此漏洞利用必须以 root 身份执行。
CVE-2022-32832 通过在 AppleAPFSUserClient::methodDeltaCreateFinalize 中添加 IOLockLock 和 IOLockUnlock 调用来保护易受攻击的代码,从而完成修补。