Внедрение модулей безопасной загрузки в Vhdl для Fpga

Критическая роль безопасной загрузки в системах FPGA

Полевые программируемые воротные массивы (FPGA) все чаще развертываются в критически важных и чувствительных к безопасности приложениях, таких как промышленный контроль, аэрокосмическая промышленность, оборона, телекоммуникации и Интернет вещей (IoT). Их реконфигурируемый характер делает их уязвимыми для вредоносных атак во время процесса загрузки. Незащищенный битовый поток FPGA может быть перехвачен, модифицирован или заменен мошенническим битовым потоком, который компрометирует всю систему. Безопасный загрузчик является первой линией защиты, гарантирующей, что в устройство загружается только аутентифицированное и авторизованное прошивка. Эта статья предоставляет подробное техническое руководство для реализации такого загрузчика в VHDL, охватывающее криптографическую проверку, безопасное хранение, аппаратную интеграцию и отказоустойчивость.

Процесс загрузки на FPGA обычно начинается с небольшого, неизменяемого фрагмента кода (часто хранящегося в однократно программируемой памяти или защищенной ПЗУ), который инициализирует устройство, считывает подписанное изображение прошивки из внешней памяти (например, SPI flash), проверяет его целостность и подлинность, а затем загружает его в ткань FPGA. Без безопасного загрузчика злоумышленник может заменить битовый поток версией, настроенной на троян, вводить бэкдоры или заставлять устройство в небезопасное состояние. Безопасная загрузка предотвращает эти атаки, устанавливая корень доверия , закрепленный в аппаратном обеспечении. Сам загрузчик должен быть спроектирован с той же строгостью, что и криптографические алгоритмы, которые он реализует.

Концепция безопасного загрузчика

Безопасный загрузчик для систем FPGA - это выделенный аппаратный модуль или программно-аппаратный режим, который выполняется перед основным приложением. Он выполняет несколько критических этапов:

  • Предзагрузочная инициализация: Настраивает тактовую, I/O и базовые интерфейсы памяти, чтобы загрузчик мог получить доступ к сохраненному прошивке.
  • Криптографическая проверка: Прочитывает подписанное изображение прошивки, извлекает открытый ключ (или симметричный ключ) и проверяет цифровую подпись или хеш. Этот шаг гарантирует, что прошивка является подлинной и не была подделана.
  • Цепочка доверия: Сам загрузчик аутентифицируется аппаратным корнем доверия FPGA (например, встроенным защищенным процессором, PUF или одноразово программируемым ключом). Каждый последующий этап проверяет следующий, образуя непрерывную цепочку.
  • Неисправно-толерантная загрузка: Если проверка проходит, то изображение прошивки загружается в память конфигурации FPGA. Если проверка не удаётся, загрузчик входит в безопасное состояние, останавливая систему или запуская оповещение.

Во многих семействах FPGA (например, Xilinx Zynq, Intel Agilex) есть специальные функции безопасности аппаратного обеспечения, такие как дешифровщики AES, проверяющие HMAC и хранилище ключей на основе eFUSE. Загрузчик VHDL должен взаимодействовать с этими блоками, сохраняя при этом логику управления в ткани. Разделение между аппаратно ускоренной криптографией и мягкой логикой является ключевым дизайнерским решением.

Корень доверия и цепь доверия

Корень доверия (RoT) является неизменным элементом в FPGA, который обеспечивает начальные криптографические учетные данные. Это может быть одноразово программируемый (OTP) ключ, сожженный в блоки eFUSE, физически неклонируемая функция (PUF), которая генерирует уникальный ключ устройства, или выделенный безопасный микроконтроллер, интегрированный на том же кристалле. Загрузчик использует этот RoT для проверки открытого ключа или симметричного ключа, используемого для проверки прошивки. Цепь доверия простирается от RoT до загрузчика, затем до основного приложения и необязательно до последующих уровней программного обеспечения (например, ядра операционной системы). Реализаторы VHDL должны хранить дайджест открытого ключа или корневой ключ безопасным образом; внешнее хранилище за пределами чипа должно быть зашифровано или обернуто под ключ RoT.

Проектирование для реализации VHDL

Разработка безопасного загрузчика в VHDL требует балансировки производительности, безопасности и надежности.

Механизмы аутентификации

Ядром безопасного загрузчика является возможность проверки целостности и подлинности прошивки. Общие механизмы включают:

  • Цифровые подписи (асимметричная криптография): Изображение прошивки подписано приватным ключом (например, ECDSA, RSA). Загрузчик содержит соответствующий открытый ключ. Вычисляется хеш прошивки (SHA-256), затем подпись проверяется с помощью открытого ключа. Асимметричные методы обеспечивают сильную безопасность, но требуют умеренных аппаратных ресурсов. В VHDL обычно инстанцируют аппаратное криптоядро (например, из каталога Vivado IP Xilinx или OpenCores) для проверки SHA-256 и ECDSA.
  • Коды аутентификации сообщений (симметричные): Используя общий секретный ключ, загрузчик вычисляет HMAC по прошивке и сравнивает его с прилагаемым тегом HMAC. Симметричная проверка быстрее, чем асимметричная, но требует безопасного распределения ключа. Многие FPGA интегрируют ядра AES-GCM, которые могут выполнять аутентифицированное шифрование/дешифрование, обеспечивая как конфиденциальность, так и целостность.
  • Верификации на основе хэша (упрощено): В менее критических системах загрузчик может вычислить простой хэш CRC или SHA и сравнить его с хранимым дайджестом. Без секретного ключа это обнаруживает только случайную коррупцию, а не вредоносное вмешательство. Его следует комбинировать с безопасным хранилищем для хэша.

Для производственных систем ECDSA (Elliptic Curve Digital Signature Algorithm) по 256-битной кривой (secp256r1) является популярным выбором из-за его относительно небольшого размера подписи и эффективной реализации аппаратного обеспечения. Загрузчик должен включать в себя конечную машину состояния (FSM), которая последовательности вычислений SHA-256, а затем подает дайджест в блок проверки ECDSA.

Безопасное хранение криптографических ключей

Безопасность загрузчика зависит от сохранения ключей проверки в секрете и неизменности.В число вариантов хранения ключей в системах FPGA входят:

  • eFUSE/OTP память: Одноразовые программируемые предохранители внутри FPGA могут хранить корневой ключ или дайджест открытого ключа. После продувки их нельзя изменить, обеспечивая прочный якорь. Однако количество предохранителей ограничено (часто 256 бит), и они обычно используются для симметричного корневого ключа.
  • RAM (BBRAM): Некоторые FPGA предлагают небольшое количество ОЗУ, которая сохраняет данные во время потери мощности, если присутствует резервная батарея.
  • Внешняя защищенная память: Защищенный элемент с выключенным чипом (например, ATECC608A), который хранит ключи и выполняет криптографические операции снаружи. Это загружает загрузчик VHDL, но вводит сложность интерфейса (I2C, SPI).
  • Генерация ключей на основе PUF: Современные FPGA (например, Xilinx Zynq UltraScale+) обеспечивают PUF, который генерирует уникальный ключ устройства на основе производственных вариаций. Этот ключ не хранится явно; он регенерируется каждый раз, когда PUF запрашивается с использованием вспомогательных данных. Этот подход сопротивляется физическим атакам и не требует постоянного хранения.

В VHDL загрузчик должен извлечь ключ из безопасного источника и передать его в криптоядро. Для eFUSE или BBRAM поставщик FPGA предоставляет выделенные примитивные ячейки (например, «SYSMON» для мониторинга температуры / напряжения Xilinx, «BSCAN» для доступа JTAG). Загрузчик должен инициализировать FSM поиска ключа при запуске и обрабатывать условия ошибки (например, если eFUSE не был запрограммирован).

Модули безопасности аппаратного обеспечения (HSM)

FPGA часто интегрируют аппаратные ускорители, которые выгружают криптографические функции из мягкой логики.

  • Аппаратные криптоускорители: Выделенные модули для AES, SHA-256 и RSA/ECDSA. В FPGA-каталогах Vivado IP представлены ядра AES-GCM, SHA-256 и ECDSA. В устройствах Intel/Altera блок «Криптографический ускоритель» может использоваться. Эти ядра работают на порядок быстрее, чем мягкие реализации, и лучше сопротивляются атакам по боковым каналам.
  • Генератор подлинных случайных чисел (TRNG): Требуется для генерации нонс, ключевых графиков или случайных задач в потоке загрузки. TRNG должен быть энтропически звук и сертифицирован (например, NIST SP 800-90A).
  • Физическая неклонируемая функция (PUF): Как уже упоминалось, PUF генерируют специфические для устройства ключи и также могут использоваться для связывания загрузчика с конкретным экземпляром FPGA, предотвращая кражу битового потока.
  • Безопасный монитор: Специальный процессор безопасности, который контролирует сбои напряжения, температуры и часов.Если обнаружена атака, он может очистить регистры чувствительных ключей или сбросить загрузчик.

Загрузчик VHDL должен при необходимости настроить эти HSM (например, установить ключ в двигателе AES), управлять потоком данных между ними и обрабатывать прерывания или сигналы состояния. Интерфейс обычно использует AXI4-Stream или протокол, специфичный для поставщика. Машина состояния управления загрузчика должна быть спроектирована так, чтобы ждать, пока HSM завершит операции, проверять ошибки и исправлять или исправлять ошибки.

Виновата терпимость и хрупкость

Загрузчик должен надежно работать в неблагоприятных условиях. К основным методам обеспечения отказоустойчивости относятся:

  • Трехмодульные избыточные (TMR): Машины критического состояния (например, контроллер загрузки) могут быть тройными и за них можно голосовать, чтобы маскировать одномерные расстройства (SEU). Это особенно важно в аэрокосмической среде.
  • Системы мониторинга: Аппаратный сторожевой пёс, который должен периодически сбрасываться загрузчиком во время нормальной работы. Если загрузчик висит из-за сбоя, сторожевой пёс запускает сброс системы.
  • Защита от сбоев питания: Загрузчик должен убедиться, что источник питания стабилен перед началом критических операций. Используйте встроенный сброс питания FPGA (POR) и монитор напряжения, чтобы обеспечить устойчивость VCC.
  • Восстановление ошибок: Если проверка подписи не удаётся из-за временной ошибки (например, ошибки чтения памяти), загрузчик может перезагрузить ограниченное количество раз, прежде чем объявить о постоянной неисправности.
  • Излишнее хранилище изображений: Храните две копии изображения прошивки (золотой и обновленный) во флэш-памяти. Если первичное изображение не проверяется, загрузчик может вернуться к золотому изображению. Такой подход предотвращает закидку во время неудавшегося обновления.

Внедрение этих функций в VHDL требует тщательного планирования ресурсов. Например, TMR трипликация FSM и логики избирателей, увеличение использования LUT в 3-4 раза. Однако для систем с высокой надежностью эти накладные расходы приемлемы.

VHDL кодирование стратегии для загрузчика

Написание безопасного загрузчика в VHDL требует модульности, ясности и соблюдения практики безопасного кодирования.

Модульный дизайн и иерархия

Разложите загрузчик на отдельные модули:

  • boot controller: FSM верхнего уровня, который координирует последовательность загрузки. Он организует сброс, поиск ключей, проверку криптографии и загрузку прошивки.
  • crypto wrapper: Инкапсулирует криптографические ядра (SHA-256, ECDSA или AES-GCM). Обеспечивает интерфейс регистра для контроллера для начала операций и считывания состояния.
  • mem interface: Обрабатывает связь с внешней флэш-памятью (SPI, QSPI или параллельной).
  • key store: Управляет доступом к безопасному хранению ключей (eFUSE, BBRAM, PUF). Может включать в себя процедуру раскрутки ключа, если сохраненный ключ зашифрован под ключом мастера.
  • error handler: Собирает коды ошибок, управляет светодиодами или значками состояния и управляет обратным эффектом к золотому изображению (если реализовано).

Каждый модуль должен иметь четко определенный интерфейс с использованием VHDL-записей или массивов для объединения линий управления и данных. Например, крипто-оболочка может иметь входной «старт», поток «data in», выход «ack» и выход «digest». Используйте «pragma» или «синтез translate off/on» только для тестового кода, никогда в синтезе.

Finite State Machine (FSM) для сапоги

Контроллер загрузки FSM является сердцем загрузчика. Типичная последовательность состояния:

  1. IDLE: Ждите сигнала перезагрузки с включением питания для дезассертирования.
  2. INIT: Инициализируйте интерфейс памяти, установите разделители часов и настройте криптоядра. Ждите готовых сигналов.
  3. GET KEY: Прочитайте открытый ключ или корневой ключ из безопасного хранилища. Если поиск ключа не удался, перейдите в состояние FAIL.
  4. READ HEADER: Прочитайте заголовок прошивки из внешней памяти. Заголовок содержит длину прошивки, версию, подпись и необязательные метаданные. Проверить заголовок CRC.
  5. LOAD AND HASH: Поток изображения прошивки в ядро SHA-256 при одновременном хранении его в памяти конфигурации (или буферизации). Это можно сделать параллельно, если позволяет пропускная способность памяти. Используйте буфер пинг-понга, чтобы избежать задержек.
  6. ВЕРИФИЯ: После вычисления дайджеста SHA-256 инициируйте операцию проверки ECDSA с сохраненным открытым ключом и подписью из заголовка.
  7. LOAD OK: Если проверка проходит, сигнал на логику конфигурации FPGA для загрузки битового потока из буфера (или из внешнего местоположения вспышки, подтвержденного как действительное).
  8. FIL: Если проверка не удалась или обнаружена какая-либо ошибка, введите безопасное состояние. Необязательно повторите попытку с золотым изображением (если доступно). Если нет золотого изображения, удерживайте устройство в сбросе и установите пин-код оповещения. Некоторые системы могут разрешить режим восстановления через JTAG.

Внедрить этот FSM с помощью одного процесса с использованием двух (state, next state) и комбинаторных выходов. Используйте синхронную перезагрузку для обеспечения детерминированного запуска. Защитите FSM от незаконных государств, используя случай по умолчанию, который сбрасывает в IDLE. Для TMR, реплицируйте FSM три раза и подавайте каждый государственный реестр избирателю.

Управление ключами в VHDL

Обработка криптографических ключей в VHDL требует крайней осторожности. Ключевые данные никогда не должны появляться в простом тексте за пределами назначенного безопасного модуля. Рекомендации:

  • Используйте отдельный изолированный модуль для хранения ключей. Остальная часть загрузчика получает доступ к ключу только через выделенный интерфейс, который возвращает готовый сигнал. Ключ передается в криптоядро через внутренний регистр, который очищается после использования.
  • Никогда не комментируйте и не записывайте значения ключей. В моделировании используйте зашифрованные скамейки тестирования или избегайте печати переменных ключей.
  • Если ключи хранятся в eFUSE или BBRAM, код VHDL должен использовать примитивы поставщиков, которые отображаются непосредственно на аппаратное обеспечение. Не реализуйте пользовательские декодеры, которые можно было бы наблюдать.
  • Для ключей на основе PUF включите логику обработки данных помощника (например, код коррекции ошибок) в модуле key store. Выход PUF эфемерный; загрузчик должен каждый раз регенерировать ключ.
  • Рассмотрите возможность использования одноразового программируемого предохранителя управления для блокировки JTAG или отладки доступа после программирования ключа, предотвращая считывание ключа через тестовый порт.

Обработка ошибок и их восстановление

Для безопасного загрузчика необходимо обеспечить надежное устранение ошибок.

  • Память ECC: Если внешняя вспышка использует ECC, загрузчик должен проверить и исправить однобитные ошибки и сообщить о многобитных ошибках.
  • Счетчики тайм-аута: Для каждой криптооперации устанавливают тайм-аут. Если ядро не возвращает результат в заданное окно (например, из-за SEU или сбоя), сигнализируют об ошибке.
  • Необходимая проверка: Необязательно дважды проверить прошивку (с двумя различными хеш-функциями или двумя ключами) для победы над определенными атаками по боковым каналам.
  • Безопасное состояние: При постоянном отказе загрузчик должен заблокировать FPGA, возможно, отключив все выходы и не загрузив какую-либо логику пользователя. Это предотвращает выполнение злоумышленником даже частичного битового потока.

Внедряйте коды ошибок, которые можно прочитать через тестовый порт доступа (если позволяет безопасность) или написать в энергонезависимый регистр для последующего анализа. Однако будьте осторожны, чтобы не утечка криптографической информации через сообщения об ошибках.

Лучшие практики и советы по безопасности для FPGA Secure Bootloaders

Помимо внедрения VHDL, следующие методы повышают безопасность.

Используйте аппаратно-ускоренную криптографию

Мягкие реализации SHA-256 или ECDSA в LUT и flip-flops медленнее и более восприимчивы к утечке по боковым каналам (нажатие, мощность). Где доступно, мгновенно затвердевают криптодвижки. Например, Xilinx Vivado обеспечивает ядро AES-GCM , которое работает со скоростью до 100 Гбит/с. Использование таких ядер снижает использование LUT и увеличивает пропускную способность. Даже если криптография мягкая, использование выделенного среза DSP для умножения ускоряет операции ECC.

Ключевые ротации и управление жизненным циклом

Безопасные загрузчики должны поддерживать обновление открытого ключа без ущерба для корня доверия. Один из методов: хранение цепочки сертификатов во внешней вспышке. Загрузчик проверяет подпись прошивки с помощью текущего открытого ключа, но также проверяет подписанный ключ обновления blob, который может заменить открытый ключ. Обновление должно быть подписано оригинальным закрытым ключом. Это требует дополнительной логики VHDL для анализа сертификатов и проверки цепочки, но позволяет обновлять поле загрузочного ключа.

Меры физической безопасности

FPGA в неблагоприятных условиях (например, в автомобильной, аэрокосмической) нуждаются в защите от физических атак.

  • Обнаружение антитампера: Используйте датчики температуры и напряжения на чипе FPGA (например, SYSMON) для обнаружения попыток охлаждения или вставки сбоев. Загрузчик может считывать эти датчики, прежде чем включить криптоядро.
  • Зашифрованный битовый поток: Даже если загрузчик безопасен, сам битовый поток должен быть зашифрован (например, AES-256) для предотвращения перехвата во время конфигурации. Большинство современных FPGA поддерживают зашифрованный битовый поток с ключом, хранящимся в eFUSE.
  • JTAG отключается: После производства отключите постоянный доступ JTAG через eFUSE. Если JTAG остается включенным, злоумышленник может полностью обойти загрузчик.
  • Щит и сетка для взлома: Для приложений с высокой безопасностью рассмотрите физическое экранирование печатной платы и использование FPGA с решеткой, реагирующей на несанкционированное вмешательство, которая обнуляет ключи при обнаружении несанкционированного доступа.

Соблюдение стандартов

В зависимости от домена приложения загрузчику может потребоваться соблюдать стандарты безопасности:

  • NIST SP 800-193 (Устойчивость к программному обеспечению платформы): определяет руководящие принципы для защищенной загрузки, обновления и восстановления. Загрузчик должен быть способен проверять обновления прошивки и восстанавливаться после несанкционированных изменений.
  • FIPS 140-2/140-3 (Валидация криптомодуля): Если загрузчик выполняет криптографические операции, может потребоваться валидация всей последовательности. Используйте сертифицированные NIST криптоядра (например, из списка CMVP).
  • IEC 62443 (Безопасность промышленных сетей связи): Требуется безопасная загрузка для предотвращения несанкционированной загрузки прошивки в программируемых логических контроллерах (ПЛК).
  • DO-254 (Уровень обеспечения проектирования бортовых систем): Для авионики загрузчик должен быть разработан с помощью строгой проверки и формальных методов.

Документирование требований безопасности и методологии тестирования загрузчика имеет важное значение для сертификации. VHDL испытательные стенды должны включать кампании впрыска неисправностей (например, перелистывание битов в памяти или подписи), чтобы убедиться, что загрузчик правильно отклоняет подделанные изображения.

Тестирование и валидация

Тщательно протестируйте загрузчик в различных сценариях:

  • Функциональные тесты: Имитировать корректное изображение прошивки и подтвердить его загрузку. Имитировать недействительную подпись (бит перевернут) и подтвердить, что загрузчик входит в состояние FAIL. Проверить, что работает золотой запасной вариант изображения.
  • Закрытие времени: Убедитесь, что загрузчик соответствует времени на целевой частоте. Криптоядра часто имеют высокую задержку; проведите пути данных, чтобы избежать нарушений.
  • Поведение с перезагрузкой: Имитировать подключение питания с медленным временем подъема, шумом на линии сброса и нестабильными часами. Загрузчик должен оставаться стабильным.
  • SEU моделирование: Используйте инструменты впрыска неисправностей (например, Xilinx XSIM с API впрыска неисправностей) для переворачивания битов в машине состояния и счетчиках сторожевой собаки.
  • Оценка утечки по поперечным каналам: Проведите анализ мощности или измерения электромагнитного излучения на прототипе, чтобы гарантировать, что ключевые операции не утечка чувствительных данных.

Заключение

Внедрение безопасного загрузчика в VHDL для систем FPGA является многогранной инженерной задачей, которая требует внимания к криптографическим деталям, интеграции оборудования и отказоустойчивости. При закреплении процесса загрузки в аппаратном корне доверия, используя стандартные для отрасли механизмы аутентификации, такие как ECDSA, и проектируя надежные машины с конечным состоянием в VHDL, разработчики могут создать загрузчик, который сопротивляется подделке, атакам понижения и физическим угрозам. Модульный подход, описанный здесь, позволяет расширять расширяемость - добавляя поддержку безопасных обновлений, цепочку доверия с проверкой сертификатов и соблюдением стандартов, таких как NIST SP 800-193.

По мере роста внедрения FPGA в критической инфраструктуре безопасный загрузчик становится фундаментальным строительным блоком доверия. Инвестирование в его надлежащую конструкцию и проверку приносит дивиденды в безопасности и надежности системы. Будущие тенденции включают постквантовые криптографические алгоритмы (например, CRYSTALS-Dilithium), которые могут потребовать более сложных модулей VHDL, но принципы разделения, проверки и безопасности отказов останутся неизменными. Для тех, кто начинает новый проект, обратитесь к примечаниям поставщиков (например, ]Xilinx XAPP1343 ) и криптоядрам VHDL с открытым исходным кодом (например, OpenCores SHA-256 ) в качестве основы и всегда адаптируйте дизайн к конкретной модели угрозы целевой среды.