Многие знают об основных разработчиках Unix — Кене Томпсоне и Деннисе Ритчи. Но особая роль принадлежит их коллеге, криптографу Роберту Моррису, вклад которого был особым:

  • первая и несколько последующих версий математической библиотеки;

  • множество интересных приложений для обработки текста, таких как typo и др.;

  • ряд программ crypt, которые поставлялись с ранними версиями Unix;

  • схема шифрования паролей, которая в основных чертах применяется до сих пор.

История создания механизма паролей (с шифрованием) наиболее интересна, потому что Моррис и Томпсон заложили фундамент современной информационной безопасности. Они разработали и внедрили базовые принципы шифрования и хранения секретов.


Эта история описана в исторической статье Кена Томпсона и Роберта Морриса «Безопасность паролей: история одного случая» 1978 года, упоминается в книге Маркоффа и Хафнер «Киберпанк: разбойники и хакеры компьютерного фронтира» (1991) и воспоминаниях Денниса Ритчи, непосредственного участника тех событий. Деннис Ритчи известен как соавтор языка программирования С и ОС Unix. Он также помогал Моррису в разных криптографических проектах, а совместный взлом шифровальной машины M-209 (она же CSP-1500 и C-38) называл «одной из самых интересных вещей, которые он делал и видел».

В научной статье Томпсон и Моррис описывают основные подходы к разработке схемы шифрования паролей и архитектуру системы, которая получилась в итоге.

Принципы разработки

Вот некоторые принципы, которые использовались в разработке.

  • Конкурсы. Для создания максимально безопасной системы авторы постоянно проводили конкурсы на новые способы атаки («плохой парень»), а также на новые методы защиты от новых атак («хороший парень»). Причины создания конкретных механизмов становятся понятнее, если принять в расчёт потенциальные атаки.

  • Юзабилити. Основной целью было «обеспечение безопасности при минимальном неудобстве для пользователей». Если сисадмин хочет оставить полностью открытую систему без паролей или ввести пароли только для отдельных пользователей, он может это сделать.

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

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

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

Первая схема

Изначально Unix была реализована с файлом passwords, в котором хранились пароли всех пользователей в открытом виде. Такой способ сложился исторически, но был крайне небезопасным.

Очевидное решение — зашифровать пароли, поместив в файл passwords только зашифрованную форму. Когда пользователь входит в систему, пароль шифруется и сравнивается с зашифрованной версией в файле. Если они совпадают, попытка входа принимается. Такая схема впервые описана в книге Уилкса «Компьютерные системы с разделением времени» 1968 года.

Оставалось выбрать способ шифрования. В то время в системе случайно оказалась удобная и качественная программа шифрования. Она имитировала шифровальную машину M-209, которую использовала армия США во Второй мировой.

Программа M-209 оказалась вполне пригодной. В ней пароль использовался не как текст для шифрования, а как ключ, и с помощью этого ключа была зашифрована константа. Зашифрованный результат вводился в файл паролей.

Авторы исследовали возможности брутфорса и обратили внимание, что люди часто выбирают короткие и простые пароли, которые легко запомнить, из ограниченного набора символов (например, только строчные буквы) и часто выбирают слова или имена. Эта человеческая привычка значительно облегчает поиск ключа.

Критическим фактором является количество времени, необходимое для шифрования пароля и сверки результата: на компьютере PDP-11/70 оно составило примерно 1,25 миллисекунды. Проверка зашифрованного пробного пароля по всем паролям в файле занимает не больше времени.

В этой исторической работе Морриса и Томпсона опубликована первая таблица по времени брутфорса:

В конечном итоге, защита от несанкционированного раскрытия паролей с такой системой невозможна, поскольку раскрытие одного пароля раскрывает схему и пароли всех остальных пользователей. Файл с паролями записывается на магнитную ленту для резервного копирования, так что любой желающий может его прочитать после раскрытия схемы.

Усовершенствования

Более медленное шифрование

Очевидно, первый использованный алгоритм шифрования был слишком быстрым. Появление нового алгоритма шифрования DES от NIST сильно помогло. Шифры DES по своей конструкции трудно обратить, плюс он чрезвычайно медленный при реализации в ПО.

DES был реализован и использован следующим образом: первые восемь символов пароля пользователя используются в качестве ключа для DES; затем алгоритм применяется для шифрования константы. Хотя из��ачально константа была равна нулю, она легко доступна и её можно привязать к железу. Затем алгоритм DES итерируется 25 раз, а полученные 64 бита переупаковываются в строку из 11 символов.

Менее предсказуемые пароли

Программу ввода пароля изменили, чтобы побуждать пользователя использовать более сложные пароли. Если пользователь вводил буквенный пароль короче шести символов или буквенно-численный короче пяти символов, то программа просит ввести более длинный пароль.

Соль

Программа паролей получает 12-битное случайное число (считывая часы реального времени) и добавляла его к введённому паролю. Объединённая строка шифровалась, а в файл паролей записывались 12-битное случайное число (называемое солью) и 64-битный результат шифрования.

Когда пользователь позже входит в систему, 12-битное число извлекается из файла паролей и добавляется к введённому паролю. Зашифрованный результат, как и раньше, сравнивается с записанными 64 битами в файле паролей.

С такой модификацией стало непрактичным использование заранее подготовленного зашифрованного словаря, с которым раньше взламывали новые пароли за миллисекунды.

Кроме того, становится практически невозможно узнать, использовал ли человек на двух или более системах один и тот же пароль.

Защита от атаки по времени

Для успешного входа в Unix необходимо ввести действительное имя пользователя, а затем правильный пароль. Когда впервые внедрили медленный алгоритм DES, шифрование выполнялось только в том случае, если имя пользователя было действительным, поскольку в противном случае не было зашифрованного пароля для сравнения с введённым паролем. В результате ответ задерживался примерно на полсекунды на действительном имени, но был мгновенным на недействительном. Злоумышленник мог узнать, является ли определённое имя пользователя действительным. Рутину изменили, чтобы выполнять шифрование в любом случае.

Выводы

Опыт показал поразительно изощрённые попытки проникновения в системы удалённого доступа. Поэтому защита паролей требует особого внимания.

Нужно помнить, что система работает во враждебной среде. Авторы подчёркивают, что бесполезно скрывать особенности работы системы. Наоборот, они обнародовали алгоритм шифрования и пригласили всех желающих к атаке, полагая, что такой подход сведёт к минимуму будущие проблемы. Подход оказался успешным.

С тех пор минуло более полувека, но выводы разработчиков Unix остаются актуальными до сих пор.