Filtrado de llamadas al sistema de la GPU

Android 16 QPR2 agrega una macro de SELinux para proteger los controladores del kernel. Esta macro bloquea los IOCTL restringidos en la producción, como los IOCTLs obsoletos o los que se usan para el desarrollo de controladores del kernel. También limita los IOCTL para la generación de perfiles de controladores a apps de shell o depurables. Usa esta macro para mejorar la seguridad de tu dispositivo.

Implementación

Para proteger tu dispositivo con un filtrado de llamadas al sistema detallado, llama a la macro set_xperm_filter en la SEPolicy de tu dispositivo, por ejemplo:

# set_xperm_filter(target_context, allowed_target, unpriv_ioctls, restricted_ioctls, instrumentation_ioctls)
# Allow targets to harden their IOCTL interfaces by specifying
# unprivileged, blocked, and instrumentation-specific IOCTLs for appdomain.
#
# Parameters:
#   target_context: The target context to apply the filter to.
#   allowed_target: Additional `appdomain` target to exempt from hardened policy.
#     Allows for an allowlist of services, or gating by a target SDK.
#   unpriv_ioctls: IOCTLs to allow across appdomain.
#   restricted_ioctls: IOCTLs to deny across appdomain.
#   instrumentation_ioctls: IOCTLs intended to be used in development.
#     IOCTLs will be allowed from `shell` or `debuggable` applications.

define(`unpriv_gpu_ioctls', `0x0000, 0x0001, 0x0002')
define(`restricted_ioctls', `0x1110, 0x1111, 0x1112')
define(`instrumentation_gpu_ioctls', `0x2220, 0x2221, 0x2222')
set_xperm_filter(
  gpu_device,
  untrusted_app_sdk_gate,
  unpriv_ioctls,
  restricted_ioctls,
  instrumentation_ioctls)

La definición de la macro para set_xperm_filter se encuentra en system/sepolicy/public/te_macros.

La macro permite unpriv_ioctls, bloquea restricted_ioctls y limita instrumentation_ioctls al proceso shell o a las apps debuggable. El filtro se aplica a las solicitudes que comienzan en un target_sdk especificado.

Esta función se implementó en dispositivos Pixel que utilizan la GPU Mali (Pixel 6 a 9). Arm proporcionó la categorización oficial de sus IOCTL en Documentation/ioctl-categories.rst de su versión r54p2. Esta lista se seguirá manteniendo en futuras versiones de controladores.

Prueba

Para verificar el comportamiento del controlador del kernel, haz lo siguiente:

  • Comprueba que el controlador no bloquee los IOCTL de la aplicación legítima.

  • Verifica que las aplicaciones no confiables no puedan ejecutar la instrumentación ni los IOCTL restringidos.