O QPR2 do Android 16 adiciona uma macro do SELinux para proteger os drivers do kernel. Essa macro bloqueia IOCTLs restritos em produção, como IOCTLs descontinuados ou aqueles para desenvolvimento de drivers de kernel. Também limita IOCTLs para criação de perfil de driver a apps de shell ou depuráveis. Use essa macro para aumentar a segurança do seu dispositivo.
Implementação
Para proteger seu dispositivo com filtragem refinada de syscalls, chame a macro
set_xperm_filter na SEPolicy do dispositivo. Por exemplo:
# 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)
A definição de macro para set_xperm_filter está em
system/sepolicy/public/te_macros.
A macro permite unpriv_ioctls, bloqueia restricted_ioctls e limita
instrumentation_ioctls ao processo shell ou aos apps debuggable. O filtro se aplica a aplicativos que começam em um target_sdk especificado.
Esse recurso foi implementado em dispositivos Pixel que usam a GPU Mali (Pixel 6 a 9). A Arm forneceu a categorização oficial dos IOCTLs em
Documentation/ioctl-categories.rst da versão r54p2.
Essa lista vai continuar sendo atualizada em versões futuras de drivers.
Teste
Faça o seguinte para verificar o comportamento do driver do kernel:
Verifique se o driver não bloqueia IOCTLs de aplicativos legítimos e
Verifique se aplicativos não confiáveis não podem executar instrumentação e IOCTLs restritos.