Предотвращение клонирования флэш-памяти

Нужен способ запретить кому-либо клонировать код с arduino. Без защиты его можно клонировать с помощью advdudees за 2 минуты. Я использую чип atmega328p на nano. В этом состоянии ардуино действует как рукопожатие для программы Windows, которую мне нужно защитить. В arduino нет ничего особенного или ценного, кроме пользовательского рукопожатия. Один arduino для одного файла .exe. Весь код arduino загружается из arduino ide.

Я провел исследование, и вот оно.

  1. Запирающие биты предохранителей. Как я понял, когда-то заблокированная флэш и eeprom не могут быть прочитаны. Когда они разблокированы, флеш и eeprom стираются. Мне нужен еще один ардуино, чтобы выступать в качестве программатора.
  2. Использовать какой-нибудь другой уникальный труднокопируемый модуль, например rfid-карту или mac-адрес bluetooth/wifi. Это плохо, потому что на nano требуется слишком много контактов.
  3. Аккуратно припаять 2 цифровых вывода и установить один на выход, а другой на вход. Если не подключен, разорвать петлю.
  4. Лицензия на аппаратный ключ Usb. Я понятия не имею, как его создать, и он кажется каким-то пережитком прошлого. Пользовательская файловая система или что-то в этом роде...

Я бы хотел сохранить arduino nano для развертывания.

Здесь нет никакого интернета. Если бы у программы был доступ к Интернету, я бы просто использовал базу данных.

Заранее спасибо.

, 👍3

Обсуждение

в чем заключается ваш вопрос? ... вы предоставили решение проблемы предотвращения копирования флэш-памяти ... рукопожатие может быть защищено только путем предотвращения физического доступа к ПК с Windows, @jsotola

Мне нужно знать, хороша ли эта идея и сработает ли она. У меня есть одна попытка все исправить. И если у кого-нибудь есть какие-нибудь лучшие решения., @gagicf2

Таким образом, вы разрабатываете свой собственный ключ защиты. Ну, почему бы вам просто не использовать проверенный продукт?, @the busybee

Обратите внимание, что устанавливать биты блокировки бессмысленно, пока установлен загрузчик Arduino. Загрузчик все еще может считывать программу, даже если установлены биты блокировки. Вам придется удалить загрузчик и загрузить код с помощью интерфейса ISP (ArduinoAsISP)., @Gerben

Вы можете сохранить идентификатор GUID в EEPROM, который соответствует идентификатору в скомпилированном файле. Скетч считывает EEPROM и сравнивает сохраненное значение, выходя, если они не совпадают. Для этого может потребоваться прошивка простого автономного скетча, который записывает EEPROM только перед прошивкой основной программы. Это не является квалифицированным доказательством хакеров, но это остановило бы работу неизмененного скетча в любом месте, кроме оригинального MCU., @dandavis


1 ответ


3

Использование предохранителей блокировки-это, безусловно, правильный шаг здесь. Разблокировка не является проблемой, так как на этом этапе память будет стерта, и вы все равно не сможете предотвратить повторную запись.


Очень важная заметка от Гербена в комментариях:

Обратите внимание, что устанавливать биты блокировки бессмысленно, пока установлен загрузчик Arduino. Загрузчик все еще может считывать программу, даже если установлены биты блокировки. Вам придется удалить загрузчик и загрузить код с помощью интерфейса ISP (ArduinoAsISP).

Биты блокировки работают только для интерфейса ISP, который можно использовать для программирования Arduino. Загрузчик (который является частью программы на Arduino) все еще может считывать память программы (он должен, так как он выполняется оттуда). Таким образом, чтобы кто-то не смог прочитать программу через загрузчик, вам нужно удалить загрузчик. Программирование выполняется так же, как вы устанавливаете предохранители: через ISP (например, через второй Arduino).


Вы не включили детали в рукопожатие. Важным маршрутом атаки было бы просто обнюхать последовательный интерфейс ардуино. Если само ваше рукопожатие не зашифровано, блокировка Arduino не помешает злоумышленникам получить его.

Существуют библиотеки шифрования для Arduino (как эта на github). Основываясь на вашей модели потока и необходимых ресурсах (поскольку Uno довольно ограничен, особенно в оперативной памяти), вы можете выбрать подходящую библиотеку и подходящий алгоритм шифрования. Одним из важных путей атаки может быть повторная атака, когда злоумышленник просто повторно отправляет серийные данные, которые он записал в последней успешной передаче. Одним из способов предотвратить это был бы скользящий код (как часто используют современные открыватели гаражных ворот). Или вы можете создать Одноразовые пароли (например, объединив секрет рукопожатия с меткой времени и зашифровав/хэшировав это; для этого вам нужно синхронизированное время).

,

Рукопожатие работает, отправляя 4 ввода, жестко закодированных в файле .exe. Эти 4 ввода жестко закодированы на arduino, он подключается, если они совпадают. Перед отправкой я выполняю некоторые основные математические операции и переворачиваю их на arduino. Затем я отправляю несколько случайных чисел, делаю некоторые вычисления ℅ 6 = вкл. Один байт-это одна команда, поэтому я увеличиваю командные байты с обеих сторон с помощью inc. Каждый раз, когда arduino подключается, байты команд отличаются. Если бы злоумышленник только вынюхивал данные, он получил бы случайные числа и ему нужно было бы найти закономерность и выполнить математические операции с обратным двигателем., @gagicf2

@gagicf2 Это лучше, чем передача простого секрета, хотя и не невозможно перепроектировать шаблон. Я думаю, что с помощью ряда обнюханных передач можно было бы провести статистический анализ и угадать закономерность. Хотя, как уже говорилось, все сводится к вашей потоковой модели. Вы можете решить, что этого уровня безопасности достаточно., @chrisl

Вместо отправки секрета (даже скрытого) сгенерируйте случайное значение и отправьте его вместо этого. Arduino хэширует сохраненный секрет, связанный с входящим nonce, и возвращает этот хэш компьютеру, который сам выполняет те же действия (EXE знает секрет) и сравнивает два хэша для проверки. В этой роли вы даже можете использовать что-то криптографически слабое, но дешевое, например sha1 или даже md5, если ваш nonce длиннее 16 символов, или 24, или 32, что вам нужно для сна. Крошечные автономные хэш-функции лучше вписываются в микроконтроллеры, чем целая библиотека криптоинструментов, которые вам не нужны., @dandavis