hw-kaleidoscope-hasp

электронные ключи — камень на шее

крис касперски, no-email

электронные ключи (в просторечии именуемые «хаспами») пользуются огромной популярностью у разработчиков программного обеспечения и яростной ненавистью у конечных пользователей и не за их стойкость ко взлому (все защищенные «хаспами» пакеты давно поломаны), а за проблемы, которые они создают. есть ли достойная альтернатива «железкам», устраивающая всех — как по одну строну прилавка, так и по другую? попробуем ответить на этот вопрос!

Электронный ключ в общем случае представляет собой устройство, подключаемое к компьютеру по LPT-или USB-порту и содержащее несколько микросхем, функции которых варьируются в зависимости от категории ключа. В простейшем случае, ключ может хранить определенные данные, записанные в энергонезависимую (изменяемую) память или даже в однократно программируемое ПЗУ. В настоящее время такие ключи практически полностью вышли из употребления и потому не рассматриваются.

Типичный ключ содержит микроконтроллер, поддерживающий различные функции шифрования или способный выполнять другие преобразования данных. Рекламные проспекты поражают нас открывающимися перспективами. Дамп ключа получить невозможно ни программным, ни аппаратным путем. Даже сканирование с помощью электронного микроскопа приведет к неудаче. Каждый ключ уникален и двух одинаковых ключей в природе не существует.

В общем, читая весь этот, извиняюсь за выражение, псевдонаучный бред (который пересказывать просто нет смысла) у всякого нормально специалиста по безопасности создается стойкое впечатление, что сломать электронный ключ невозможно в принципе. Тем больше поражает факт, что они все-таки ломаются, а факт этот известный и легко проверяемый. Эмуляторы электронных ключей периодически выкладываются хакерами в открытый доступ. Единственная _практическая_ польза от электронного ключа – упрощение проверки лицензионной чистоты продукта. Если у тебя ключа нет, а защищенная им программа — работает, значит, ты вот и сейчас ответишь по всей строгости закона.

Сами же разработчики электронных ключей во всем винят программистов, использующих малую толику предоставляемых ими возможностей и зачастую ограничивающиеся простой проверкой наличия электронного ключа, что ломается заменой одного условного перехода на другой безусловный переход на «правильную» ветку программы (конечно, это немного утрировано, но суть передана верно).

К сожалению, _надежно_ защитить программу с помощью электронного ключа невозможно в принципе. Даже если использовать весь спектр предоставляемых им функций. И сейчас мы доказательно выясним почему, познакомившись с хорошо отработанными хакерскими технологиями.

Дано: электронный ключ, шифрующий критические данные и/или код программы криптостойким (в идеале) алгоритмом. В отсутствии ключа программа не запускается или работает в режиме ограниченной функциональности. Самостоятельно расшифровать зашифрованные данные (код) программы — нет никакой возможности. Запросы на расшифровку и проверки на наличие ключа следуют из разных мест программы с различной периодичностью — от нескольких часов (минут, секунд) до сотен или даже тысяч лет (в идеале).

Доказать: что этот ключ легко взломать. Начнем с того, что «взломать программу в отсутствии ключа» чисто абстрактная задача, которой хакеры не занимаются. Хакеров куда больше интересует отвязка программы от ключа, то есть как сделать так, чтобы купив всего один экземпляр программы с ключом, отучить ее от этого ключа раз и навсегда, растиражировав неограниченным числом экземпляров.

Существует огромная разница между «снять дамп с ключа» (т. е. получить его копию, оперируя непосредственно с самим ключом) и, врезавшись между программой и ключом, перехватить протокол обмена, расшифровать его, создав программный эмулятор, ведущий себя практически так же, как и оригинальный электронный ключ. «Практически» — потому, что хакеру доступны для анализа только те данные, которыми обменивается с ключом защищенная программа, а они (как утверждает реклама) могут происходить с предательски низкой частой.

Скажем сразу, проверки, «выскакивающие» раз в несколько лет, никого не интересуют. Даже если хакер не реализовал их в эмуляторе — не велика беда. Подумаешь, защищенная программа откажет через ~666 дней. Она и просто так отказать может. Из-за сбоя самого ключа или программной ошибки. К тому же, наивно думать, что хакер будет тупо «грабить» обмен программы с ключом. Скорее всего, он возьмет дизассемблер и, заглянув внутрь кода, обнаружит _все_ проверки, какие там только есть, независимо от их дислокации и периодичности. Анализ можно затруднить, но полностью воспрепятствовать ему никто не в силах. Следовательно, на фундаментальном уровне, электронные ключи уязвимы.

Если у хакера есть электронный ключ и есть экземпляр программы, он может выявить _все_ проверки, _все_ зашифрованные фрагменты и расшифровать их, после чего ключ уже не понадобиться (или, как вариант, можно создать эмулятор ключа, не требующий вмешательства в код программы).

И все-таки в борьбе с электронными ключами хакеры обречены если не на поражение, то на вечную гонку вооружений. Как уже было сказало выше — снять полный дамп с ключа невозможно при условии его правильной аппаратной реализации. Если первая версия защищенной программы использует только часть существующих проверок (например, 10%), то об остальных хакеру остается только гадать. Заложить их в эмулятор он _никак_ не может.

Теперь представим, что выходит новая версия программы, которая использует уже 20% проверок. Со старым электронным ключом она заработает без вопросов, а вот с эмулятором нет. И хакерам вновь придется садится за дизассемблер. А дизассемблирование — процесс долгий, особенно если ему всячески препятствуют с помощью обсускации (т. е. запутывания) кода или создания различных виртуальных машин. В результате, поклонники пиратской продукции получат новую версию с некоторым запозданием. Если же новые версии (или небольшие обновления) выходят постоянно, то возникает мощная мотивация перестать каждый раз ждать у моря погоды, плюнуть на все и приобрести легальную версию продукта. Хакеры же они ведь не святые. Очень часто они требуют за взлом денежку, и не факт, что сохранят интерес к «трепанации» свежих версий… Однако, если речь идет о широко распространенных программных пакетах, то свой хакер на них всегда найдется.

Разработчики программного обеспечения не раз и не два пытались реализовать концептуально неломаемый электронный ключ. В теории все выглядит предельно просто. Берем микропроцессор (благо они сейчас очень дешевые), засовываем в него ядро программы и защищаем прошивку от «грабежа» на аппаратном уровне. И ву-а-ля! Программа как бы реализуется в железе, сложность эмуляции которого превышает трудоемкость написания аналогичной программы с нуля, что делает взлом экономически невыгодным. Правда, и производство подобных защит экономически невыгодно тоже.

Во-первых, микроконтроллеры не такие уж дешевые и мощные. Чтобы втиснуть в них заданный функционал нужны грамотные специалисты. Причем, программирование и отладка прошивок для микроконтроллеров — это уже высший пилотаж. К тому же, если мы не запретим «заливку» новых прошивок, хакер запросто напишет тривиальный код, загружаемый внутрь микроконтроллера и считывающий все остальное. Если же заливка прошивок запрещена, как выпускать новые версии и исправлять ошибки? Заставлять клиентов покупать новый ключ?! Негуманно… и опасно для здоровья. В общем, от этой (внешне весьма привлекательной) идеи в конечном счете все отказались.

hw-kaleidoscope-hasp_image_0.jpg

Рисунок 1 электронный ключ на LPT

hw-kaleidoscope-hasp_image_1.jpg

Рисунок 2 электронный ключ на USB

hw-kaleidoscope-hasp_image_2.jpg

Рисунок 3 электронный ключ на PCMCIA