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. Команды, делающие это впервые, должны запланировать это в график разработки как отдельную часть работы, а не как что-то, что добавляется в конце – необратимость делает «добавить позже» дорогостоящим.