14.3.4. Замечание о защите флеш-памяти от считывания

В исходном состоянии прошивка на поставляемой камере OpenMV может быть прочитана любым, кто имеет физический доступ к устройству. Злоумышленник, у которого камера в руках, может подключить SWD-зонд к отладочному разъёму, обратиться к отладочному интерфейсу MCU и выгрузить содержимое флеш-памяти – включая каждый замороженный модуль Python и содержимое раздела ROMFS. Стандартная прошивка OpenMV не включает защиту флеш-памяти от считывания по умолчанию.

Эта страница документирует это явно, чтобы команда, выпускающая продукт, понимала, на ком лежит ответственность.

14.3.4.1. Что камера делает по умолчанию

Загрузчик и среда выполнения камеры не включают никаких функций защиты от считывания базового MCU. Отладочный интерфейс остаётся открытым, флеш-память остаётся читаемой, а сборка работает так же, как на рабочем столе разработчика. Это правильное значение по умолчанию для аудитории учебника – камера, которая поставляется с включённой защитой от считывания, это камера, которую нельзя перепрошить через IDE, нельзя переустановить образ после неудачного развёртывания и нельзя спасти никому, кроме команды сборки.

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

14.3.4.2. Что делает команда продукта

Каждый производитель MCU предлагает механизм защиты от считывания. Детали различаются – битовые предохранители, одноразовые переходы жизненного цикла, подписанные образы флеш-памяти – но общая схема такова:

  • Специфичный для производителя бит (или набор битов) фиксируется в кремнии, обычно с помощью инструмента производителя, который в последний раз обращается к отладочному порту MCU.

  • После фиксации отладочный порт отказывается читать флеш-память. Камера по-прежнему загружается и выполняет приложение; она просто больше не раскрывает своё содержимое зонду.

  • Фиксация необратима. Нет способа вернуть камеру в отлаживаемое состояние, не уничтожив её.

Настройка этого специфична для MCU, и шаги зависят от защищаемой детали на камере. Справочное руководство производителя является источником истины; техподдержка производителя является каналом для правильного выполнения этого на производственной линии.

Это простая часть.

Трудная часть – закрыть все остальные пути, по которым злоумышленник может выполнить код на камере или прочитать, что делает приложение. Защита от считывания только предотвращает выгрузку флеш-памяти отладочным зондом. Камера всё ещё должна закрыть:

  • REPL MicroPython. REPL, подключённый по USB, принимает произвольный код Python. Защита от считывания этого не меняет. Сеанс REPL может читать RAM, вызывать функции, извлекать всё, что видит запущенное приложение – по сути, доступный REPL обходит всё, что даёт защита от считывания. Отключение доступа к REPL – это изменение в сборке прошивки, за которое отвечает команда продукта.

  • Загрузка скриптов из IDE. Путь IDE «запустить этот скрипт на камере» использует ту же поверхность USB-протокола, что и REPL. Закрытие REPL закрывает и это; оставление любого из них открытым оставляет канал произвольного выполнения кода в камеру.

  • Перехват точки входа из файловой системы. Уже закрыт, когда приложение поставляется через Заморозка скриптов в прошивку – среда выполнения разрешает замороженные boot.py и main.py до любой копии в файловой системе, поэтому ничто, помещённое во флеш-память или на SD, не может их переопределить. Эта защита бесплатна, как только приложение попадает в сборку.

  • Внешняя флеш-память на новых камерах. Камеры, которые хранят образ приложения во внешней флеш-памяти, помещают этот образ на чип, находящийся на виду на печатной плате; чип можно выпаять и прочитать напрямую с помощью готовых инструментов или прочитать на месте, прозондировав шину. Защита его требует включения встроенного аппаратного обеспечения, которое расшифровывает содержимое флеш-памяти во время чтения, генерации ключа шифрования, предоставления этого ключа камере и его необратимой записи в однократно программируемое хранилище MCU. Каждая из этих операций – отдельная одноразовая операция, и любая из них, выполненная неправильно на производственном устройстве, выводит это устройство из строя.

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

Почему значение по умолчанию открыто

Этот список также объясняет, почему стандартная прошивка OpenMV поставляется без включённой защиты от считывания. Камера с закрытым REPL, отключённой загрузкой скриптов из IDE и заблокированной прошивкой – это камера, на которой вообще нельзя вести разработку – рабочий процесс, который делает камеры OpenMV пригодными к использованию в первую очередь, просто исчез бы. Значение по умолчанию оставляет всё открытым; команда продукта выбирает, какие части закрыть на пути к выпускаемому устройству.

14.3.4.3. Что всё ещё даёт физический доступ

Даже с включённой защитой от считывания злоумышленник, держащий камеру, может сделать довольно много:

  • Воспроизвести сетевой трафик камеры, перехватив её выходные данные.

  • Наблюдать за её видимым поведением и сделать вывод о том, как она реагирует на входные данные.

  • В некоторых случаях восстановить секреты с помощью инъекции сбоев или атак по сторонним каналам, специализированных против защищённого MCU.

Защита от считывания повышает стоимость доступа к исходному коду приложения. Она не устраняет эту стоимость. «Физический доступ = компрометация» – это рабочее предположение, с которого должна начинаться проверка безопасности; механизм защиты лишь определяет, во сколько эта компрометация обходится по времени и оборудованию.

14.3.4.4. С чем поставляется прошивка OpenMV

Сводка, чтобы было конкретно:

  • Защита от считывания не включена по умолчанию.

  • В стандартной прошивке нет флага сборки, который её включает.

  • Нет API уровня приложения для вызова из MicroPython.

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