CVE-2021-41117
Небезопасная генерация случайных чисел
- Опубликовано
- 11 окт. 2021 г.
- Обновлено
- 4 авг. 2024 г.
- Назначение CNA
- GitHub_M
- Наблюдены доказательства
- 8 авг. 2026 г.
Первичный CVSS
nvd · CVSS 3.1
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:NНизкий · следующие 30 дней
- Процентиль
- 87,1 %
- Дата модели
- 21 сент. 2026 г.
EPSS – это статистическая оценка, а не достоверность или мера воздействия. Объедините это с CVSS, статусом KEV, воздействием и вашей средой.
Резюме
keypair — это генератор RSA PEM-ключей, написанный на JavaScript. keypair реализует множество криптографических примитивов самостоятельно или заимствуя их из других библиотек, где это возможно, включая node-forge. Была обнаружена проблема: эта библиотека генерировала идентичные RSA-ключи, используемые в SSH. Это означало бы, что библиотека генерирует одинаковые значения P, Q (а значит, и N), что на практике невозможно для ключей RSA-2048. Повторяющаяся генерация одинаковых значений обычно указывает на проблему с плохой генерацией случайных чисел или некорректную обработкой вывода CSPRNG. Проблема 1: Плохая генерация случайных чисел (`GHSL-2021-1012`). Библиотека не полностью полагается на CSPRNG, предоставляемый платформой, а использует собственный подход на основе счётчика CMAC. Проблема возникает при посеве реализации CMAC «истинно» случайными данными в функции `defaultSeedFile`. Чтобы заполнить генератор AES-CMAC, библиотека использует два разных подхода в зависимости от среды выполнения JavaScript. В браузере библиотека использует [`window.crypto.getRandomValues()`](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L971). Однако в среде выполнения nodeJS объект `window` не определён, поэтому используется гораздо менее безопасное решение, в котором к тому же есть ошибка. Похоже, что библиотека пытается использовать CSPRNG Node, когда это возможно, но, к сожалению, объект `crypto` равен `null`, потому что переменная с таким же именем была объявлена и установлена в `null`. Таким образом, путь с CSPRNG Node никогда не выполняется. Однако, когда `window.crypto.getRandomValues()` недоступен, для заполнения счётчика CMAC используется генератор псевдослучайных чисел Lehmer LCG, который инициализируется с помощью `Math.random`. Хотя это плохая практика и сама по себе, вероятно, является уязвимостью, она не объясняет экстремальную частоту появления дублирующихся ключей. Основной недостаток: вывод Lehmer LCG кодируется некорректно. Конкретная [строка](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L1008) с ошибкой: `b.putByte(String.fromCharCode(next & 0xFF))`. [Определение](https://github.com/juliangruber/keypair/blob/87c62f255baa12c1ec4f98a91600f82af80be6db/index.js#L350-L352) `putByte` выглядит так: `util.ByteBuffer.prototype.putByte = function(b) {this.data += String.fromCharCode(b);};`. Если упростить, это `String.fromCharCode(String.fromCharCode(next & 0xFF))`. Двойное `String.fromCharCode` почти наверняка непреднамеренно и является источником слабого заполнения. К сожалению, это не приводит к ошибке. Вместо этого большая часть буфера содержит нули. Поскольку мы маскируем с помощью 0xFF, можно определить, что 97% вывода LCG преобразуются в нули. Единственные выходные значения, которые дают значимые результаты, — это значения с 48 по 57 включительно. Влияние заключается в том, что каждый байт в seed ГПСЧ имеет 97% вероятность быть нулём из-за некорректного преобразования. Когда это не так, байты равны от 0 до 9. В итоге есть три непосредственные проблемы: 1. Библиотека имеет небезопасный запасной путь генерации случайных чисел. В идеале библиотека должна требовать надёжный CSPRNG вместо попытки использовать LCG и `Math.random`. 2. Библиотека некорректно использует надёжный генератор случайных чисел при работе в NodeJS, даже несмотря на наличие сильного CSPRNG. 3. В запасном пути есть проблема в реализации, из-за которой большая часть seed-данных фактически будет нулями. Из-за плохой генерации случайных чисел keypair создаёт RSA-ключи, которые относительно легко угадать. Это может позволить злоумышленнику расшифровать конфиденциальные сообщения или получить несанкционированный доступ к учётной записи жертвы.
Ответственное использование
Используйте информацию об уязвимостях только в тех системах, которыми вы владеете или имеете право тестировать. Kitploit ссылается на метаданные общедоступных исследований и не хранит код эксплойта или вредоносные полезные данные.