O Android 16 QPR2 adiciona uma macro SELinux para proteger os drivers do kernel. Essa macro bloqueia IOCTLs restritas na produção, como IOCTLs obsoletas ou aquelas para desenvolvimento de drivers do kernel. Ela também limita as IOCTLs para criação de perfil de driver a apps de shell ou depuráveis. Use essa macro para melhorar a segurança do dispositivo.
Implementação
Para proteger o dispositivo com a filtragem de syscalls refinada, 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 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 das IOCTLs em
Documentation/ioctl-categories.rst da versão r54p2.
Essa lista vai continuar sendo mantida em versões futuras do driver.
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 IOCTLs de instrumentação e restritas.