Google развивает открытую замену прошивкам UEFI

Рональд Минних (Ronald Minnich), основатель проекта CoreBoot, выступил на конференции LinuxCon с докладом, в котором рассказал о развиваемом компанией Google открытом проекте NERF (Non-Extensible Reduced Firmware). В рамках NERF предпринята попытка разработки прозрачной и открытой замены прошивкам UEFI, в основе которой использовано ядро Linux и урезанное программное окружение. Конечной целью является предоставление средств для замены или отключения всех прослоек, выполняемых вне основной операционной системы, и блокирование любой связанной с UEFI, SMM и Intel ME фоновой активности.

NERF также рассчитан на снижение векторов возможных атак, расширение возможностей по контролю за активностью прошивок, исключение излишней функциональности (например, TCP-стек и web-сервер), удаление встроенных механизмов обновления в пользу обновления из базового Linux-окружения. В состав NERF входит избавленный от блобов упрощённый вариант прошивки для Intel ME (Management Engine), урезанная прошивка для UEFI, код для отключения SMM, ядро Linux, образ initramfs c системой инициализации и инструментарием u-root, написанными на языке Go.

В прошивке для Intel ME оставлены только компоненты для начальной инициализации CPU, все остальные модули удалены при помощи инструментария me_cleaner (прошивка сокращена с 5 Мб до 300 Кб). Код обработчиков SMM (System Management Mode) также отключен и переведён на обработку прерываний SMI через ядро Linux. Прошивка для UEFI переведена на использование ядра Linux, наработок CoreBoot и инструментария u-root.

U-root написан на языке Go и включает в себя легковесную систему инициализации, оболочку rush и набор типовых утилит, таких как cp, mv, ls, grep, sort, dd, insmod, wget, netcat и т.п. Примечательно, что в формируемый при помощи u-root образ корневой ФС включается лишь процесс инициализации и несколько исполняемых файлов с компилятором языка Go. Все команды собираются только при необходимости — если запущенная утилита не была собрана ранее, то её компиляция осуществляется на лету после попытки первого запуска. Результат компиляции вызванной утилиты помещается в tmpfs и доступен для повторного использования в рамках текущего сеанса.

Таким образом, в u-root все утилиты предлагаются в исходных текстах, а для адаптации инструментария требуется лишь настройка компилятора. Компиляция занимает доли секунды и не приводит к ощутимым задержкам при вызове. Подобный подход позволяет сделать образ u-root универсальным и распространять единый образ корневой ФС для всех платформ, поддерживаемых компилятором языка Go (для каждой новой архитектуры требуется лишь подготовить 4 исполняемых файла, в одном образе могут содержаться сборки компилятора для разных архитектур). Дополнительно предусмотрены варианты c компиляцией всех утилит во время загрузки или поставки готовых сборок (для минимизации размера прошивки все утилиты могут быть собраны в один исполняемый файл, по аналогии с busybox).

0_1509349293.png

Необходимость замены UEFI обусловлена тем, что на современных компьютерах параллельно с основной операционной системой параллельно выполняется ещё несколько неконтролируемых программных окружений (UEFI, SMM, Intel ME), которые формируются на основе проприетарных прошивок. Код UEFI продолжает работать после загрузки основной ОС и выполняется на уровне кольца защиты Ring -2. Данные закрытые окружения создают дополнительные угрозы безопасности. Например, внедрённый в прошивку UEFI вредоносный код может оставаться невидимым из основной ОС, но полностью контролировать всю систему.

0_1509344572.png

В частности, ресурс WikiLeaks в этом году раскрыл сведения о разработке в ЦРУ имплантов для контроля за системой, внедряемых в прошивки UEFI. Современные прошивки сильно усложнены и включают многие атрибуты обычных ОС, включая TCP-стек, http-сервер, DHCP, драйверы, файловые системы и web-интерфейс. С учётом значительного размера кодовой базы прошивок UEFI, которая составляет около 2 млн строк кода, и недоступностью кода прошивок для независимого аудита, также возникают опасения о наличии в прошивках большого количества неисправленных уязвимостей.

©  OpenNet