Código PoC para la vulnerabilidad del controlador del kernel GPU de Arm Mali (CVE-2022-38181) publicado

Man Yue Mo, un investigador de seguridad de GitHub, ha publicado detalles técnicos y un código de explotación de prueba de concepto (PoC) para un bypass de seguridad del controlador del núcleo de la GPU de Arm Mali que Arm parchó en agosto del año pasado.

El exploit PoC apunta a CVE-2022-38181 (puntaje CVSS de 8.8), una vulnerabilidad que podría permitir que un atacante remoto autenticado eluda las restricciones de seguridad, causadas por un error de uso después de liberar. Al realizar operaciones de procesamiento de GPU incorrectas, un atacante podría aprovechar esta vulnerabilidad para obtener la ejecución arbitraria del código del kernel desde el dominio de la aplicación que no es de confianza, que luego se usa para deshabilitar SELinux y obtener la raíz.

La vulnerabilidad afecta a los controladores del kernel de GPU Arm Mali Midgard r4p0 a r32p0, Bifrost r0p0 a r38p1 y r39p0, y Valhall r19p0 a r38p1 y r39p0.

Los controladores Midgard se utilizan en chips de las series Mali T800 y T700 aún más antiguos (2016), Samsung Galaxy S7 y Note 7, Sony Xperia X XA1, Huawei Mate 8, Nokia 3.1, LG X y Redmi Note 4.

Los controladores Bifrost se utilizan en los chips Mali G76, G72 y G52 más antiguos (2018) utilizados por Samsung Galaxy S10, S9, A51 y A71, Redmi Note 10, Huawei P30 y P40 Pro, Honor View 20, Motorola Moto G60S y Realme 7.

Los controladores Valhall se utilizan en los chips Mali G710, G610 y G510 que se encuentran dentro de Google Pixel 7, Asus ROG Phone 6, Redmi Note 11 y 12, Honor 70 Pro, RealMe GT, Xiaomi 12 Pro, Oppo Find X5 Pro y Reno 8 Pro , Motorola Edge y OnePlus 10R.

El investigador escribió en el artículo:

“Para resumir, el exploit implica los siguientes pasos:

  1. Crear memoria JIT.
  2. Marque la memoria JIT como desalojable.
  3. Aumente la presión de la memoria asignando la memoria al espacio del usuario a través de llamadas normales al sistema mmap  .
  4. Utilice el ioctl KBASE_IOCTL_MEM_QUERY  para verificar si la memoria JIT está liberada. Continúe aplicando presión de memoria hasta que se libere la región JIT.
  5. Asigne nuevas regiones de memoria de GPU utilizando el ioctl KBASE_IOCTL_MEM_ALLOC  para reemplazar la memoria JIT liberada.
  6. Cree una región de alias para la nueva región de memoria de GPU que reemplazó la memoria JIT para que las páginas de respaldo de la nueva memoria de GPU se compartan con la región de alias.
  7. Envíe un trabajo BASE_JD_REQ_SOFT_JIT_FREE para liberar la región JIT. Como la región JIT ahora se reemplaza por la nueva región de memoria, esto hará que  kbase_jit_free  elimine las páginas de respaldo de la nueva región de memoria, pero las asignaciones de GPU creadas en la región de alias en el paso 6 no se eliminarán. La región de alias ahora se puede usar para acceder a las páginas de respaldo liberadas.
  8. Reutilice las páginas de respaldo liberadas como PGD de kbase_context . La región de alias ahora se puede usar para reescribir el PGD. Luego puedo asignar páginas físicas arbitrarias al espacio de direcciones de la GPU.
  9. Asigne el código del kernel al espacio de direcciones de la GPU para obtener la ejecución arbitraria del código del kernel, que luego se puede usar para reescribir las credenciales de nuestro proceso para obtener la raíz y deshabilitar SELinux”.

Man Yue Mo ha publicado un código PoC que utilizó la vulnerabilidad CVE-2022-38181 para obtener la ejecución arbitraria del código del kernel y privilegios de root en un Pixel 6 desde una aplicación de Android.

La puntuación de gravedad de las vulnerabilidades es alta se pueden explotar y afectan a una gran cantidad de dispositivos Android.