Некоторые производители программного обеспечения позволяют всем желающем скачать инсталлятор программы с официального интернет-сайта. При этом инсталлятор может быть защищен таким образом, что для установки программы необходимо знать некоторую информацию, которую производитель сообщит только после получения оплаты. Однако далеко не все разработчики знают, что некоторые способы защиты инсталляторов совсем не так безопасны, как хотелось бы.
14.5.1. ZIP-архивы с паролем Очень многие программы распространяются в ZIP-архивах. И очевидная идея защиты дистрибутива — установка пароля на архив. Если выбранный пароль содержит буквы, цифры и знаки препинания и имеет достаточно большую длину, то для отыскания такого пароля перебором потребуется очень много времени. Однако кроме подбора пароля методом грубой силы (brute force) существуют и более эффективные варианты атаки. Если архив был создан с помощью программы, основанной на исходных текстах от InfoZIP Group (например WinZip), и содержит пять или более файлов, существует алгоритм, отыскивающий ключ и расшифровывающий архив примерно за час. Если применялся архиватор, не основанный на InfoZIP, то противник может попытаться воспользоваться атакой на основе открытого текста. Для этого ему понадобится иметь в открытом виде один из файлов, зашифрованных в архиве. Но как можно получить незашифрованный файл? Оказывается, создатели архива часто сами помещают в архив с дистрибутивом файл, который можно найти в открытом виде. Например, файл README.TXT, описывающий продукт, обычно доступен по ссылке с web-страницы, а также находится в дистрибутиве. Если инсталлятор программы, зашифрованный в архиве, создан при помощи пакета InstallShield, то в архиве окажется с десяток файлов, некоторые из которых идентичны для всех инсталляторов, созданных с помощью Install- Shield той же версии. Следовательно, незашифрованный файл может быть взят от другой программы или найден в Интернете с помощью службы FTPsearch.
14.5.2. Norton Secret Stuff Некоторые производители для распространения своих продуктов использовали разработанную компанией Symantec бесплатную программу Norton Secret Stuff (NSS), создающую из указанного набора файлов самораспаковывающийся архив с паролем. Все данные шифруются с помощью криптогра- фически стойкого алгоритма BlowFish, но в силу действовавших на момент создания NSS ограничений на экспорт программного обеспечения, использующего стойкую криптографию, применяется ключ шифрования, в котором неизвестными являются только 32 бита. В 1998 году Павел Семьянов разработал программу No More Secret Stuff (NMSS), позволяющую подобрать 32-битовый ключ и расшифровать архив не более чем за 4 недели на компьютере с процессором Intel Pentium 166 МГц. С тех пор производительность процессоров значительно выросла, и подбор ключа может быть осуществлен на одном компьютере за считанные дни. А если выполнять вычисления одновременно на нескольких машинах, то результат может быть достигнут буквально за насколько часов. Ключ шифрования вычисляется из пароля при помощи хэш-функции MD5. На настоящий момент не существует эффективного способа обращения этой функции, но на подбор пароля, порождающего заданный 32-битовый ключ, уходит примерно в 64 раза меньше времени, чем на поиск самого ключа. Таким образом, несмотря на то, что поиск пароля не является необходимым для расшифрования архива NSS, если известен ключ шифрования, при желании можно найти и пароль, затратив при этом на 2 % больше ресурсов.
14.5.3. Package For The Web Если инсталлятор состоит не из одного файла, часто применяется дополнительная программа, позволяющая все файлы, составляющие инсталлятор, упаковать в один исполняемый файл. Пользователь скачивает этот файл и запускает его, что приводит к распаковке инсталлятора во временную директорию и запуску процесса инсталляции. После того как инсталляция завершится, автоматически будут удалены все временные файлы. Популярной программой для упаковки инсталляционного пакета в один исполняемый файл является Package For The Web (PFTW), бесплатно распространяемая InstallShield Software Corporation и, похоже, входящая в состав коммерческой программы InstallShield. PFTW позволяет установить пароль на исполняемый файл, что не позволит распаковать, а значит, и запустить инсталлятор, пока не будет введен правильный пароль. Однако то, как проверяется пароль в PFTW, заслуживает серьезной критики. В ранних версиях пароль просто сравнивался со строкой, хранившейся в зашифрованном виде. Следовательно, можно было или откорректировать условие, в результате проверки которого принималось решение о правильности ввода пароля, или "подсмотреть" пароль в момент проверки. Более новые версии PFTW поступают гораздо умнее. Пароль нигде не хранится даже в зашифрованном виде, но запоминается его 14-битовый хэш, который сравнивается со значением хэша от введенного пользователем пароля. В случае несовпадения пользователя сразу информируют о том, что пароль неверен. Но так как длина хэша составляет всего 14 бит, примерно один из 16 тысяч паролей будет проходить эту проверку. Это широко распространенный подход, который позволяет защититься от случайных опечаток, но не дает возможности правильно определить пароль, даже если удастся обратить хэш — каждому значению хэша будет соответствовать, например, почти полмиллиона семисимвольных паролей, состоящих только из маленьких латинских букв, но только один из этих паролей будет правильным. Если проверка хэша прошла успешно, из пароля вычисляется ключ, кото- рый используется для расшифрования инсталлятора.
Но именно тут разработчики PFTW допустили оплошность. Дело в том, что длина ключа шифрования соответствует длине пароля, и преобразование пароля в ключ является обратимым, т. е., зная ключ шифрования, легко вычислить пароль. А алгоритм шифрования не устойчив к атаке на основе открытого текста, т. е., зная несколько байт открытого текста и соответствующего ему шифртекста, очень просто вычислить фрагмент ключа шифрования той же длины, что и известный открытый текст. Таким образом, для определения пароля достаточно найти фрагмент открытого текста, который по длине не короче пароля. Но, как оказалось, шифруемые данные представляют собой так называемый САВ-файл, формат которого был разработан корпорацией Microsoft. CAB- файл является разновидностью архивного файла, хранящего один или несколько других файлов в упакованном виде, и всегда начинается со строковой сигнатуры "MSCF" (Microsoft CAB File), за которой следуют 4 нулевых байта и 64-битовое число, соответствующее размеру САВ-файла. Таким образом, определить первые 16 байт открытого текста, а значит и пароля, длина которого не превышает 16 байт, не составит труда. В САВ-файле присутствуют и другие области, значение которых совсем не трудно предугадать. Их можно использовать для вычисления более длинных паролей.