Подъем индустрии программного обеспечения продолжается: появляются новые продукты, растут объемы продаж, а значит — и доходы разработчиков. В этих условиях особенно велик соблазн отщипнуть кусочек от чужого «пирога», воспользовавшись брешами в защите продукции. Речь идет о незаконном тиражировании и распространении программ.
Прикрыть кормушку исключительно правовыми средствами сегодня нереально, поэтому проблема защиты ПО от хакеров и пиратов всех мастей не утрачивает своей актуальности. Разработчики, стремясь перекрыть нарушителям кислород, придумывают все более совершенные средства защиты своих продуктов. Центральное место в них отводится специализированным методам — как программным, так и современным интеллектуальным аппаратно-программным, которым и посвящена данная статья.
Головная боль программной индустрии
Экономика мировых держав давно уже страдает от компьютерного пиратства, а с развитием Интернета незаконное использование и распространение программных разработок приобрело поистине вселенский масштаб. По данным BSA (Ассоциация производителей ПО), общемировой уровень пиратства в сфере коммерческого ПО в 1999 г. достиг 36%, что эквивалентно убыткам на сумму около $12 млрд.
Ущерб России, составивший более $165 млн, в относительных цифрах вроде бы не слишком велик, но уровень пиратства в нашей стране (89%) — один из самых высоких в мире. Правда, в 2003 г., по оценкам той же BSA, он несколько снизился — до 87%. Для сравнения: в наиболее благополучных в этом отношении Западной Европе и Северной Америке — 37 и 23% соответственно. Наметившаяся положительная динамика в этой области, безусловно, радует, но до коренного перелома ситуации еще очень далеко.
Задача и ее решение
Защита ПО — задача многофакторная, однако благодаря использованию электронных ключей вполне решаемая. Во-первых, такой ключ препятствует переносу ПО на пиратские диски, с которых его могут «бесплатно» (точнее, не платя авторам) копировать сотни и тысячи пользователей, во-вторых, позволяет контролировать число оплаченных копий.
Неоплаченные копии характерны для многофилиальных корпораций или компаний с большим количеством автоматизированных рабочих мест (операторов, диспетчеров, контролеров и др.). Попросив «на время» неоплаченную копию, заказчик не только не удаляет ее в оговоренные сроки, но и активно плодит новые, автоматизируя место за местом. В результате вместо новых продаж компания-разработчик получает дополнительную нагрузку на свою службу поддержки.
Важный для разработчика ПО аспект — организация движения продукции через распространение демоверсий (в том числе и по Интернету). Плюсы для пользователя очевидны: можно опробовать функциональность продукта, а в дальнейшем превратить свою «демку» в полнофункциональную версию, оплатив ее стоимость и задействовав присланный разработчиком электронный ключ. Предусмотрена возможность дистанционного обновления памяти ключа. Есть и другие варианты использования программ, защищенных ключами.
Разумеется, не всякое ПО и не всеми известными средствами имеет смысл защищать. Для продуктов ценой от нескольких десятков до сотни долларов обычно достаточно «чисто» программной защиты, поскольку «аппаратные» компоненты заметно повышают общую стоимость продукта. Экономия же на безопасности коммерческих разработок может обернуться финансовыми проблемами, поскольку одни только программные действия не всегда способны обеспечить должный уровень защищенности.
Методы, сочетающие максимально возможное число комбинаций защитных средств, базируются на применении как программных алгоритмов, так и аппаратных устройств. Существует несколько вариантов построения аппаратной защиты с использованием ключевых дискет, специальных компьютерных плат, электронных ключей.
Наиболее распространены электронные ключи (hardware keys), или, как их еще называют, донглы (dongle), исполненные, как правило, в виде брелока для подключения к USB-порту ПК или коробочки, подключаемой к параллельному (принтерному, LPT) порту. После установки защищенная программа проверяет, подключен ли к компьютеру соответствующий ключ, входящий в комплект поставки. Если ключ не найден, программа либо переходит в деморежим работы, либо вовсе «отказывается» запускаться.
Для достижения такого эффекта разработчики записывают в память ключа (внутри него есть микропроцессор и энергонезависимая память) необходимые для полноценной работы ПО данные, фрагменты кода, пароли и другую информацию, без которой программа не сможет работать. В теле самой программы на этапе разработки размещаются обращения к ключу, а успешное завершение запроса возможно только при получении от ключа необходимых данных. Неверный ответ (ключ интеллектуален и может «говорить» кодами-ответами) или отсутствие такового сигнализирует о незаконном использовании ПО и ведет к завершению работы программы с соответствующей диагностикой.
Современные электронные ключи характеризуются достаточно высокой степенью защищенности, высоким уровнем совместимости с программным и аппаратным компьютерным обеспечением. Они удобны в использовании и обеспечивают большую свободу выбора при разработке систем защиты.
Благодаря развитой функциональности электронных ключей они могут быть использованы для защиты баз данных и СУБД, а в некоторых случаях и для построения недорогих систем разграничения доступа к коммерческой и конфиденциальной информации.
Сегодня на отечественном рынке систем защиты ПО наиболее широко представлены электронные ключи следующих марок: Guardant российской компании «Актив» (таблица), Sentinel американской компании SafeNet (в 2004 г. слившейся с Rainbow), а также HASP и Hardlock израильской фирмы Aladdin.
Наша марка
Электронные ключи Guardant — чисто российская разработка, в которой воплощено множество оригинальных идей. По обеспечиваемому уровню защищенности и функциональности продукт вошел в top-лист аналогичных устройств. Ключи подсоединяются к любому IBM-совместимому компьютеру через USB- или LPT-порт (выпускаются с одним из этих интерфейсов) и способны работать во всех ОС семейства Windows (начиная с Win95).
Основа ключа — микропроцессорная технология, главный его элемент — микроконтроллер, который можно «научить» решать задачи защиты любой сложности, создавая электронные ключи с определенным набором свойств.
На этапе изготовления ключа в память микроконтроллера записывается микропрограмма, реализующая различные аппаратные алгоритмы, при помощи которых выполняется кодирование важной для приложения информации. Микропрограмму нельзя ни считать, ни модифицировать, ведь микроконтроллер — это своего рода «черный ящик», скрывающий все происходящие в нем процессы.
С помощью утилиты программирования ключа разработчик ПО может самостоятельно конструировать аппаратные алгоритмы и, определяя им свойства, добиваться «правильного поведения» каждого из них.
Для выполнения любой операции с ключом необходимо задать код доступа. Коды, или пароли, «прошиваются» в память ключа на этапе предпродажной подготовки и уникальны для каждого создателя ПО. Различают два типа кодов доступа — общий и личный. Общий код не является секретным и служит для идентификации ключей конкретного разработчика защиты. Личные коды секретны, и каждый из них позволяет выполнять строго определенный набор операций.
Одна из особенностей Guardant — аппаратная защита содержимого энергонезависимой памяти, в которой хранятся аппаратные алгоритмы и данные для работы защищаемого ПО. Содержимое памяти шифруется стойким алгоритмом, ключ шифрования которого уникален для каждого электронного ключа. Кроме того, на некоторые участки памяти ключа может быть наложен аппаратный запрет на выполнение программными средствами чтения/записи защищенной области памяти — ключ просто не ответит на такой запрос.
Протокол обмена данными между ключом и защищенной программой имеет ряд особенностей. Первая — обязательное кодирование. Все данные, курсирующие между программой и электронным ключом, кодируются непрерывно, значительно усложняя задачу анализа протокола обмена. Более того, по прошествии некоторого времени метод кодирования этих данных изменяется случайным образом, поэтому поиск каких-либо закономерностей в протоколе становится для хакера задачей нетривиальной.
Другая важная особенность — зашумление потока данных. Вместе с реальной информацией передается специально генерируемый «мусор» — ничего не значащие данные. Характер трафика «мусора», а также порядок включения в него реальных данных с течением времени изменяются случайным образом.
Следующее свойство протокола — оптимальная настройка его параметров в процессе работы в соответствии с характеристиками аппаратного и программного окружения. И, наконец, любая запись в память ключа сопровождается верификацией: записанные данные проверяются на адекватность. Если при обмене с ключом происходит сбой, операция автоматически повторяется.
Ключ, поддерживающий аппаратную блокировку отладочных средств, способен защитить программу от несанкционированных модификаций исходного кода. Анализируя интервалы времени при поступлении к нему данных, «интеллект» ключа автоматически распознает среду, в которой работает приславшая запрос программа. Обнаружив, что протокол обмена выполняется в среде отладчика (в этом случае все интервалы времени неизбежно увеличиваются), ключ мгновенно «засыпает», переставая реагировать на любые запросы. «Разбудить» его, конечно, можно, только вот всю работу с ним придется начинать с нуля.
Заказная стратегия защиты — один из козырей Guardant. Обеспечить безопасность особо ценного ПО можно, заказав разработку и изготовление специализированных микропроцессорных ключей, микропрограмма которых пишется специально, в том числе и в соответствии с избранной клиентом стратегией защиты. У такого электронного ключа будут не только уникальные аппаратные алгоритмы, но и иные принципы работы.
Инструментальное сопровождение
Однако аппаратно реализованный электронный ключ выглядел бы «полуфабрикатом» без утилит программирования ключей, средств для встраивания защитных функций в программу и иных инструментальных средств, входящих в комплект поставки.
Утилиты для установки защиты в автоматическом режиме (автозащита) позволяют облечь исполняемый файл программы в защитную оболочку — так называемый конверт защиты. В числе их достоинств — множество режимов работы (привязка к различным полям ключа, ограничение работы программы по времени или количеству запусков и т. п. ), а также быстрота установки и невысокие требования к квалификации специалиста, устанавливающего защиту.
Генератор исходного текста — средство для упрощения создания защиты на основе Guardant API. На выбранном языке программирования (C/C++, Assembler, Delphi и др.) утилита генерирует исходные тексты, содержащие все операции взаимодействия с электронным ключом, после чего остается лишь внести их в исходный текст приложения.
Библиотеки функций API обеспечивают выполнение любых операций с электронными ключами и позволяют интегрировать систему защиты в тело приложения (поддерживаются практически все распространенные языки программирования и средства разработки).
Утилита программирования электронных ключей отвечает за работу с памятью ключа. Поддерживаемые функции: чтение/запись данных, создание, редактирование и удаление полей памяти, установка и снятие аппаратных запретов на доступ к памяти, работа с аппаратными алгоритмами, кодирование/декодирование данных программы в ключе, тестирование выполнения функций API с заданными параметрами и др.
Кроме того, в комплект входит набор тестовых утилит для проверки работоспособности электронных ключей и утилита для обновления ПО Guardant через Интернет. Клиенту не нужно каждый раз заглядывать на страничку компании для сравнения версий и дат создания драйверов и утилит — весь процесс автоматизирован.