
Доказательство концепции эксплойта и технический анализ для CVE-2022-32832 — гонки состояний в ядре Apple APFS на macOS, позволяющей повышение привилегий.
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 не использует никаких методов синхронизации для сериализации вызовов внешних методов. Это означает, что атакующий может дважды освободить (double-free) delta_create_ctx_t и связанные с ним свойства, организовав гонку двух вызовов для одного и того же пользовательского клиента, так как оба смогут вызвать (метод, отвечающий за освобождение ) до того, как будет установлен в .
AppleAPFSUserClient::methodDeltaCreateFinalizeAppleAPFSContainer::deltaCreateTeardowndelta_create_ctx_tthis->deltaCreateCtxNULLЧтобы вызвать это, атакующему сначала нужно создать «контекст дельта-создания» (delta create context) в пользовательском клиенте, используя внешний метод AppleAPFSUserClient::methodDeltaCreatePrepare (селектор 36). Для этого требуется размонтированный том, поэтому обычный сценарий эксплуатации требует от атакующего также создать целевой том с помощью внешнего метода AppleAPFSUserClient::methodVolumeCreate, что требует привилегий суперпользователя. По этой причине Apple описала влияние уязвимости следующим образом:
Приложение с привилегиями root может выполнить произвольный код с привилегиями ядра
Этот репозиторий содержит эксплойт-концепцию для данной проблемы, которая вызывает панику ядра на уязвимых версиях macOS путем уменьшения счётчика ссылок объекта ядра до нуля. Этот эксплойт необходимо выполнять от имени root по причинам, указанным выше.
CVE-2022-32832 была исправлена путём добавления вызовов IOLockLock и IOLockUnlock в AppleAPFSUserClient::methodDeltaCreateFinalize для защиты уязвимого кода.