Предисловие
Так уж случилось, что из разработки железа и встроенного ПО я постепенно ушел в безопасность. А в дальнейшем и в пентест. Началось все с заказа на тогда еще существующем Хабр Фрилансе по чтению защищенной прошивки STM8, о методах найденных еще тогда я сегодня и расскажу. Таким образом я планирую написать цикл статей по безопасности и ее обходу.
Сразу извиняюсь за качество картинок. Было это давно и статью писать не планировалось.
Никакой безопасности не существует
Нет никакой защиты, есть только количество времени и знаний, необходимых для достижения цели.
Что за защита такая RDP? И зачем она нужна
Почти в любом микроконтроллере присутсвует защита от чтения прошивки. Решения достаточно отличаются в зависимости от архитектуры и фантазии разработчиков. Конкретно в серии STM8 и 32 это бит защиты RDP- Read Out Protection. Не буду повторятся, более подробно разжевано в другой статье на сайте.
А зачем оно нужно, думаю сами догадаетесь. В первую очередь- чтобы полную копию вашего устройства не начали делать в китайском подвале. Чтобы пользователь не мог что-то править, подлянские таймеры заложенного отказа например.
Методы обхода
Самый распространенный и относительно простой метод- атака по питанию. Нужно поймать момент когда бит защиты будет считыватся при инициализации. Суть заключатеся в том, чтобы ядро приняло 0 , который означает отсутствие защиты, даже если он записан 1 или 2.
При некотором знании аналоговой электроники, можно получить представление как интегральная схема работает на аналоговом уровне. Есть неткорое пороговое значение, ниже которого затвор транзистора в составе ячейки будет держать транзистор закрытым, потом идет линейный режим и полное открытие. Где-то на этом линейном режиме собственно и теряется полезная энергия в тепло во всей цифровой электронике.
Так вот если в момент чтения нужного нам бита уронить питание до примерно пороговых значений открытия транзистора- можно добится его неправильного значения.
Этот метод так-же используется например при обходе защит процессоров Nvidia Tegra, что позволяет на залоченных приставках Nintendo Switch запускать произвольный код и сторонние ОС.
Сложности реализации
Для ядра работающего на частоте 8мГц один такт будет длится 125 наносекунд, при 16мГц- уже 62 наносекунды. А если вспомнить переходные процессы, то нужный диапазон для атаки получается еще уже. Тайминги чтения нужного нам бита в конкретном случае лежат в районе 30-60 миллисекунд после ресета в зависимости от тактовой частоты. Получить эти тайминги можно логическим анализатором и цифровым осциллографом, а так-же изучив даташит на нашу цель.

В итоге нам нужно сгенерировать импульс максимально возможно контролиремый как по длительности, так и по таймингу. Нас интересует импульс длиной 10-100 наносекунд.
Собственно реализация
Прогуглив тему я попытался реализовать 2 модуля на NE555, первый формировал задержку от ресета, второй- длину импульса. Спойлер- это конечно же не сработало. Слишком большая неточность, недостаточно короткий импульс на выходе.
Из самого быстрого под рукой оказался STM32F401, имеющий тактовую частоту в 84мГц. Были попытки и на ESP32, но многоядерность и закрытое апи не позволили простыми способами добится потактового исполнения кода. Чего не скажешь о STM32, где простыми ассемблерными командами удалось получить задержку и длину импульса с точностью до такта.
void pulse(void) {
for (int i = 0; i <= DP; i++) {
asm("NOP");
}
GPIOB->ODR |= (1 << 1);
for (byte i = 0; i <= PW; i++) {
asm("NOP");
}
GPIOB->ODR &= ~(1 << 1);
for (int i = 0; i <= 10; i++) {
asm("NOP");
}
DP++;
if (DP >= 680) {
DP = 480;
PW++;
}
}
Да, ардуино иде. Вызываем прерывание по ресету целевого МК и считаем такты до событий.
Читаем используя утилиту STM8flash и STlink. С него же берем ресет на целевой МК и нашу атаку. Простой скрипт на python считывает прошивку, проверят не нули ли она отдала, если да- повторяем, если нет- бинго! Для контроля- осциллограф. На фоне можно рассмотреть триггер по ресету на втором канале и собственно импульс просадки питания.

Небольшие секреты
Если у вас достаточно терпения и смекалки, и вы хотите заняся этим неблагородным делом- есть небольшие секреты для достижения успеха.
Успешная атака возможна только при знании аналоговой электроники. Те, у кого может и получалось- использовали большой мощный мосфет для просадки питания. Управляли они ими естественно логическим уровнем, и открывался он далеко не полностью. Меня такой расклад конечно не удовлетворяет. На фото выше можно заметить небольшую самодельную плату и большие резисторы. Я пошел по пути полного контроля величины импульса. Используя небольшие мосфеты типа AO, которые полностью открываются от лог уровня. Далее подбор резистивного делителя- питание на целевой МК через резистор и замыкание питания тоже через резистор. Это позволило точно задавать уровень падения напряжения во время атаки. Если уронить напряжение слишком сильно- это приведет к перезагрузке ядра. Если слишком слабо- не получим эффект.
И не забудьте- один такой упешный взлом это в среднем несколько дней такого вот железного брутфорса. Изменение некоторых параметров, таких как длина и тайминг импульса- можно автоматизировать. Уровень просадки автоматизировать тоже можно, но это займет некоторое время на разработку железки.
С вас плюсики, с меня- еще интересных статей по взлому чего угодно.
Любые вопросы в телегу @engin33rrr
Комментарии (15)

GiveMeFreeNickName
07.01.2026 17:58Не буду повторятся, более подробно разжевано в другой статье на сайте.
Ссылка нерабочая

ABRogov
07.01.2026 17:58Вроде эта тема уже всплывала тут много раз. Все это работает на древних ядрах. Что на счет М4? Там rdp имеет 8 разрядов и еще оин комплиментарный байт. Долго но не невозможно?)))

ENGIN33RRR Автор
07.01.2026 17:58Ломать палкой танк никто не будет. Описанный мной метод хорошо работает в первую очередь с STM8. Для более сложных архитектур есть другие методы, которые хорошо описаны, к примеру https://www.usenix.org/system/files/woot20-paper-obermaier.pdf
К тому-же я хотел рассказать в первую очередь про те моменты, которые в сети умалчивают, а именно- о важности уровня просадки.

Fox_Alex
07.01.2026 17:58Такое уже наверняка быстрее ломать микрозондом или другими инвазивными способами.

IgorPie
07.01.2026 17:58а что, если целевой мк тактировать снаружи, вместо 8 МГц кварца дать 1 кГц тактовой, не проще пробить будет? или у stm8 тоже есть встроенный rc осциллятор и мк трогается с него?

ENGIN33RRR Автор
07.01.2026 17:58Смысл попасть импульсом во фронт такта. К тому-же чем меньше частота, тем дольше будет перебор, т.к. время инициализации возрастет.

321785
07.01.2026 17:58Flash Readout Protection (RDP) никак не может сокращаться до RDP, т.к. Readout - это одно слово.
Логичнее сокращение FRP. И кстати в статье на которую ведёт ссылка такая же проблема с сокращениями.
HardWrMan
07.01.2026 17:58Это терминология производителя. Она так упоминается во всех документах от ST.


Klochko
07.01.2026 17:58А если для атаки использовать ПЛИС? Алгоритм вроде бы не особо хитрый, а время реакции у ПЛИС куда лучше. Или не прокатит?
VelocidadAbsurda
Вопрос, на который внятного ответа «да» пока не встречал: STM RDP level 2 удалось победить?
ENGIN33RRR Автор
Вырастает сложность и время реализации конечно, нужно понизить до 1 уровня, и воспроизводить параметры атаки с попытками второго понижения. Метод был описан продавцами железки как раз для атких атак предназначенной- ChipWhisperer. Но что-то не нахожу странички. Включив воображение можно той-же атакой попытатся включить отладку например, что так-же дает определенный вектор для дальнейших атак.
VelocidadAbsurda
Саму идею «понизим до RDP 1 и сведём задачу к решённой» встречал не раз, но пока не видел ни одного подтверждения успеха уже за несколько лет. При том, что с обходами RDP 1 люди не особо стесняются и пишут об успехах открыто.