Бреши в устройствах не всегда можно закрыть, в отличие от уязвимостей в софте. Однако это не повод для фрустрации! Исследовать безопасность IoT, телефонов, планшетов, блоков управления и т. д. все равно нужно. По крайней мере, можно предупредить пользователей об уязвимостях, а также устранить недостатки в новых версиях продуктов. Мы с командой покопались в одном из самых популярных отладчиков для микроконтроллеров — J-Link. В результате нашли уязвимости в его системе лицензирования, которые позволяют за несколько секунд превратить бюджетную версию устройства в дорогую.  J-Link — один из самых популярных отладчиков для микроконтроллеров среди разработчиков, любителей, энтузиастов и специалистов по кибербезопасности.  Вот его преимущества: огромный перечень поддерживаемых микроконтроллеров и процессорных ядер, поддержка всех распространенных протоколов отладки, высокая скорость работы, отличный бесплатный софт. Производитель J-Link — компания SEGGER, которая выпускает свой флагманский продукт уже более 15 лет и за это время в полной мере столкнулась с проблемой контрафакта. Разные торговые площадки наполнены предложениями о продаже клонов по невысокой в сравнении с оригиналом цене. Но большинство подделок копируют старые версии J-Link — v8, v9 и старше. Вероятно, разработчики SEGGER использовали накопленный опыт борьбы с контрафактом и в новых версиях, v10 и v11, реализовали более надежные методы защиты от копирования. Именно их мы и решили изучить. J-Link — это не один программатор, а целая линейка продуктов, которые различаются по техническим характеристикам и доступным функциям. Набор функций определяется лицензиями, которые могут быть встроены либо приобретены на сайте производителя. J-Link BASE Набор встроенных лицензий в этой модели ограничен лишь основными функциями. J-Link PLUS  Эта модель имеет расширенный набор встроенных лицензий, который открывает доступ ко всем функциям ПО и технологиям вендора.  J-Link PRO У этой модели, как и у PLUS, есть полный набор встроенных лицензий.  J-Link PRO: способна работать на более высоких скоростях; имеет Ethernet-порт; функционирует на основе другого микроконтроллера и имеет встроенную программируемую логическую интегральную схему (ПЛИС). J-Link EDU Самая младшая модель, предназначенная для некоммерческого использования. Продается без технической поддержки. Доступные в ней функции совпадают с функциями J-Link BASE. Перед каждым использованием нужно соглашаться с Terms of Use (рис. 1). На самом деле J-Link EDU, J-Link BASE и J-Link PLUS — это одно и то же устройство: схемотехника, компонентная база и прошивка ничем не отличаются. В каждой из моделей меняется только набор встроенных лицензий. В этой статье рассмотрим J-Link EDU v10, хотя все найденные недостатки распространяются на EDU, BASE, PLUS v10 и v11.  Анализ защищенности любого программно-аппаратного комплекса начинать нужно с модели злоумышленника. В случае с J-Link она довольно интересна. Постепенно изучая устройство, мы поняли, что механизмы защиты направлены на предотвращение единственного сценария: клон устройства работает с оригинальными софтом и прошивкой и продолжает работать даже после обновления на новые версии ПО. Внимание вендора сосредоточено на предотвращении массового клонирования устройств и создания фейков, которые софт вендора не сможет отличить и заблокировать при последующих обновлениях. А защита от конкретных недобросовестных пользователей, готовых работать с фиксированными взломанными версиями ПО, выходит из фокуса. В этом есть смысл, ведь SEGGER продает только сами устройства, а софт с обновлениями предоставляет бесплатно. Со своей главной задачей — предотвращением клонирования — механизмы защиты справляются успешно. По крайней мере, в процессе исследования мы не нашли уязвимостей, которые позволили бы создавать фейки, работающие с оригинальной прошивкой и ПО. Однако обнаружились бреши, позволяющие обойти некоторые механизмы лицензирования.  Разобрав устройство (рис. 2), мы обнаружили микроконтроллер NXP LPC4322, который реализует всю низкоуровневую логику, хранит встроенные лицензии и управляется с ПК по USB-интерфейсу. На плате есть отладочный интерфейс — вероятно, он используется для начальной прошивки устройства на заводе. Но подключиться с его помощью к микроконтроллеру и сдампить прошивку не получится, так как интерфейс заблокирован. Разумеется, это сделано намеренно и выступает ограничительной мерой для тех, кто решил залезть в устройство. Итак, мы выяснили, что просто считать прошивку с устройства через отладочный разъем не получится. После изучения софта вендора для ПК стало ясно, что можно получить дамп прошивки через процедуру обновления J-Link по USB — обычно после установки новой версии софта и подключения устройства появляется диалоговое окно с предложением обновить его. Также можно принудительно перезаписать прошивку с помощью команды InvalidateFW. Если провести одну из этих процедур и параллельно записать USB-трафик, то можно увидеть, что новая прошивка передается в незашифрованном виде. Однако обнаружить эти данные в том же виде в директории с софтом не удастся: прошивки хранятся в зашифрованных файлах, а в более ранних версиях софта прошивки хранились в сжатом виде в JLinkARM.dll. Полученный дамп открывает возможности для обратной разработки и исследования. После поверхностного анализа стало понятно, что разработчики разделили флеш-память MK LPC4322 на три части: Номер Область Тип Описание 1 0x1A000000 — 0x1A005E00 Загрузчик Проверяет подпись основной прошивки и отвечает за ее обновление. Сам загрузчик прошивается на заводе и никогда не обновляется 2 0x1A005E00 — 0x1A008000  Область конфигурации Содержит серийный номер, OEM-строку, встроенные лицензии, цифровую подпись и настройки устройства 3 0x1A008000 — 0x1A080000 Основная прошивка Реализует основную функциональность устройства, может обновляться из управляющего софта с ПК. Имеет цифровую подпись, которая должна защищать прошивку от внесения изменений Область конфигурации можно увидеть на скрине (рис. 3). Вот как основная прошивка и софт на ПК проверяют, что работают с лицензионным устройством: После старта прошивка считывает серийный номер устройства, уникальный ID микроконтроллера и проверяет цифровую подпись RSASSA-PSS(SHA1(serial_number + uniq_chip_ID)). Если серийный номер устройства и сама подпись хранятся во флеш-памяти, то уникальный ID записывается производителем микроконтроллера (NXP) при их производстве и не может быть изменен. Все MK LPC4322 имеют собственные уникальные ID, перезаписать их нельзя. То есть не получится взять серийный номер и подпись одного лицензионного устройства J-Link и наделать его клонов. Софт на ПК проверяет ту же цифровую подпись устройства, предварительно запросив уникальный ID микроконтроллера с помощью специальной команды. Разумеется, можно обойти эту проверку, запатчив ее в оригинальной прошивке, но такие клоны потеряют работоспособность после первого обновления. Мы разобрались, что защита от копирования занимается лишь вопросом отделения лицензионных устройств от клонов. Осталось выяснить, как лицензионные устройства на базе одной и той же платформы различаются между собой со стороны управляющего софта на ПК. Оказалось, что для этого используются OEM-строка и набор встроенных лицензий. Например, для J-Link EDU используются OEM-строка SEGGER-EDU и лицензии FlashBP и GDB, а у J-Link PLUS OEM-строка пустая и следующий набор лицензий: RDI, FlashBP, FlashDL, JFlash и GDB. После подключения J-Link к ПК софт запрашивает цифровую подпись устройства. Если она валидна, то OEM-строка и список лицензий, которые устройство отдает, считаются доверенными. Ошибка 1. OEM-строка и список встроенных лицензий не имеют криптографической подписи и не привязаны каким-либо образом к серийному номеру устройства. Если перезаписать эти данные, то можно легко переделать J-Link EDU в J-Link PLUS. OEM-строка и список лицензий хранятся во флеш-памяти в области конфигурации. В отличие от уникального ID микроконтроллера, эту память можно изменить. Один из способов перезаписи, который приходит в голову: каким-либо образом получить дамп флеш-памяти, внести свои изменения, а затем, используя встроенные команды ISP в BootROM LPC4322 и интерфейс UART, стереть флеш-память и записать новый дамп. Но для этого потребуется как минимум разобрать устройство. Можно пойти и другим путем. После нескольких экспериментов с процедурой обновления и попытками внести в нее изменения стало ясно, что прошивка имеет цифровую подпись, которая проверяется на стороне устройства его загрузчиком. Для проверки используется открытый ключ производителя, который должен защищать от внесения изменений. Но существует команда принудительного обновления прошивки InvalidateFW, которая работает довольно интересным образом. В процессе ее выполнения на устройство загружается прошивка, где изменяется ASCII-строка с датой компиляции. Например, строка compiled Mar 21 2019 меняется на compiled MAR 21 2019. При повторном подключении к ПК и запросе версии прошивки такая строка считается некорректной датой, и прошивка обновляется до версии, которая идет в комплекте с софтом вендора. Это сделано для возможности отката на старую версию прошивки при проблемах после обновления. Интересно здесь то, что такой дамп с некорректной датой успешно проходит проверку подписи загрузчика и запускается на выполнение. Оказалось, первые 0x1A0 байт прошивки не подписываются и не проверяются загрузчиком. Но ведь именно эта область — наиболее важная часть прошивки, поскольку в ней лежат векторы прерываний, в том числе reset-вектор, указывающий, с какой инструкции начинать выполнение кода (рис. 4). Ошибка 2. Частичное покрытие прошивки цифровой подписью дает возможность выполнять произвольный код на устройстве. Используя эту брешь, можно легко запустить собственный код, который изменит OEM-строку и набор лицензий. В качестве демонстрации мы подготовили скрипт, который за несколько секунд превращает J-Link EDU в J-Link PLUS. Публиковать его не будем, чтобы не поддерживать пиратство. В качестве резюме по обнаруженным ошибкам хочется отметить, что это не классические уязвимости с порчей памяти, а скорее архитектурные недостатки. Исправить такие ошибки выпуском обновления гораздо сложнее, ведь нужно переделать существующую логику работы устройства. А иногда и вовсе невозможно, так как из-за этого нарушится обратная совместимость.  Следующие особенности делают эти недостатки удобными для пиратства со стороны пользователей: для эксплуатации не требуется разбирать или паять устройство — достаточно ПК с USB-интерфейсом; устройство продолжает работать с оригинальными загрузчиком и прошивкой; устройство продолжает получать обновления прошивки и распознаваться как оригинальное (исправлено с версии софта v7.58); подмену лицензий необходимо провести лишь один раз; устройство можно вернуть в исходное состояние в любой момент и без следов модификации. Завершив исследование, мы связались с компанией SEGGER и сообщили об обнаруженных недостатках. В процессе обсуждения мы руководствовались политикой ответственного раскрытия уязвимостей. Представители вендора сразу вступили в диалог, быстро подготовили и выпустили релиз софта, который частично исправляет обнаруженные ошибки.  Таймлайн: 25 октября 2021 г. — сообщили о найденных недостатках в SEGGER через форму технической поддержки. После запроса передали технические детали и PoC для демонстрации ошибок. 28 октября 2021 г. — представители SEGGER подтвердили наличие ошибок. 1 ноября 2021 г. — представители SEGGER сообщили, что идет подготовка новой версии софта, которая будет включать частичные исправления. 5 ноября 2021 г. — вышел релиз софта v7.58 с частичными исправлениями. Дальше началась жизнь после ошибок. Вот как мы резюмировали внесенные изменения после поверхностного анализа нового релиза v7.58 и общения с вендором.  Ошибка 1, отсутствие подписи лицензий, частично устранена. В новых версиях софта проверяется список встроенных лицензий на основе модели устройства: EDU, BASE и т. д. Модель устройства определяется по серийному номеру. Например, если серийный номер начинается с цифр 26 (J-Link EDU) и среди встроенных лицензий обнаружена JFlash, то устройство считается контрафактным. Версии софта до v7.58 по-прежнему будут воспринимать устройство как лицензионное. Ошибка 2, произвольное выполнение кода, не исправлена, причем исправление не планируется в обновлениях для v10 и v11. Чтобы устранить ее, потребуется перезаписать загрузчик в уже выпущенных устройствах, которые находятся у пользователей. Такое себе удовольствие: много рисков, к тому же это сломает обратную совместимость с предыдущими версиями софта. Загрузчик с исправлениями, по информации SEGGER, будет реализован только в новых версиях отладчика. Вот что может случиться из-за проблем в механизмах безопасности пользовательских устройств.  Это сильно бьет по карману производителя. Простой способ обойти систему лицензирования, который не требует разбора устройства, понравится многим пользователям. Ведь J-Link PLUS примерно в 10 раз дороже J-Link EDU. В этом случае сложно представить, что кто-то будет внедрять вредоносный код в прошивку отладчика. Тем не менее пример некорректной реализации проверки подписи прошивки очень показателен, поскольку такие ошибки позволяют внедрять вредоносный код в различные устройства, пока они находятся на пути к конечному пользователю. Корректно реализовать механизмы защиты непросто даже для инженеров с большим опытом работы. Важно исследовать функции безопасности не только внутренними силами разработчиков, но и с привлечением внешних экспертов. Взгляд со стороны точно не помешает.  Благодаря анализу архитектуры и исходного кода устройства получится найти уязвимости еще на стадии проектирования, когда ошибки исправить проще и дешевле. В отличие от софта, далеко не все уязвимости встраиваемых систем можно исправить, выпустив обновление. Некоторые из них останутся жить в устройстве на протяжении всего срока его эксплуатации. Семь раз проверь — один раз выкати на прод😊