Методы отключения защиты Lockdown в Ubuntu для удалённого обхода UEFI Secure Boot

Андрей Коновалов из компании Google опубликовал способ удалённого отключения защиты Lockdown, предлагаемой в пакете с ядром Linux, поставляемом в Ubuntu (теоретически предложенные методы должны работать с ядром Fedora и других дистрибутивов, но они не протестированы).

Lockdown ограничивает доступ пользователя root к ядру и блокирует пути обхода UEFI Secure Boot. Например, в режиме lockdown ограничивается доступ к /dev/mem, /dev/kmem, /dev/port, /proc/kcore, debugfs, отладочному режиму kprobes, mmiotrace, tracefs, BPF, PCMCIA CIS (Card Information Structure), некоторым интерфейсам ACPI и MSR-регистрам CPU, блокируются вызовы kexec_file и kexec_load, запрещается переход в спящий режим, лимитируется использование DMA для PCI-устройств, запрещается импорт кода ACPI из переменных EFI, не допускаются манипуляции с портами ввода/вывода, в том числе изменение номера прерывания и порта ввода/вывода для последовательного порта.

Механизм Lockdown недавно был добавлен в основной состав ядра Linux 5.4, но в поставляемых в дистрибутивах ядрах он по-прежнему реализован в форме патчей или дополнен патчами. Одним из отличий предоставляемых в дистрибутивах надстроек от встроенной в ядро реализации является возможность отключения предоставляемой блокировки при наличии физического доступа к системе.

В Ubuntu и Fedora для отключения Lockdown предусмотрена комбинация клавиш Alt+SysRq+X. Подразумевается, что комбинацию Alt+SysRq+X можно использовать только при физическом доступе к устройству, а в случае удалённого взлома и получения root-доступа атакующий не сможет отключить Lockdown и, например, загрузить в ядро незаверенный цифровой подписью модуль с rootkit-ом.

Андрей Коновалов показал, что связанные с использованием клавиатуры методы подтверждения физического присутствия пользователя неэффективны. Простейшим способом отключения Lockdown была бы программная симуляция нажатия Alt+SysRq+X через /dev/uinput, но данный вариант изначально блокирован. При этом удалось выявить как минимум ещё два способа подстановки Alt+SysRq+X.

Первый способ связан с использованием интерфейса «sysrq-trigger» — для симуляции достаточно включить этот интерфейс, записав «1» в /proc/sys/kernel/sysrq, а затем записать «x» в /proc/sysrq-trigger. Указанная лазейка устранена в декабрьском обновлении ядра Ubuntu и в Fedora 31. Примечательно, что разработчики, как в случае с /dev/uinput, изначально пытались блокировать данный метод, но блокировка не работала из-за ошибки в коде.

Второй способ связан с эмуляцией клавиатуры через USB/IP и последующей отправкой последовательности Alt+SysRq+X с виртуальной клавиатуры. В поставляемом в Ubuntu ядре USB/IP по умолчанию включён (CONFIG_USBIP_VHCI_HCD=m и CONFIG_USBIP_CORE=m) и предоставлены необходимые для работы заверенные цифровой подписью модули usbip_core и vhci_hcd. Атакующий может создать виртуальное USB-устройство, запустив сетевой обработчик на loopback-интерфейсе и подключив его как удалённое USB-устройство при помощи USB/IP. Об указанном методе сообщено разработчикам Ubuntu, но исправление пока не выпущено.

Источник: opennet.ru