Защита Linux программ с помощью USB ключа

Opensource - это good, но у коммерческого ПО свои запросы. Посему иногда возникает необходимость слегка защитить написанное ПО от несанкционированного распространения. Все дискетки/старфорсы/чисто программные навороты - фтопку. Реальная защита - это кусочек уникального hardware, который распространяется вместе с софтиной и работает с ней как нераздельное целое. В данном проекте - это USB брелок с 50 MHZ ARM CPU, вся железяка обойдется в районе $5-$7 при сборке из деталей купленных на одесском радиобазаре. ARM процессор имеет встроенную флеш-память микропрограмм с аппаратной (на уровне заявленном производителем кристалла CPU) защитой от считывания. Процессор брелка в состоянии расшифровывать на лету, с приемлемой скоростью, выполняемый в основной софтине код. Сам брелок позволяет безопасно обновлять версию своего собственного firmware по USB с помощью встроенного крипто-бутлоадера (используется AES шифрование) - это позволяет, при необходимости, прозрачно upgrad'ить firmware ключа при поставке заказчику новых версий ПО. Процедура защиты коммерческого ПО весьма проста и состоит из следующих шагов :


  • пишем или берем уже написанную софтину

  • выделяем в ней ряд функций, которые хотим сделать в принципе недоступными для нелегального запуска

  • обрамляем эти функции wrapper'ами из libshield, компилируем софтину

  • генерим уникальный ключ для шифрования (прошивку)

  • шифруем софтину (ELF файл) данным ключом

  • прошиваем ответную часть ключа в брелки

 Имеем софтину, определенные функции которой, будут работать только при наличии в системе соответствующего ей USB брелка. Все функции, которые были выделены, находятся в защищаемой программе, включая ОЗУ, в зашифрованном состоянии. В момент вызова код посылается в ключ, он его пробует расшифровать, при удачной расшифровке выдает расшифрованный код - функция запускается. После запуска - память опять возвращается в первоначальное (зашифрованное состояние). Т.е. в любой момент времени расшифрован только кусочек программы, что предотвращает получение работоспособного слепка из ОЗУ при запущенной программе. Способ передачи кода в ключ нетривиален, что не дает возможности расшифровать вручную всю софтину при наличии одного  легального брелка, при условии конечно, что потенциальному исследователю будет известно количество и месторасположение защищенных функций в самой софтине. Весь обмен между брелком и программой состоит из неких случайных данных, в которых только часть представляет собой полезное содержание - т.е. при многократном запуске одной и той же функции USB трафик похож на белый шум. Firmware ключа имеет встроенную защиту от исследования - ключ уходит в длительный (5 мин.) shutdown при нарушении протокола обмена, сам факт нарушения сохраняется в non-volatile memory, что дает дополнительную информацию об использовании ПО. Таким образом, в случае более или менее грамотной защиты от reverse engineering'а (антиотладочные приемы, упаковка и шифрование основного тела программы и т.д.), можно получить некие гарантии в плане легальности использования коммерческого software.


 Вот один из возможных вариантов исполнения ключа, который применяется в готовой промышленной системе :


Image


 

 Конечно проект можно сколь угодно наворачивать в плане и повышения защиты от reversing'а и в плане усиления криптостойкости, что неизбежно приведет к его усложнению/удорожанию и т.д. и т.п.


Создано Harbour. Последнее изменение: Воскресенье 04 / Июль, 2010 14:14:09 EEST автор Harbour.

Последние сообщения блога

  1. Переезд, будь он неладен ...
    Вт 06 / Апр, 2010 18:44 EEST
  2. О трудах человеческих
    Вт 23 / Mar, 2010 19:22 EET
  3. Получаем root в SwitchVox
    Вт 23 / Mar, 2010 14:37 EET
  4. Из лекции Махараджа Шри Девдаса
    Сб 13 / Февр, 2010 12:56 EET
  5. Жизнь должна быть ...
    Пт 12 / Февр, 2010 15:49 EET
  6. Из Дао де Дзин
    Пт 12 / Февр, 2010 15:48 EET
  7. Из Дао де Дзин
    Пт 12 / Февр, 2010 15:48 EET