Статический анализ кода STM32: практический пример

Визуализация аппаратного ключа администратора
Визуализация аппаратного ключа администратора

Ниже представлен отчет о статическом анализе кода нашего аппаратного ключа администратора.

Приветствую, коллеги!

Хочу поделиться весьма специфическим опытом анализа исходного кода. Предвидя скепсис опытных инженеров: да, этот путь тернист и полон нюансов 😊

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

Решением стал аппаратный ключ администратора (АКА). Устройство разрывает USB-соединение между АРМ и контроллером, общаясь по свободным линиям с использованием протокола challenge-response. Общий секрет не передается напрямую, что делает перехват данных бессмысленным. Кому интересны технические детали реализации — готов обсудить в комментариях или личных сообщениях.

В условиях сжатых сроков разработку ключа доверили стажеру, который в качестве платформы выбрал «BluePill» на базе STM32. Несмотря на определенную «любительскую» репутацию этой связки, решение оказалось удивительно живучим: с момента внедрения не было зафиксировано ни одного сбоя. Да, использование Arduino для промышленных задач — решение спорное, но оно выполнило свою функцию.

Перейдем к сути — анализу кода. Заказчики потребовали верифицировать качество ПО, что стало для нас неожиданным вызовом. Мы рассчитывали, что наличие открытых исходников упростит задачу, но на деле возникли сложности.

Выбор инструментов для статического анализа был невелик: Cppcheck против PVS Studio. Последний — продукт мощный, но платный и ориентированный на глубокий поиск специфических ошибок, что в наших условиях казалось избыточным. Мы остановились на бесплатном Cppcheck.

Преимущества Cppcheck для нашей задачи:

  • Поддержка архитектуры ARM Cortex M.

  • Толерантность к нетипичному синтаксису, характерному для встраиваемых систем.

  • Автономность: для анализа не требуется процесс компиляции, достаточно исходного кода.

  • Эффективное обнаружение критических уязвимостей: разыменование неинициализированных указателей, выход за границы массивов, утечки памяти.

Однако просто просканировать папку проекта с Arduino IDE было недостаточно. Первая проблема заключается в специфическом «диалекте» Wiring, перегруженном макросами, которые анализатор не всегда распознает корректно.

Вторая сложность — пути к заголовочным файлам. При попытке проанализировать проект на рабочей машине IDE «подтянула» тысячи лишних зависимостей от других плат, превращая лог в бесконечный список. В итоге мы создали «чистую» среду разработки с минимальным набором библиотек, сократив количество путей до двух тысяч. Это значительно упростило жизнь.

В-третьих, необходимо использовать ключ `—platform=arm32-wchar_t4`, который задает корректные настройки для архитектуры Cortex-M.

И последнее: в ряде мест мы использовали директивы `// cppcheck-suppress`, чтобы исключить заведомо корректные, но запутанные для анализатора участки кода. Это эффективнее, чем тратить время на бесконечные споры с инструментом.

Итог анализа оказался продуктивным: Cppcheck выявил десяток реальных ошибок, которые мы успешно устранили. Примечательно, что все недочеты были в нашем коде — библиотеки из состава STM32Duino оказались вполне надежными.

Резюмируя: для серьезных, масштабных Embedded-проектов лучше использовать PVS Studio, но для локальных задач Cppcheck — вполне достойный и бесплатный инструмент.

Для наглядности прикладываю рендер обратной стороны устройства. Готов ответить на любые вопросы!

 

Источник

Читайте также