Предисловие

Так уж случилось, что из разработки железа и встроенного ПО я постепенно ушел в безопасность. А в дальнейшем и в пентест. Началось все с заказа на тогда еще существующем Хабр Фрилансе по чтению защищенной прошивки STM8, о методах найденных еще тогда я сегодня и расскажу. Таким образом я планирую написать цикл статей по безопасности и ее обходу.


Сразу извиняюсь за качество картинок. Было это давно и статью писать не планировалось.

Никакой безопасности не существует

Нет никакой защиты, есть только количество времени и знаний, необходимых для достижения цели.

Что за защита такая RDP? И зачем она нужна

Почти в любом микроконтроллере присутсвует защита от чтения прошивки. Решения достаточно отличаются в зависимости от архитектуры и фантазии разработчиков. Конкретно в серии STM8 и 32 это бит защиты RDP- Read Out Protection. Не буду повторятся, более подробно разжевано в другой статье на сайте.

А зачем оно нужно, думаю сами догадаетесь. В первую очередь- чтобы полную копию вашего устройства не начали делать в китайском подвале. Чтобы пользователь не мог что-то править, подлянские таймеры заложенного отказа например.

Методы обхода

Самый распространенный и относительно простой метод- атака по питанию. Нужно поймать момент когда бит защиты будет считыватся при инициализации. Суть заключатеся в том, чтобы ядро приняло 0 , который означает отсутствие защиты, даже если он записан 1 или 2.

При некотором знании аналоговой электроники, можно получить представление как интегральная схема работает на аналоговом уровне. Есть неткорое пороговое значение, ниже которого затвор транзистора в составе ячейки будет держать транзистор закрытым, потом идет линейный режим и полное открытие. Где-то на этом линейном режиме собственно и теряется полезная энергия в тепло во всей цифровой электронике.

Так вот если в момент чтения нужного нам бита уронить питание до примерно пороговых значений открытия транзистора- можно добится его неправильного значения.

Этот метод так-же используется например при обходе защит процессоров Nvidia Tegra, что позволяет на залоченных приставках Nintendo Switch запускать произвольный код и сторонние ОС.

Сложности реализации

Для ядра работающего на частоте 8мГц один такт будет длится 125 наносекунд, при 16мГц- уже 62 наносекунды. А если вспомнить переходные процессы, то нужный диапазон для атаки получается еще уже. Тайминги чтения нужного нам бита в конкретном случае лежат в районе 30-60 миллисекунд после ресета в зависимости от тактовой частоты. Получить эти тайминги можно логическим анализатором и цифровым осциллографом, а так-же изучив даташит на нашу цель.

На заднем фоне можно рассмотреть HabraTab!
На заднем фоне можно рассмотреть HabraTab!

В итоге нам нужно сгенерировать импульс максимально возможно контролиремый как по длительности, так и по таймингу. Нас интересует импульс длиной 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)


  1. VelocidadAbsurda
    07.01.2026 17:58

    Вопрос, на который внятного ответа «да» пока не встречал: STM RDP level 2 удалось победить?


    1. ENGIN33RRR Автор
      07.01.2026 17:58

      Вырастает сложность и время реализации конечно, нужно понизить до 1 уровня, и воспроизводить параметры атаки с попытками второго понижения. Метод был описан продавцами железки как раз для атких атак предназначенной- ChipWhisperer. Но что-то не нахожу странички. Включив воображение можно той-же атакой попытатся включить отладку например, что так-же дает определенный вектор для дальнейших атак.


      1. VelocidadAbsurda
        07.01.2026 17:58

        Саму идею «понизим до RDP 1 и сведём задачу к решённой» встречал не раз, но пока не видел ни одного подтверждения успеха уже за несколько лет. При том, что с обходами RDP 1 люди не особо стесняются и пишут об успехах открыто.


  1. GiveMeFreeNickName
    07.01.2026 17:58

    Не буду повторятся, более подробно разжевано в другой статье на сайте.

    Ссылка нерабочая


    1. ENGIN33RRR Автор
      07.01.2026 17:58

      Спасибо, поправил.


  1. ABRogov
    07.01.2026 17:58

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


    1. ENGIN33RRR Автор
      07.01.2026 17:58

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

      К тому-же я хотел рассказать в первую очередь про те моменты, которые в сети умалчивают, а именно- о важности уровня просадки.


    1. Fox_Alex
      07.01.2026 17:58

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


  1. IgorPie
    07.01.2026 17:58

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


    1. ENGIN33RRR Автор
      07.01.2026 17:58

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


  1. LevC
    07.01.2026 17:58

    Есть что интересное по взлому CPLD?


  1. 321785
    07.01.2026 17:58

    Flash Readout Protection (RDP) никак не может сокращаться до RDP, т.к. Readout - это одно слово.
    Логичнее сокращение FRP. И кстати в статье на которую ведёт ссылка такая же проблема с сокращениями.


    1. Kan_Timur
      07.01.2026 17:58

      Сокращение RDP сами STM используют


    1. HardWrMan
      07.01.2026 17:58

      Это терминология производителя. Она так упоминается во всех документах от ST.


  1. Klochko
    07.01.2026 17:58

    А если для атаки использовать ПЛИС? Алгоритм вроде бы не особо хитрый, а время реакции у ПЛИС куда лучше. Или не прокатит?