Защита устройств Linux с проверенной загрузкой, от ROM до Userspace

На фоне растущей озабоченности по поводу эскалации атак на устройства на базе Linux на ELC Europe 2016 был проведен насыщенный доклад, посвященный теме проверенных схем загрузки.

На фоне растущих атак на устройства Linux Конференция 2016 года по встраиваемым Linux продемонстрировала новое внимание к безопасности.
Одна хорошо посещаемая презентация на ELC Europe была посвящена теме проверенных схем загрузки.
В этом выступлении Марк Кляйн-Будде из Pengutronix раскрыл архитектуру и стратегии недавно разработанной проверенной схемы загрузки для одноядерного Cortex-A9 NXP i.MX6, работающего на RIoTboard SBC.

Стек работает на большинстве моделей i.MX SoC, а его структура и большинство его компонентов могут передаваться другим процессорам ARM.
«Легко сделать это самостоятельно, используя несколько стеков с открытым исходным кодом», - говорит Кляйн-Бадде, которая также является разработчиком CAN драйвера проекта ядра Linux.


(щелкните изображение, чтобы увеличить)

По его словам, проверенная загрузка - это «сложный стек Linux в пользовательском пространстве», предназначенный для обнаружения подделки любого этапа процесса загрузки.
Учитывая, что встраиваемые устройства обычно не имеют передового программного обеспечения безопасности и физических средств защиты, существующих в мире серверов, это одна из наиболее эффективных и экономически эффективных стратегий безопасности.

«Если вы можете изменить загрузчик встроенной системы, вы можете иметь полный контроль над ней, - сказал Кляйн-Будде, - если злоумышленник хочет получить root права на вашу систему, он сначала пытается установить собственный загрузчик, обычно из незащищенного источника». например, SD, USB или eMMC.
Для наших клиентов мы хотели защитить загрузчик, ядро, файловую систему и даже данные для чтения и записи ».

В этих системах ARM код ПЗУ проверяет загрузчик перед его запуском.
На i.MX SoC это делается путем подписания загрузчика проприетарным инструментом и открытым ключом.
Соответствующий сертификат записывается в самом i.MX для проверки загрузчика.
Код ПЗУ решает, откуда загружаться, а затем передает его загрузчику, такому как U-boot, или, в данном случае, barebox , который затем загружает деревья устройств ядра и корневую файловую систему.

На начальном этапе ПЗУ i.MX SoC используют запатентованный код расширения ПЗУ, называемый высоконадежной загрузкой или коротким HAB, который, в свою очередь, использует стандартные криптографические алгоритмы SHA и RSA.
Barebox имеет еще один ключ, который проверяет образ ядра и InitRAMFS (исходная файловая система RAM).

«В процессе загрузки сначала запускается код ПЗУ», - сказал Кляйн-Будде.
«В процессе производства вы сжигаете предохранители в вашем SoC, которые проверяют открытый ключ, который поставляется с загрузчиком.
Код ПЗУ подтверждает, что pubkey корректен, а затем pubkey проверяет подпись, которая проходит через сам загрузчик.
Второй pubkey используется для проверки стадии ядра ».

FIT-Image, ext4 и UBIFS

Для проверки пространства пользователя Pengutronix использовал FIT-образ, который состоит из ядра, дерева (-ов) устройства и InitRAMFS.
«Все это включено в одно изображение и может использоваться в нескольких конфигурациях, поэтому вы можете использовать один FIT-образ на различных досках», - сказал Кляйн-Будде.
«Если ваш загрузчик знает, какая у вас плата, он может выбрать правильную конфигурацию из FIT-образа, который можно сохранить на ненадежном носителе».

Загрузчик проверяет открытый ключ загрузчика, чтобы убедиться, что конфигурация FIT-Image действительна.
Для этого он проверяет подпись, а затем анализирует три хэша для ядра, дерева устройств и InitRAMFS.

После проверки ядро ​​затем защищает каждый файл в корневой файловой системе, который должен поддерживать расширенные атрибуты.
«Мы использовали файловую систему ext4 с расширенными атрибутами», - сказал Кляйн-Будде.
«Вы можете использовать флэш-чип или голый чип NAND с UBI и UBIFS, или вы можете использовать блочное хранилище мультимедиа, такое как eMMC».

Чтобы проверить файловую систему, Pengutronix использовал IMA основного ядра ядра (Integrity Measurement Architecture), которая использует хэш для каждого файла, тем самым указывая, был ли файл изменен.
Содержимое хешируется, а затем сохраняется как расширенный атрибут, в данном случае security-ima.

«Если злоумышленники получат доступ к этой системе, они могут изменить файл, пересчитать хэш и записать его на носитель», - сказал Кляйн-Будде.
«Чтобы избежать этого, мы используем ядро ​​EVM (модуль расширенной проверки) и создаем подпись над расширенными атрибутами.
Это делается на вашем ПК для разработки во время создания образа.
Вы берете закрытый ключ, создаете корневую файловую систему и подписываете каждый файл и расширенный атрибут.
Он содержит хеш, поэтому вы можете быть уверены, что файл и контрольная сумма не были изменены.
EVM-подпись затем проверяется открытым ключом ядра ».

Защита хранилища для чтения / записи с помощью SHA-HMAC Secret

Клиенты Pengutronix также хотели иметь возможность проверять носители для чтения / записи.
«Для этого мы использовали EVM с SHA-HMAC, умным способом хеширования, который позволяет вам гарантировать целостность и аутентификацию», - сказал Кляйн-Будде.
HMAC могут быть проверены быстрее, чем RSA, тем самым сокращая время загрузки, добавил он.

«С SHA-HMAC вам нужен отдельный« Общий секрет »для каждой системы, потому что если злоумышленник откроет одну систему и модифицирует ее, а HMAC привыкнет, он может перенести измененный файл из одной системы в другую», - сказал Кляйн-Будде. ,
«Как только ядро ​​коснется каждого файла, оно пересчитает проверку на основе HMAC и запишет ее.
Злоумышленник не может пересчитать HMAC, если у него нет секрета EVM ».

Секрет генерируется на i.MX SoC.
«Если вы создали правильно подписанный загрузчик, у вас есть доступ к уникальному ключу, который уникален для каждого отдельного SoC», - сказал Кляйн-Будде.
«Предохранители SoC содержат сертификационные хеши, которые соответствуют секретному ключу, используемому для подписи загрузчика.
Вы можете сжечь предохранители только один раз, и есть даже отдельный предохранитель, который может запретить горение других предохранителей.
Вы подписываете загрузчик, когда создаете свой BSP ».

Уникальный ключ используется для шифрования общего секрета для EVM, хранящегося на носителе.
«Вы можете расшифровать только ту систему, которую использовали для ее шифрования, и только если у вас есть правильно подписанный загрузчик», - сказал Кляйн-Будде.
«Затем вы используете InitRAMFS для расшифровки большого двоичного объекта и получения доступа к его EVM-Secret, который требуется, если вы хотите выполнять чтение / запись.
Это проверяет, чтобы убедиться, что EVM, IMA и содержимое все правильно ».

На 22-й минуте видео Кляйн-Будде ответила на 10-минутные вопросы о том, была ли капля должным образом закреплена.
Кляйн-Будде придерживался своего первоначального ответа: «BLOB-объект шифруется уникальным ключом.
Вы не можете дешифровать BLOB-объект, если у вас нет уникального ключа.

Затем он объяснил, как он использовал eCryptfs для шифрования на уровне файловой системы.
«ECryptfsworks работает как с NAND, так и с UBIFS», - сказал он.
«Каждый файл в зашифрованной файловой системе соответствует файлу в незашифрованной системе.
Имена файлов и их содержимое зашифрованы, но структура каталога и права доступа являются открытым текстом.
Для eCryptfs требуется отдельный общий секретный ключ для каждой системы.
Вам не нужен IMA / EVM, потому что целостность обеспечивается GCM и AES в крипто-движке i.MX ».

Наконец, Kleine-Budde продемонстрировал проверенный процесс загрузки под управлением Linux 4.0.9 с патчами на RIoTboard на базе i.MX6.
Он также передал некоторые уроки, извлеченные для других, пытающихся создать подобный доверенный загрузочный стек на основе ARM.

«Храните свои пакеты в двух конфигурациях: один защищенный пакет с рабочими ключами, а другой - с которыми люди могут играть», - сказал Кляйн-Будде.
Точно так же один серийный загрузчик и

Конфигурация ядра / InitRAMFS должна перезагрузиться при обнаружении атаки, в то время как другая просто отображает уведомление.
Он также отметил, что комбинация UBIFS с IMA / EVM чувствительна к внезапной потере мощности.
Эта проблема исправлена ​​в следующей версии Linux v4.10.

Кляйн-Будде признал, что проверенная загрузка увеличивает время загрузки, в данном случае примерно на 10 процентов.
Однако, если рассматривать альтернативу, накладные расходы того стоят.
«В Интернете существует множество целей Linux, привлекательных для взлома», - сказал Кляйн-Будде.

Вы можете посмотреть полную презентацию Кляйн-Будде ниже, а слайды доклада можно скачать здесь [PDF].

Проверенная загрузка: из ПЗУ в пространство пользователя

Эта статья защищена авторским правом © 2017 Linux.com и была первоначально опубликована здесь .
Он был воспроизведен этим сайтом с разрешения его владельца.
Пожалуйста, посетите Linux.com для получения последних новостей и статей о Linux и open source.