Уязвимость в PuTTY, позволяющая восстановить закрытый ключ пользователя

В PuTTY, клиенте для протокола SSH, пользующегося популярностью на платформе Windows, выявлена опасная уязвимость (CVE-2024-31497), позволяющая воссоздать закрытый ключ пользователя, сгенерированный с использованием алгоритма ECDSA с эллиптической кривой NIST P-521 (ecdsa-sha2-nistp521). Для подбора закрытого ключа достаточно проанализировать примерно 60 цифровых подписей, сформированных проблемным ключом.

Уязвимость проявляется начиная с версии PuTTY 0.68 и также затронула продукты, в состав которых включены уязвимые версии PuTTY, например, FileZilla (3.24.1 – 3.66.5), WinSCP (5.9.5 – 6.3.2), TortoiseGit (2.4.0.2 – 2.15.0) и TortoiseSVN (1.10.0 – 1.14.6). Проблема устранена в обновлениях PuTTY 0.81, FileZilla 3.67.0, WinSCP 6.3.3 и TortoiseGit 2.15.0.1.
После установки обновления пользователям рекомендуется сгенерировать новые ключи и удалить старые открытые ключи из файлов authorized_keys.

Уязвимость вызвана беспечностью разработчиков, которые для генерации 521-битного ключа использовали вектор инициализации (nonce) на основе 512-битной случайной последовательности, вероятно, посчитав что энтропии в 512 бит будет достаточно и оставшиеся 9 бит не имеют принципиального значения. В итоге, во всех закрытых ключах, созданных в PuTTY с использованием алгоритма ecdsa-sha2-nistp521, первые 9 бит вектора инициализации всегда принимали нулевые значения.

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

Необходимые цифровые подписи можно получить, например, при подключении пользователя к SSH-серверу атакующего или к Git-серверу, использующему SSH в качестве транспорта. Необходимые для атаки подписи также можно узнать, если ключ использовался для заверения произвольных данных, например, git-коммитов при применении SSH-агента Pageant для перенаправления трафика на хост разработчика.
Получение необходимых для восстановления ключа данных в ходе MITM-атаки исключено, так как подписи в SSH не передаются в открытом виде.

Отмечается, что похожее использование неполных векторов инициализации применялось в PuTTY и для других видов эллиптических кривых, но для алгоритмов, отличных от ECDSA P-521, возникших утечек информации недостаточно для реализации работающей атаки по восстановлению ключа. Ключи ECDSA другого размера и ключи Ed25519 атаке не подвержены.

Release. Ссылка here.