“Блокирующие” источники случайности в операционных системах
Случайные числа, – которые, чаще, псевдослучайные, – сейчас нужны всюду. В том числе, при нормальном функционировании операционных систем, что порождает занимательные случаи. Например, мне приходилось сталкиваться со следующим “загадочным явлением”: после установки на достаточно старый, но с некоторыми аппаратными обновлениями (см. ниже, это важный момент), компьютер современной версии ОС на базе Linux (насколько помню, Debian 10), не удаётся зайти в только что сконфигурированную систему при помощи SSH с удалённого узла. SSH-сервер просто не отвечает. Локально, подключив монитор и клавиатуру, зайти можно и выглядит всё хорошо: конфигурация верная, всё работает. Самое загадочное: если после того, как кто-то повозился с локальной консолью, попробовать подключиться по SSH удалённо, то всё прекрасно работает.
Разгадка cледующая. SSH-серверу просто не хватало локальной случайности – то есть, системного источника случайных чисел (/dev/random). Дело в том, что ядро (Linux) собирает энтропию для процесса, генерирующего (псевдо)случайные числа, так сказать, с доступной аппаратуры. В более или менее современных системах проблем с обильными источниками аппаратной энтропии нет, так или иначе, а вот если в очень старую систему на процессоре Intel поставить вместо шпиндельного винчестера SSD-накопитель, да отключить клавиатуру и видеокарту, то энтропии становится мало и её съедает само ядро при загрузке себя и сопутствующих модулей (напомню, что там есть всякие хитрые методы “рандомизации адресации”, направленные, как бы, на запутывание атакующих). Так как SSH-сервер использовал блокирующий вызов для получения случайных чисел (/dev/random вместо неблокирующего /dev/urandom), то ему приходилось ждать, пока накопится достаточно энтропии. SSH-серверу случайные числа нужны для криптографических операций, поэтому он и не мог принять входящее соединение. А вот если кто-то подключил клавиатуру, да ещё повозился в консоли, то энтропии становилось больше, хватало и для SSH. Чинится это либо установкой специального пакета типа haveged, который генерирует дополнительную энтропию программно (или программно-аппаратно, если хотите), либо добавлением аппаратного источника энтропии. Сейчас проблема менее актуальна: в дистрибутивы для платформ, где с получением энтропии трудности, haveged или подобное решение стали включать автоматически.
Вообще, отсутствие в системе хорошего источника энтропии выглядит особенно пугающе, когда речь идёт о криптографических операциях. Так, в ECDSA критически важный случайный параметр используется при вычислении каждой подписи. Если ваша программная система работает, скажем, в виртуальной машине, то с качеством случайности могут быть проблемы. Эти проблемы, несколько неожиданным для неспециалиста образом, могут привести к утечке ключей (касается не только ECDSA, но и ГОСТ-подписи). Это одна из важных причин того, что уже существует более современная версия ECDSA, где параметр подписи определяется детерминированным способом (но это отдельная история). Поэтому обычно приходится применять всякие хитрости, позволяющие подмешивать дополнительную энтропию алгоритмически, например, при помощи симметричного шифра и счётчика. Лучший способ, конечно, это использовать клавиатурный ввод от человека. (Впрочем, степень детерминированности ударов по клавишам, выполняемых человеком, это вопрос дискуссионный – как на техническом, так и на философском уровне.)
Адрес записки: https://dxdt.ru/2023/02/21/9605/
Похожие записки:
- DNS-over-TLS как инструмент трансляции доверия в DNSSEC
- Маскирование криптографических ключей в памяти
- Техническое: ключи DNSSEC и их теги
- "Двухфакторная" аутентификация и Google Authenticator
- Дорисовывание Луны смартфонами Samsung
- ECDSA и общий ГОСТ-ключ
- Реплика: пропуск подписанного трафика и цифровые идентификаторы в будущем
- Статья о Certificate Transparency
- Кибернетический след в "Илиаде" и цветовой сдвиг
- Падение тел в физике Аристотеля
- Некоммутативные апельсины или задача для младших школьников
Комментарии читателей блога: 2
1. 23rd February 2023, 08:42 // Читатель Nataraj написал:
Я тут в связи с /dev/random и источниками энтропии немного ударил в грязь лицом…
Рассказывал ученику про разницу между random и urandom. В процессе стал показывать как cat /dev/random быстро съедает всю накопленную энтропию и задумывается… А оно, собака такая, выплевывает случайные числа бесконечно… Весь поучительный эффект коту под хвост.
Потом разобрался что в моем новом ноуте процессор в который источник энтропии типа встроен и бесконечный… Но был весьма озадачен в процессе…
2. 23rd February 2023, 10:27 // Александр Венедюхин:
Это да, тут требуется либо старое десктопное оборудование, либо какая-нибудь встроенная система, не самая современная. В описанном случае, насколько я помню, был ПК где-то 2008-2010 года, то ли на базе i5 из самых первых поколений, то ли даже Core 2 Duo. (Ну и чтобы там кто-нибудь не установил дополнительный модуль-источник.)
Написать комментарий