Фильтрация системных вызовов GPU

В Android 16 QPR2 добавлен макрос SELinux для защиты драйверов ядра. Этот макрос блокирует ограниченные IOCTL-вызовы в рабочей среде, такие как устаревшие IOCTL или IOCTL-вызовы, предназначенные для разработки драйверов ядра. Он также ограничивает IOCTL-вызовы для профилирования драйверов оболочкой или отлаживаемыми приложениями. Используйте этот макрос для повышения безопасности вашего устройства.

Выполнение

Чтобы усилить защиту устройства с помощью точной фильтрации системных вызовов, вызовите макрос set_xperm_filter в SEPolicy вашего устройства, например:

# 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)

Определение макроса для set_xperm_filter находится в system/sepolicy/public/te_macros .

Макрос разрешает unpriv_ioctls , блокирует restricted_ioctls и ограничивает instrumentation_ioctls процессом shell или debuggable приложениями. Фильтр применяется к приложениям, запускаемым с указанного target_sdk .

Эта функция реализована на устройствах Pixel с графическим процессором Mali (Pixel 6-9). Компания Arm предоставила официальную классификацию своих IOCTL в Documentation/ioctl-categories.rst версии r54p2 . Этот список будет поддерживаться в будущих версиях драйверов.

Тест

Чтобы проверить поведение драйвера ядра, выполните следующие действия:

  • Проверьте, не блокирует ли драйвер легитимные IOCTL-запросы приложений и,

  • Убедитесь, что ненадежные приложения не могут выполнять инструментирование и ограниченные IOCTL.