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.