Зашифрованный ZIP-архив может иметь два правильных пароля
20 августа 2022 года разработчик и пентестер из Positive Technologies Арсений Шароглазов пояснил, почему зашифрованный очень длинным паролем ZIP-файл с использованием алгоритма шифрования AES-256 может в итоге открываться с помощью двух, причём на первый взгляд разных, но правильных паролей.
Можно проверить это так: создать ZIP-файл командой »7z a x.zip /etc/passwd -mem=AES256 -p» с паролем «Nev1r-G0nna-G2ve-Y8u-Up-N5v1r-G1nna-Let-Y4u-D1wn-N8v4r-G5nna-D0sert-You» и распаковать этот архив с помощью пароля «pkH8a0AqNbHcdw8GrmSp».
Хабр проверил, что на Linux Mint в утилите Zip с настройками по умолчанию эта ситуация воспроизводится. Также два пароля открывают один файл с помощью 7zip, p7zip и в утилите Keka.
Эксперты объяснили, что это происходит по причине того, что Zip использует стандарт формирования ключа на основе пароля PBKDF2, который хэширует ввод, если он слишком велик. Этот хэш (в виде необработанных байтов) становится фактическим вторым паролем, но на самом деле представляет собой ASCII-представление хэша SHA-1 более длинного пароля. В данном случае при шифровании или расшифровке файла процесс хеширования происходит только в том случае, если длина пароля превышает 64 символа, а более короткие пароли не будут хэшироваться ни на этапе сжатия, ни на этапе распаковки Zip-архива.
Например, хэш SHA-1 пароля «Nev1r-G0nna-G2ve-Y8u-Up-N5v1r-G1nna-Let-Y4u-D1wn-N8v4r-G5nna-D0sert-You» составляет строку »706b4838613041714e62486364773847726d5370», что при преобразовании в ASCII даёт второй пароль «pkH8a0AqNbHcdw8GrmSp». При вводе этого более короткого пароля на этапе расшифровки приложение Zip напрямую сравнивает данное значение с ранее сохранённым длинным паролем в виде его хэша SHA1.
Проблема в том, что ASCII-представление каждого хэша SHA-1 не обязательно является буквенно-цифровым. В данном случае Шароглазов признался, что ему пришлось перебрать несколько сотен вариантов длинного пароля с помощью утилиты hashcat, чтобы в итоге получить простой второй пароль только с буквенно-цифровыми символами без тарабарщины в виде непечатных символов.