Современные технологии защиты программ: что выбрать разработчику?
13 августа 2010 годаСогласно исследованиям IDC, уровень пиратства в России в 2009 г. составил 67%. Несмотря на то что эта цифра каждый год снижается, для производителей коммерческого программного обеспечения это означает огромную недополученную прибыль.
Многие крупные производители софта предпочитают бороться с пиратством организационными и юридическими мерами. Компания Adobe не так давно отрапортовала, что скорость закрытия нелегальных раздач ее ПО на «торрент-трекерах» составила рекордные 26 секунд. А скандально известное «дело Поносова» о нелегальной установке в заурядной сельской школе ПО от Microsoft — лишь одно из множества дел о нарушении авторских прав, рассматривавшихся в российских судах за последнее десятилетие.
Однако мониторинг торрент-трекеров и показательные судебные процессы — лишь часть большого комплекса мер по защите интеллектуальной собственности.
В большинстве случаев наиболее надежными и эффективными остаются технические способы защиты, но для успешного противостояния всем угрозам разработчики коммерческого ПО должны озаботиться вопросами информационной безопасности еще на старте разработки нового продукта. А вопросов здесь по большому счету два: как защитить свои ноу-хау и как противостоять нелегальному копированию?
Защита от копирования
Методы защиты софта от нелегального копирования развивались и эволюционировали последние 30 лет. В эпоху, когда не было Интернета, сканеры и ксероксы являлись экзотической редкостью, а операционные системы были однозадачными, производители компьютерных игрушек привязывали свой софт к поставляемому с ним печатному мануалу. В какие-то моменты использования программы требовалось найти что-то в руководстве пользователя.
Когда этот метод потерял актуальность, стали использоваться более продвинутые технические методы (например, ключевые дискеты). Использовались искусственно созданные сбойные секторы дискет, нестандартное форматирование и «плавающие» биты. И хотя некоторые производители (например, российская компания ABBYY) использовали этот метод защиты вплоть до недавнего времени, на смену им пришли новые технологии.
Недорогой софт, выпускаемый в промышленных масштабах (особенно компьютерные игры), проще всего защищать, привязывая к носителю (CD- или DVD-дискам). Там используются, по сути, те же методы, которыми раньше защищали дискеты: нестандартное форматирование, сбойные секторы на диске, специально закодированный таким образом ключ. В качестве дополнительной меры защиты в системе может устанавливаться специальный защищенный драйвер, призванный бороться с различными эмуляторами. Этот метод защиты сравнительно дешев и подходит для широко тиражируемых продуктов. К ограничениям можно отнести не самую высокую степень защиты и неудобство, вызванное привязкой к физическому носителю.
Электронные ключи
Для защиты более дорогого программного обеспечения применяются электронные ключи или интернет-активация с привязкой к оборудованию. Электронные ключи выигрывают здесь с точки зрения защищенности: в отличие от ключевой дискеты или привязки к CD, электронный ключ в домашних условиях невозможно скопировать, а изучить «внутренности» довольно затруднительно без специального оборудования.
Кроме того, современные микропроцессоры в электронных ключах позволяют шифровать трафик между ключом и защищенным приложением криптографическим алгоритмом на одноразовых сессионных ключах, что уничтожает возможность применения целого класса эмуляторов. При использовании этого метода защиты надо понимать, что благодаря технологиям современных ключей можно построить очень эффективную и взломостойкую защиту, но для этого нужно проектировать защиту вместе с проектированием архитектуры самого приложения.
Отдельной строкой идут электронные ключи с возможностью загрузки внутрь произвольного пользовательского кода. Если при разработке приложения хотя бы часть уникальных алгоритмов приложения перенести в такой ключ, а оставшуюся «снаружи» часть приложения заставить постоянно общаться с ключом с помощью асимметричной криптографии (например, в ключ периодически посылаются произвольные данные для выполнения электронно-цифровой подписи), то можно выстраивать защиту с гарантированной взломостойкостью.
Интернет-активация
Неудобство распространения физических носителей и электронных ключей, а также развитие Интернета и цифровой дистрибуции привели к взрывному росту популярности различных методов онлайн-защиты.
Компания Microsoft с 1999 г. начала применять интернет-активацию в большинстве своих продуктов, и вот уже более 10 лет сотни миллионов копий (а может, и миллиарды) ее программного обеспечения успешно защищаются таким образом. Суть защиты состоит в том, что приложение вычисляет параметры оборудования, на которое оно установлено (серийные номера материнской платы, процессора и т.д.), в зашифрованном виде пересылает их на сервер активации, и после получения ключа приложение начинает работать в полную силу, но оказывается привязанным к «железу», куда оно установлено.
Преимуществ у онлайн-защиты множество. Например, отсутствие физических носителей, что означает как отсутствие проблем с пересылкой электронных ключей и дисков, так и невозможность их механических поломок. Также можно отметить относительную дешевизну внедрения и поддержки этого метода защиты и, конечно, возможность широкой цифровой дистрибуции и «мгновенной» покупки ПО из любой точки Земли.
Однако стойкость всех вышеперечисленных методов защиты упирается в сложность реверсинга приложения и его технологий привязки к диску, электронному ключу или онлайн-активации. Поэтому крайне необходимо защитить приложение не только от копирования, но и от изучения и отладки.
Обфускация кода
Несмотря на то что ассемблер современных процессоров не так прост для понимания. как высокоуровневый C-код, опытный взломщик с большой долей вероятности сможет при наличии времени и сил воспроизвести любые алгоритмы в приложении, включая и те, что обеспечивают защиту от копирования. И если где-то существует заблуждение, что сама по себе компиляция в машинный код — это уже хорошая защита, то в современном мире это не так, не говоря уже о том, что множество технологий не предусматривают компиляции в машинный код, а анализировать байт-код или промежуточное представление куда легче (например, .NET, Java или ActionScript).
Здесь на помощь приходят технологии обфускации (запутывания) кода. Обфускация может выполняться на разных уровнях в зависимости от языка. Для Web-технологий (например, клиентского JavaScript) есть возможность только запутывания исходного кода. Если речь о языке с компиляцией в некий промежуточный код (например, у Java или .NET), то обфусцируется этот код. Но на сегодняшний день в большинстве своем коммерческий софт пишется на классических языках (например, С) и компилируется в машинный код, в связи с чем встает задача обфускации машинного кода.
Псевдокод и полиморфные технологии
Любая обфускация на уровне машинного кода уменьшает скорость выполнения программы. Ведь в лучшем случае для запутывания кода приходится добавлять туда ненужные инструкции (не влияющие, впрочем, на результат). А для более продвинутой защиты используется технология так называемого псевдокода. Там для обычного x86-процессора разрабатывается некий псевдоязык, оперирующий совершенно другими командами и логическими конструкциями, после чего исходный код защищенного приложения инструкция за инструкцией преобразуется в псевдокод.
Для выполнения этого псевдокода генерируется «виртуальная машина», которая на лету преобразовывает команды псевдокода в машинные инструкции и исполняет их. Результат остается тот же, но код приложения меняется до неузнаваемости, и «отреверсить» искомые алгоритмы защищенного приложения можно лишь после вскрытия всей логики псевдокода.
Для повышения стойкости псевдокода могут использоваться полиформные технологии. Это означает, что псевдокод каждый раз новый, и виртуальная машина для его исполнения тоже генерируется моментально на лету. Эти технологии сами по себе не защищают приложение от нелегального копирования, но позволяют надежно скрыть алгоритмы и ноу-хау разработчика, а также прочие важные места программы (вроде того, где осуществляется обмен с электронным ключом или процедура проведения и проверки онлайн-активации).
Перспективы
За последние 30 лет появлялись и погибали различные технологии. И сейчас многим кажется, что с развитием Интернета и цифровой дистрибуции право на существование имеет только онлайн-активация для защиты от копирования и обфускация кода для защиты от реверсинга. Однако есть и противоположная тенденция — развитие рынка SaaS и переход приложений в «облако». Если считать эту тенденцию потенциальным победителем, то защита вообще никому не нужна, ведь приложение не распространяется. Для «облаков» важна аутентификация, безопасность передачи данных и доступность сети.
Выбирая защиту для своего программного продукта, необходимо учитывать множество факторов: каналы дистрибуции (физические или цифровые), стоимость защиты, требования к надежности и отказоустойчивости. В некоторых случаях приложению вполне допустимо «уйти в облако», где защита осуществляется организационными мерами, но уже не обойтись без надежной аутентификации. Если же софт распространяется вместе с оборудованием (например, кассовые аппараты, терминалы и т.д.), то электронный ключ — это лучший и практически единственный вариант защиты.
Электронные ключи (особенно с загружаемым кодом) незаменимы при защите особо ценного ПО с уникальными ноу-хау. Если приложение стоит десятки тысяч долларов, то экономить на защите не стоит, да и проблема физического распространения не столь актуальна — такое ПО зачастую внедряется армией консультантов и всегда есть «физический» контакт с клиентом.
В остальных же случаях для тиражного и недорого софта технология онлайн-активации — это наиболее современное, надежное и относительно недорогое средство защиты. Исключением является ситуация, когда продажи осуществляются через партнерскую сеть. Софтверные лицензии не так хорошо защищают от мошенничества со стороны партнеров, электронные ключи же решают эту проблему полностью. Нельзя одну и ту же «железку» дать двум разным клиентам.