Наконец, сама привязка преобразуется в два читабельных ASCII-символа, а хэш – в 11 символов. Итак, функция char* crypt (char* passwd, char* salt) выдает 13-символьную строчку, которая и записывается в файл /etc/ passwd.
При входе пользователя в систему вызывается та же функция crypt() с введенным паролем и привязкой, полученной из /etc/passwd. Если результат оказывается равным значению, хранящемуся в файле, то аутентификация считается состоявшейся.
После анализа этой схемы первое, что приходит в голову потенциальному взломщику (если он верит в невозможность обратного преобразования хэша в пароль), – перебор. Берется некоторый набор символов (например, прописные и строчные буквы, цифры и специальные символы типа знаков препинания – всего получается 94 символа), а затем из них по очереди составляются все комбинации вплоть до 8-символьной длины. К каждой из них применяется crypt(), и результат сравнивается с имеющимся. Естественно, что в эти комбинации рано или поздно попадет любой пароль пользователя.
Обрезание пароля до 8 значимых символов, конечно, резко ограничивает множество для перебора, но для тех времен это было вполне допустимо, так как функция crypt() была реализована заведомо неэффективно и время одного ее выполнения доходило до одной секунды на машине класса PDP. Таким образом, в среднем злоумышленник потратил бы на поиск пароля
или около 100 миллионов лет. Если же в качестве множества символов взять прописные латинские буквы (наиболее часто используемое множество), то время перебора составило бы в среднем
или «всего» 3 440 лет. Заметим, однако, что на сегодняшний день скорость оптимизированной функции crypt() на средней машине класса Pentium/166 MMX составляет примерно 15 000 crypt/с, то есть она за 20 лет повысилась в 15 000 раз.
...
Авторы [23] приводят интересную цифру – в то время (имеется в виду 1991 год) суперкомпьютер Cray выдавал 50 000 crypt/c. А сегодня счастливый обладатель какого-нибудь PIII/500 имеет в своем распоряжении вычислительную мощь, которая 8–9 лет назад была доступна только, скажем, АНБ США!
Это означает, что сегодня любой пароль из прописных латинских букв мы сможем найти в среднем за 80 дней.
Более того, этот процесс легко можно распараллелить, и существуют специальные платы, аппаратно выполняющие процесс шифрования, с помощью которых можно еще больше сократить время поиска.
С аналогичным аппаратным прогрессом столкнулась и другая фиксированная величина функции crypt() – привязка. Она создавалась для того, чтобы взломщик не мог применить стандартную для оптимизации программ замену время-память, то есть хэшировать предварительно (и один раз) некий большой набор слов и затем уже быстро искать в нем нужное хэш-значение. Однако если взять словарь в 10 000 слов (в среднем из 6 букв), то для хранения хэшей (еще 11 байт; 2 байта привязки можно не хранить) его слов во всех 4 096 модификациях потребовалось бы примерно 10 000 х 17 х 4 096 байт = 660 Мбайт. Раньше такой объем памяти нельзя было представить, а сейчас – один компакт-диск.
Однако вернемся на несколько лет назад, когда вычислительной мощности для полного перебора всех паролей не хватало. Тем не менее хакеры придумали остроумный (но совершенно очевидный) метод, основанный на людской психологии. Он следует из того, что человеку нелегко запомнить длинные бессмысленные наборы символов (идеальные в качестве паролей), поэтому он каким-либо путем попробует выбрать их более-менее запоминающимися и/или осмысленными. Чаще всего им в качестве пароля выбирается существующее слово или какая-либо информация о себе или своих знакомых (имя, дата рождения и т. п.). Ну а поскольку в любом языке не более 100 000 слов, то их перебор займет немного времени, и от 10 до 40 % существующих паролей может быть угадано с помощью простой схемы, называемой «атакой по словарю». (Кстати, до 50 % таких паролей может быть угадано с использованием всего 1 000 слов.) Как вы уже знаете, даже вирус Морриса применял такой способ, тем более что в UNIX «под рукой» часто оказывается файл-словарь, обычно используемый программами-корректорами. Что же касается «собственных» паролей, то файл /etc/passwd может дать немало информации о пользователе: его входное имя, реальные имя и фамилию, домашний каталог. Вирус Морриса, как вы помните, с успехом пользовался следующими предположениями:
• в качестве пароля берется входное имя пользователя;
• пароль представляет собой двойной повтор имени пользователя;
• то же, но прочитанное справа налево;
Читать дальше
Конец ознакомительного отрывка
Купить книгу