Los controladores de GPU modernos (no solo limitados a Linux) son realmente inseguros. La forma en que una aplicación se comunica con una GPU es a través de Direct Rendering Manager , o interfaz DRM, usando ioctl(2)
. Estas llamadas al sistema se utilizan para pasar referencias a estructuras de datos complejas entre el territorio del usuario y el kernel. La interfaz DRM está disponible en forma de dos dispositivos de caracteres :
El nodo maestro , que maneja operaciones privilegiadas (por ejemplo, control de pantalla). Se expone como el dispositivo de caracteres /dev/dri/cardX
. A menudo, los usuarios solo pueden escribirlo en el grupo video
. Este dispositivo se mantiene tradicionalmente abierto por el servidor X, que se hace DRM master . El nodo maestro DRM tiene un área de superficie de ataque considerable y utiliza una API compleja.
El nodo de procesamiento , que maneja operaciones generalmente sin privilegios (por ejemplo, la computación y el procesamiento GPGPU). Se expone como el dispositivo de caracteres /dev/dri/renderDX
. Este dispositivo tiene un área de superficie de ataque considerable, a pesar de que solo maneja operaciones sin privilegios.
Las comprobaciones de permisos para los nodos DRM se realizan cuando se abre el archivo del dispositivo, con algunas excepciones . Una vez que el descriptor de archivo esté presente, cualquier aplicación con ese descriptor en su conjunto podrá enviar comandos privilegiados arbitrarios al subsistema de gráficos. Esto significa que su aislamiento finaliza tan pronto como su proceso no confiable tenga un descriptor de archivo válido para un nodo DRM. La seguridad del subsistema de gráficos depende tanto de la seguridad de la capa DRM (que tiene un interfaz muy compleja ), así como las interfaces específicas de hardware definido por el controlador de gráficos en sí. Diferentes controladores definen diferentes interfaces, algunas son más complejas que otras.
Dijiste que estabas usando seccomp-bpf. ¡Esto es bueno! Podrá enormemente reducir los problemas de seguridad intrínsecos en un subsistema de gráficos complejos. Asegúrese de que está filtrando cualquier ioctl
que se llama contra un nodo DRM. Lista blanca los comandos que se permite enviar a ioctl
. Aunque no puede hacer una lista blanca de las estructuras de datos que se pasan al kernel, la lista blanca del comando general a menudo es suficiente y reducirá enormemente el área de superficie disponible para un atacante.
Está lejos de ser una lista exhaustiva de errores graves de controladores de gráficos:
Radeon
Nvidia (propietario)
Intel (i915, etc.)
Cualquier controlador (error en el subsistema DRM subyacente)
El moderno hardware x86 es una bestia aterradora. Es complejo y no está diseñado pensando en la seguridad. Incluso si no hay vulnerabilidades en el software del controlador, las GPU pueden seguir suponer una amenaza simplemente debido a su naturaleza compleja e interacción con una arquitectura de computadora complicada sobre protocolos arcanos se rige por las especificaciones de solo una membresía. La seguridad es Difícil ™.