Сегодня сложно найти разработчика популярного программного обеспечения (ПО), который бы не сталкивался с пиратством по отношению к собственным коммерческим программным продуктам, даже если они защищены современными электронными ключами, - ведь для профессиональных взломщиков не составляет большого труда создать программную эмуляцию работы подобных ключей.
Это приводит к тому, что потребитель закупает одну копию программы, а затем использует ее на неограниченном количестве рабочих мест при помощи эмулятора. Или осуществляет покупку самой младшей, практически демонстрационной, версии, а после "расширяет" ее до полнофункциональной.
Основной проблемой производителей ПО является не только непрофессиональный подход к разработке системы защиты, но и слабость большинства используемых аппаратных средств. Использование электронных ключей как хранилища лицензионной информации, зачастую даже не имеющего защиты от внесения несанкционированных изменений, - вот один из основных способов их применения, остающийся неизменным уже более 10 лет. В лучшем случае, алгоритм работы такого электронного устройства будет включать в себя функции шифрования, большинство из которых давно общеизвестно и используется при создании программных эмуляторов.
Однако существуют и более интересные и надежные методы защиты от исследования и модификации программ злоумышленниками. Одним из них является использование электронных ключей, имеющих возможность выполнять часть функций, созданных самим разработчиком, в защищенном от изучения и изменения пространстве - внутри самого ключа. Идея эта совсем не нова - первые упоминания о подобных устройствах встречаются в разработках, датированных еще 1977 годом.
С точки зрения разработчика программ, процесс защиты в данном случае делится на следующие этапы:
1. Анализ разрабатываемой программы и выделение таких функциональных блоков, без которых корректное выполнение программы будет невозможно (рис. 1).
рисунок 1.
В данном (крайне упрощенном!) случае, для выноса в ключ выделяется функция calculation().
рисунок 2.
2. В выделенной функции calculation() производятся все необходимые изменения для обеспечения ее работоспособности в электронном ключе. Далее она компилируется в бинарный код используемого в ключе процессора или любой другой, который может исполняться или эмулироваться внутри, и помещается в ключ.
3. Разработчик помещает полученный код и все необходимые данные в энергонезависимую память электронного ключа. При необходимости производится инициализация защиты ключа или любое другое ограничение прав доступа к нему для предотвращения несанкционированного доступа к информации или внесения любых несанкционированных изменений.
4. Последний шаг - замена выделенных блоков на функции вызова электронного ключа с соответствующими параметрами.
Как видно из примера (рис. 2), подобная процедура не представляет особой сложности, но необходимо отнестись очень внимательно к выбору выносимых в ключ функций. Не стоить использовать слишком простые алгоритмы, о сути которых можно догадаться из передаваемых и получаемых данных, а также алгоритмы, имеющие слишком малое количество вариантов передаваемых значений. В первом случае взломщик сможет воссоздать алгоритм, а во втором - создать табличный эмулятор, содержащий в себе все передаваемые в функцию запросы и соответствующие им ответы.
Выноситься в ключ может не одна функция - их количество и размер ограничиваются лишь фантазией разработчика, а также объемом доступной памяти устройства.
Общая техническая схема электронных ключей с возможностью выполнения кода (рис. 3).
рисунок 3.
- Интерфейс связи - обеспечивает информационный обмен электронного ключа с любым устройством, к которому он может быть подключен;
- Процессор - реализует функцию выполнения кода, хранящегося в энергонезависимой памяти ключа;
- ОЗУ - оперативное запоминающее устройство, предназначено для хранения переменных, стэка, организации буферов обмена данными;
- Энергонезависимая память - предназначена для хранения программного кода и данных, которые необходимо скрыть от злоумышленника;
- Часы реального времени - служат для предоставления дополнительных функций электронного ключа, таких как создание временных лицензий;
- Элемент питания - батарейка, обеспечивающая непрерывную работу часов реального времени.
В зависимости от модификаций устройства и используемой элементной базы, реальная схема может несколько отличаться от приведенной. Например, могут отсутствовать часы реального времени, присутствовать дополнительный интерфейс программирования или отладки, различные типы энергонезависимой памяти, RFID-метки, светодиодные индикаторы, некоторые модули могут быть объединены в один (процессор + ОЗУ + ПЗУ). Также могут быть использованы специальные средства защиты тех или иных модулей ключа и шин обмена данными.
Существуют модификации, когда электронный ключ может не использовать энергонезависимую память для хранения, а получать код пользователя в зашифрованном виде, производить расшифровку, делать контрольную проверку целостности данных и непосредственно запускать полученный код. Это позволяет использовать набор функций, превосходящий по объему доступную в устройстве память.
Электронные ключи можно разделить на 3 вида по типу используемых микроконтроллеров:
1. Микроконтроллеры известных производителей. Подобные решения не обеспечивают программному продукту высокой степени защищенности ввиду широкой их распространенности и пристального изучения в лабораториях на предмет наличия тех или иных уязвимостей. Стоимость взлома подобных микроконтроллеров колеблется в пределах $500-5000.
2. Заказные микроконтроллеры, в том числе программируемые логические матрицы и т.п. Эти устройства обеспечивают более высокую защищенность, так как в случае взлома данного типа кристалла необходимо предварительно понять его топологию. Стоимость взлома микроконтроллеров обойдется заказчику в $5-20 тыс.
3. Микроконтроллеры, выполненные по технологии смарт-карт. Данный тип микроконтроллеров изначально был предназначен исключительно для защиты содержащихся в нем кода и данных. Они содержат максимальное количество механизмов, обеспечивающих защиту, таких как датчики света, системы шифрования шин информационного обмена, системы самодиагностики целостности топологии кристалла и т.п. Обычно стоимость взлома смарт-карт начинается от $50 тыс., и лаборатории не гарантируют успешного результата.
Тем не менее, несмотря на все указанные недостатки, вышеприведенные способы значительно повышают защищенность программного продукта по сравнению с общепринятыми методами.
Несмотря на то что в основном подобные устройства используются для защиты ПО, их область применения может быть значительно расширена благодаря возможности выполнения пользовательских программ внутри ключа. Например, на основе такого ключа можно реализовать полнофункциональный токен, организовать систему авторизации доступа к компьютерному устройству, создать систему хранения конфиденциальной информации (пароли, ключи и т.д.), и даже осуществлять контроль данных со стороны пользователя при игре в компьютерные азартные игры.