Выпуск John the Ripper 1.9.0-jumbo-1 с поддержкой FPGA

Выпущена новая версия старейшей поддерживаемой программы для подбора паролей John the Ripper 1.9.0-jumbo-1 (проект развивается с 1996 года). C выхода прошлой версии 1.8.0-jumbo-1 прошло 4.5 года, за которые было внесено более 6000 изменений (git commits) от более 80 разработчиков. Благодаря непрерывной интеграции, включающей предварительную проверку каждого изменения (pull request) на многих платформах, в течение этого срока разработчики рекомендовали использовать текущую редакцию с GitHub, состояние которой поддерживалось стабильным несмотря на вносимые изменения. Основной код проекта распространяется под лицензией GPLv2+, а код некоторых компонентов под лицензией BSD.

Особенностью новой версии является появление поддержки FPGA (в дополнение к CPU, GPU и Xeon Phi). Для плат ZTEX 1.15y, включающих по 4 чипа FPGA и исходно использовавшихся в основном для майнинга Bitcoin, теперь реализованы 7 типов хешей паролей: bcrypt, классический descrypt (включая bigcrypt), sha512crypt, sha256crypt, md5crypt (включая Apache apr1 и AIX smd5), Drupal7 и phpass (используется, в частности, в WordPress). Некоторые из них реализованы на FPGA впервые.

Для bcrypt, достигнутая производительность в ~119k c/s при 2^5 итераций (»$2b$05») с потребляемой мощностью около ~27 ватт существенно превосходит результаты для новейших GPU в расчете на плату, на цену оборудования и на ватт. Также поддерживаются кластеры из плат этого типа, что проверено вплоть до 16 плат (64 чипа FPGA), контролируемых с одного Raspberry Pi 2. Поддерживается обычная функциональность John the Ripper, включая все режимы подбора паролей и одновременную загрузку большого количества хешей.

Для ускорения работы реализовано применение маски (режим »--mask», в том числе в комбинации с другими режимами) и сравнение вычисленных хешей с загруженными на стороне FPGA. С точки зрения реализации, во многих из дизайнов (например, для sha512crypt и Drupal7) применены блоки состоящие из многопоточных процессорных ядер (soft CPU cores), взаимодействующих с криптографическими ядрами. Разработку этой функциональности вел Денис Бурыкин в координации с другими разработчиками jumbo.

Другие важные изменения:

  • Поддержка большого количества дополнительных типов хешей, шифров и т.п., включая как классические хеши паролей (например, от новых версий QNX), так и кошельки криптовалют, шифрованные архивы и шифрованные файловые системы (например, Bitlocker и FreeBSD geli), а также поддержку новых разновидностей форматов, поддерживаемых ранее (например, добавлена поддержка bcrypt-pbkdf для OpenBSD softraid) и многое другое. В общей сложности, добавлено 80 форматов на CPU и 47 на OpenCL. Общее количество форматов теперь 407 на CPU (или 262 не включая «dynamic» форматы, настраиваемые из файлов конфигурации) и 88 на OpenCL.
  • Отказ от поддержки языка CUDA в пользу OpenCL, что ничуть не мешает полноценному использованию GPU от NVIDIA (и даже помогает, благодаря фокусированию разработки и оптимизаций на одну реализацию каждого формата под GPU вместо двух реализаций ранее).
  • Поддержка новых наборов инструкций SIMD — AVX2, AVX-512 (в том числе для второго поколения Xeon Phi) и MIC (для первого поколения) -, а также более универсальное и полное использование SIMD в реализациях многих форматов, включая применение ранее поддерживаемых наборов инструкций вплоть до AVX и XOP на x86(-64) и NEON, ASIMD и AltiVec на ARM, Aarch64 и POWER, соответственно.
  • Многочисленные оптимизации для CPU и OpenCL, как для более эффективной работы с большим количеством хешей одновременно (например, проверялась загрузка 320 миллионов хешей SHA-1 на GPU), так и для повышения скорости вычисления хешей. Часть из этих оптимизаций универсальные, часть охватывает различные подмножества форматов, а многие специфичны для отдельных форматов.
  • (Авто-)настройка оптимальной буферизации проверяемых паролей на CPU (»--tune=auto --verbosity=5») и оптимальных размерностей задания на OpenCL (включена по умолчанию), в том числе с учетом медленного выхода на полную рабочую частоту GPU серии NVIDIA GTX 10xx и новее. Использование реально загруженных хешей и реальной длины проверяемых паролей (когда она известна заранее) для такой авто-настройки.
  • Добавление компилятора «динамических выражений», указываемых прямо на командной строке и реализующих новые гибридные типы хешей, например »--format=dynamic='sha1(md5($p).$s)'», вычисляемые на CPU с использованием SIMD. В качестве компонентов таких выражений поддерживаются десятки быстрых хешей (от распространенных вроде MD5 до умеренно экзотических вроде Whirlpool), объединение подстрок, кодирование и декодирование, преобразование регистра символов, ссылки на пароль, соль, имя пользователя и строковые константы.
  • Устранение нежелательных отличий от hashcat, в том числе поддержка ранее специфичных для hashcat правил (wordlist rule commands), переход на нумерацию OpenCL устройств с 1-го, применение по умолчанию тех же длин паролей (обычно длина 7) при тестах производительности.
  • Новые режимы генерирования проверяемых паролей (cracking modes), включая PRINCE из hashcat (формирует «фразы», объединяя несколько слов в порядке возрастания суммарной длины), subsets (подбирает пароли с недостаточным количеством различных символов, даже если эти символы пришли из большого набора возможных) и hybrid external (позволяет внешним режимам, описываемым в файлах конфигурации на Си-подобном языке, формировать много проверяемых паролей на основе каждого базового «слова», поступившего от другого режима). Также добавлено несколько новых предопределенных внешних режимов.
  • Дополнительные возможности по использованию нескольких режимов одновременно (один поверх другого — stacking), а также по такому использованию наборов правил (wordlist rules stacking).
  • Усовершенствования режимов mask (постепенное растягивание маски в указанном диапазоне длин, применение маски на стороне OpenCL-устройства или платы FPGA) и single crack (разумное поведение на устройствах, вычисляющих большое количество хешей параллельно, на что ранее в этом режиме не хватало проверяемых паролей, а также ограничения на расход памяти).
  • Много улучшений, связанных с поддержкой Unicode и других кодировок в разных подсистемах.
  • Много улучшений программ *2john (преобразующих файлы разных форматов для использования с john), в особенности wpapcap2john (обрабатывает WiFi трафик).
  • Много новых опций командной строки, настроек в john.conf, опций configure-скрипта и соответствующие им новые возможности, далеко не все из которых удалось упомянуть здесь.
  • Повышение качества кода благодаря встроенной поддержке отладочных сборок с AddressSanitizer (была ранее) и UndefinedBehaviorSanitizer (добавлена), добавлению встроенного фаззера форматов (в рамках GSoC 2015), применению непрерывной интеграции (сборки под десятки сочетаний операционной системы и компилятора и тестирование в них корректной поддержки всех форматов).

© OpenNet