Трудноустранимые уязвимости в GRUB2, позволяющие обойти UEFI Secure Boot

Раскрыта информация о 8 уязвимостях в загрузчике GRUB2, позволяющих обойти механизм UEFI Secure Boot и добиться запуска неверифицированного кода, например, осуществить внедрение вредоносного ПО, работающего на уровне загрузчика или ядра.

Напомним, что в большинстве Linux-дистрибутивов для верифицированной загрузки в режиме UEFI Secure Boot используется небольшая прослойка shim, заверенная цифровой подписью Microsoft. Данная прослойка верифицирует GRUB2 собственным сертификатом, что позволяет разработчикам дистрибутивов не заверять каждое обновление ядра и GRUB в Microsoft. Уязвимости в GRUB2 позволяют добиться выполнения своего кода на этапе после успешной верификации shim, но до загрузки операционной системы, вклинившись в цепочку доверия при активном режиме Secure Boot и получив полный контроль за дальнейшим процессом загрузки, в том числе для загрузки другой ОС, модификации компонентов операционной системы и обхода защиты Lockdown.

Как и в случае с прошлогодней уязвимостью BootHole, для блокирования проблемы недостаточно обновить загрузчик, так как атакующий, независимо от используемой операционной системы, может для компрометации UEFI Secure Boot использовать загрузочный носитель со старой уязвимой версией GRUB2, заверенной цифровой подписью. Проблема решается только обновлением списка отозванных сертификатов (dbx, UEFI Revocation List), но в этом случае будет потеряна возможность использования старых установочных носителей c Linux. Для ускорения распространения отозванных сертификатов в будущем планируется задействовать механизм SBAT (UEFI Secure Boot Advanced Targeting), поддержка которого реализована для GRUB2, shim и fwupd.

На системах с прошивками, в которых обновлён список отозванных сертификатов, в режиме UEFI Secure Boot можно загрузить только обновлённые сборки дистрибутивов Linux. Дистрибутивам же потребуется обновить инсталляторы, загрузчики, пакеты с ядром, fwupd-прошивки и shim-прослойку, сгенерировав для них новые цифровые подписи. Пользователи должны будут обновить установочные образы и иные загрузочные носители, а также загрузить список отозванных сертификатов (dbx) в прошивку UEFI. До обновления dbx в UEFI система остаётся уязвимой независимо от установки обновлений в ОС. Статус устранения уязвимостей можно оценить на данных страницах: Ubuntu, SUSE, RHEL, Debian.

Выявленные уязвимости:

  • CVE-2020-14372 – при помощи команды acpi в GRUB2 привилегированный пользователь локальной системы может загрузить модифицированные таблицы ACPI, разместив SSDT (Secondary System Description Table) в каталоге /boot/efi и изменив настройки в grub.cfg. Несмотря на активность режима Secure Boot, предложенный SSDT будет выполнен ядром и может использоваться для отключения защиты LockDown, блокирующей пути обхода UEFI Secure Boot. В итоге атакующий может добиться загрузки свого модуля ядра или запуска кода через механизм kexec, без проверки цифровой подписи.
  • CVE-2020-25632 – обращение к уже освобождённой области памяти (use-after-free) в реализации команды rmmod, проявляющаяся при попытке выгрузить любой модуль без учёта связанных с ним зависимостей. Уязвимость не исключает создание эксплоита, который может привести к выполнению кода в обход верификпации Secure Boot.
  • CVE-2020-25647 – запись за границы буфера в функции grub_usb_device_initialize(), вызываемой при инициализации USB-устройств. Проблема может быть эксплуатирована через подключение специально подготовленного USB-устройства, выдающего параметры, размер которых не соответствует размеру буфера, выделенного для структур USB. Атакующий может добиться выполнения кода, не верифицированного в Secure Boot, через манипуляции с USB-устройствами.
  • CVE-2020-27749 – переполнение буфера в стеке в функции grub_parser_split_cmdline(), которое может быть вызвано указанием в командной строке GRUB2 переменных, размером более 1 КБ. Уязвимость позволяет добиться выполнения кода в обход Secure Boot.
  • CVE-2020-27779 – команда cutmem даёт возможность атакующему удалить диапазон адресов из памяти для обхода Secure Boot.
  • CVE-2021-3418 – изменения в shim_lock создали дополнительный вектор для эксплуатации прошлогодней уязвимости CVE-2020-15705. При установке сертификата, используемого для подписи GRUB2, в dbx, GRUB2 позволял загрузить любое ядро напрямую без проверки подписи.
  • CVE-2021-20225 – возможность записи данных за пределы буфера в куче при запуске команд с большим числом опций.
  • CVE-2021-20233 – возможность записи данных за границу буфера из-за неверного расчёта размера буфера при использовании кавычек. При расчёте размера предполагалось, что для экранирования одинарной кавычки требуется три символа, хотя на деле необходимо четыре.

Release. Ссылка here.