
Exploit de prueba de concepto y análisis técnico para CVE-2022-32832, una condición de carrera del kernel APFS de Apple en macOS que permite la escalada de privilegios.
CVE-2022-32832 es una vulnerabilidad en el método externo AppleAPFSUserClient::methodDeltaCreateFinalize (selector 49). Aquí está la descompilación antes del parche:
__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 no utiliza ninguna técnica de sincronización para serializar las llamadas a métodos externos. Esto significa que es posible para un atacante liberar dos veces el delta_create_ctx_t y propiedades relacionadas, provocando una condición de carrera entre dos llamadas a en el mismo userclient, ya que ambas podrán invocar (el método responsable de liberar el ) antes de que se establezca en .
AppleAPFSUserClient::methodDeltaCreateFinalizeAppleAPFSContainer::deltaCreateTeardowndelta_create_ctx_tthis->deltaCreateCtxNULLPara desencadenar esto, un atacante primero necesita crear un "contexto de creación delta" en el userclient utilizando el método externo AppleAPFSUserClient::methodDeltaCreatePrepare (selector 36). Esto requiere un volumen desmontado para funcionar, por lo que un flujo de explotación normal requiere que el atacante también cree un volumen objetivo utilizando el método externo AppleAPFSUserClient::methodVolumeCreate, que requiere privilegios de superusuario. Es por esta razón que Apple describió el impacto de la vulnerabilidad como:
Una aplicación con privilegios de root puede ejecutar código arbitrario con privilegios de kernel
Este repositorio incluye un exploit de prueba de concepto para este problema que provoca un pánico del kernel en versiones vulnerables de macOS al desbordar por debajo el contador de referencias de un objeto del kernel. Este exploit debe ejecutarse como root por las razones mencionadas anteriormente.
CVE-2022-32832 fue corregido añadiendo llamadas a IOLockLock e IOLockUnlock en AppleAPFSUserClient::methodDeltaCreateFinalize para proteger el código vulnerable.