Linux: interfaces de I/O y memoria expuestas en modo Lockdown

Durante casi una década, el modo de bloqueo del kernel ha servido para reforzar el acceso al kernel desde el espacio de usuario, especialmente cuando el UEFI Secure Boot está habilitado. Este modo restringe el acceso a los PCI BAR, bloquea la escritura en /dev/mem y aplica otras limitaciones para asegurar que el espacio de usuario no pueda modificar el kernel en ejecución ni acceder a memoria sensible. Sin embargo, un descuido permitió que las interfaces legacy de I/O y memoria a través de sysfs permanecieran abiertas, aunque una solución está en desarrollo.

En 2022 se reportó un bug trivial de omisión del bloqueo. El incidente más reciente en el ámbito del modo Lockdown es que las interfaces sysfs legacy_io y legacy_mem para dispositivos PCI han permanecido abiertas para usuarios root, permitiendo escritura incluso con el modo de seguridad activo. El archivo legacy_io se utiliza para operaciones de lectura/escritura en puertos I/O heredados, mientras que legacy_mem se emplea para acceder al espacio de memoria PCI antiguo.

La imagen superior muestra la arquitectura de las ranuras PCI/PCIe donde residen estos componentes. Krzysztof Wilczyński explicó, en un parche enviado a la rama "next" del subsistema PCI antes del lanzamiento de Linux 7.3, que las verificaciones de bloqueo nunca se añadieron para los controladores de I/O y memoria legacy. Esta situación persiste desde 2019, cuando se añadió el código original para bloquear el acceso a los PCI BAR cuando el kernel está en modo seguro.

"Actualmente, los controladores sysfs de I/O y memoria legacy no verifican security_locked_down(LOCKDOWN_PCI_ACCESS), dejando los archivos legacy_io y legacy_mem desprotegidos cuando el kernel está bloqueado. El commit eb627e17727e ("PCI: Lock down BAR access when the kernel is locked down") añadió la verificación a pci_write_config(), pci_mmap_resource() y pci_write_resource_io() para evitar que el espacio de usuario programe hardware con capacidad DMA que podría modificar código del kernel, pero no cubrió los controladores legacy. Como resultado, root aún puede escribir en puertos I/O arbitrarios y mapear espacios de memoria legacy mientras el kernel está bloqueado, lo cual es la capacidad que el modo Lockdown debería eliminar."

El parche se encuentra en la rama Git "next" del subsistema PCI para la próxima ventana de fusión de Linux 7.3. Al estar marcado como una corrección para el parche original de PCI BAR de 2019, es probable que se aplique también a las versiones estables existentes del kernel Linux. Vía Phoronix.