RDRAND
(для «read random») — инструкция для возврата случайных чисел из встроенного в чип аппаратного генератора случайных чисел Intel , который был затравлен встроенным источником энтропии. [1] Также известна как Intel Secure Key Technology , [2] под кодовым названием Bull Mountain . [3] Intel представила эту функцию около 2012 года, а AMD добавила поддержку инструкции в июне 2015 года. ( доступна в процессорах Ivy Bridge [a] и является частью архитектур набора инструкций Intel 64 и IA-32 .) [5]RDRAND
Генератор случайных чисел соответствует стандартам безопасности и криптографии, таким как NIST SP 800-90A , [6] FIPS 140-2 и ANSI X9.82. [1] Intel также запросила Cryptography Research Inc. провести проверку генератора случайных чисел в 2012 году, что привело к публикации статьи « Анализ цифрового генератора случайных чисел Ivy Bridge компании Intel» . [7]
RDSEED
похож на RDRAND
и обеспечивает низкоуровневый доступ к аппаратному обеспечению, генерирующему энтропию. RDSEED
Генератор и инструкция процессора rdseed
доступны в процессорах Intel Broadwell [8] и AMD Zen . [9]
Инструкцию CPUID
можно использовать как на процессорах AMD, так и на процессорах Intel , чтобы проверить, RDRAND
поддерживается ли инструкция. Если поддерживается, бит 30 регистра ECX устанавливается после вызова стандартной функции CPUID 01H
. [10] Процессоры AMD проверяются на наличие функции с помощью того же теста. [11] RDSEED
Доступность может быть проверена на процессорах Intel аналогичным образом. Если RDSEED
поддерживается, бит 18 регистра EBX устанавливается после вызова стандартной функции CPUID 07H
. [12]
Код операции для RDRAND
— 0x0F 0xC7
, за которым следует байт ModRM, указывающий целевой регистр, и опционально объединенный с префиксом REX в 64-битном режиме. [13]
Intel Secure Key — это название Intel как для инструкцииRDRAND
, так и для базовой аппаратной реализации генератора случайных чисел (RNG), [1] которая во время разработки имела кодовое название «Bull Mountain». [14] Intel называет свой RNG «цифровым генератором случайных чисел» или DRNG. Генератор берет пары 256-битных необработанных образцов энтропии, сгенерированных аппаратным источником энтропии , и применяет их к кондиционеру Advanced Encryption Standard (AES) (в режиме CBC-MAC ), который сводит их к одному 256-битному условному образцу энтропии. Детерминированный генератор случайных битов, называемый CTR DRBG, определенный в NIST SP 800-90A, задается выходными данными кондиционера, предоставляя криптографически безопасные случайные числа приложениям, запрашивающим их через RDRAND
инструкцию. [1] [14] Аппаратное обеспечение выдаст максимум 511 128-битных образцов перед изменением начального значения. Использование RDSEED
операции обеспечивает доступ к кондиционированным 256-битным выборкам из AES-CBC-MAC.
Инструкция RDSEED
была добавлена в Intel Secure Key для заполнения другого генератора псевдослучайных чисел, [15] доступного в процессорах Broadwell . Источник энтропии для RDSEED
инструкции работает асинхронно на самосинхронизирующейся схеме и использует тепловой шум внутри кремния для вывода случайного потока битов со скоростью 3 ГГц, [16] медленнее, чем эффективные 6,4 Гбит/с, получаемые из RDRAND
(обе скорости распределяются между всеми ядрами и потоками ). [17] Инструкция RDSEED
предназначена для заполнения программного PRNG произвольной ширины, тогда как RDRAND
предназначен для приложений, которым просто требуются высококачественные случайные числа. Если криптографическая безопасность не требуется, программный PRNG, такой как Xorshift, обычно быстрее. [18]
На процессоре Intel Core i7-7700K, 4500 МГц (45 × 100 МГц) (микроархитектура Kaby Lake-S) одна инструкция RDRAND
or RDSEED
занимает 110 нс или 463 такта, независимо от размера операнда (16/32/64 бита). Это количество тактов применимо ко всем процессорам с микроархитектурой Skylake или Kaby Lake . На процессорах с микроархитектурой Silvermont каждая из инструкций занимает около 1472 тактов, независимо от размера операнда; а на процессорах Ivy BridgeRDRAND
занимает до 117 тактов. [19]
На процессоре AMD Ryzen каждая инструкция занимает около 1200 тактов для 16-битного или 32-битного операнда и около 2500 тактов для 64-битного операнда. [19]
Астрофизический симулятор Монте-Карло исследовал время генерации 10 7 64-битных случайных чисел с использованием RDRAND
четырехъядерного процессора Intel i7-3740 QM. Они обнаружили, что реализация C RDRAND
работала примерно в 2 раза медленнее, чем генератор случайных чисел по умолчанию в C, и примерно в 20 раз медленнее, чем Mersenne Twister . Хотя модуль Python RDRAND
был создан, было обнаружено, что он в 20 раз медленнее, чем генератор случайных чисел по умолчанию в Python, [20] хотя сравнение производительности между PRNG и CSPRNG не может быть сделано.
Обновление микрокода, выпущенное Intel в июне 2020 года, предназначенное для смягчения уязвимости CrossTalk (см. раздел «Проблемы безопасности» ниже), негативно влияет на производительность RDRAND
и RDSEED
из-за дополнительных мер безопасности. На процессорах с примененными мерами смягчения каждая затронутая инструкция вызывает дополнительную задержку, а одновременное выполнение ядер RDRAND
или RDSEED
между ними фактически сериализуется. Intel представила механизм для смягчения этих проверок безопасности, тем самым уменьшая влияние на производительность в большинстве сценариев, но процессоры Intel не применяют это смягчение безопасности по умолчанию. [21]
Visual C++ 2015 предоставляет встроенную поддержку обертки для функций RDRAND
и RDSEED
. [22] GCC 4.6+ и Clang 3.2+ предоставляют встроенные функции для RDRAND
случая, когда -mrdrnd
указано во флагах , [23] также настройка __RDRND__
для разрешения условной компиляции . Более новые версии дополнительно предоставляют immintrin.h
возможность оборачивать эти встроенные функции в функции, совместимые с версией 12.1+ компилятора Intel C. Эти функции записывают случайные данные в местоположение, на которое указывает их параметр, и возвращают 1 в случае успеха. [24]
Это возможность генерировать криптографически безопасные случайные числа с использованием OpenSSL иRDRAND
для обеспечения безопасности коммуникаций.RDSEED
Научное применение RDRAND
в симуляторе Монте-Карло было оценено с упором на производительность и воспроизводимость по сравнению с другими генераторами случайных чисел. Это привело к выводу, что использование RDRAND
в противовес Mersenne Twister не дает других результатов, но худшую производительность и воспроизводимость. [25] [20]
В сентябре 2013 года в ответ на статью в New York Times, раскрывающую усилия АНБ по ослаблению шифрования , [26] Теодор Цо публично опубликовал сообщение об использовании RDRAND
for /dev/random
в ядре Linux : [27]
Я так рад, что не поддался давлению инженеров Intel, которые хотели, чтобы я
/dev/random
полагался только наRDRAND
инструкцию. Цитата из [статьи New York Times [26] ]: «К этому году проект Sigint Enabling Project нашел пути проникновения в некоторые чипы шифрования, которые шифруют информацию для предприятий и правительств, либо работая с производителями чипов для вставки бэкдоров...» Полагаться исключительно на аппаратный генератор случайных чисел, использующий реализацию, запечатанную внутри чипа, который невозможно проверить, — ПЛОХАЯ идея.
Линус Торвальдс отклонил опасения по поводу использования RDRAND
в ядре Linux и указал, что он не используется как единственный источник энтропии для /dev/random
, а скорее используется для улучшения энтропии путем объединения значений, полученных от RDRAND
с другими источниками случайности. [28] [29] Однако Тейлор Хорнби из Defuse Security продемонстрировал, что генератор случайных чисел Linux может стать небезопасным, если в инструкцию будет внедрен бэкдор RDRAND
, который специально нацелен на код, использующий его. Реализация доказательства концепции Хорнби работает на немодифицированном ядре Linux до версии 3.13. [30] [31] [32] Проблема была смягчена в ядре Linux в 2013 году. [33]
Разработчики изменили ядро FreeBSDRDRAND
, отказавшись от использования VIA PadLock напрямую, с комментарием: «Для FreeBSD 10 мы собираемся вернуться назад и удалить бэкэнды RDRAND
Padlock и передать их в Yarrow вместо того, чтобы доставлять их вывод напрямую в /dev/random . По-прежнему будет возможен доступ к аппаратным генераторам случайных чисел, то есть RDRAND
, Padlock и т. д., напрямую с помощью встроенной ассемблерной сборки или с помощью OpenSSL из пользовательского пространства, если это необходимо, но мы больше не можем им доверять». [28] [34] FreeBSD /dev/random использует Fortuna и RDRAND, начиная с FreeBSD 11. [35]
9 июня 2020 года исследователи из Амстердамского свободного университета опубликовали атаку по сторонним каналам под названием CrossTalk (CVE-2020-0543), которая затронула RDRAND
ряд процессоров Intel. [36] Они обнаружили, что выходные данные аппаратного цифрового генератора случайных чисел (DRNG) хранились в промежуточном буфере, который был общим для всех ядер. Уязвимость позволяла вредоносному коду, работающему на уязвимом процессоре, считывать RDRAND
и RDSEED
инструктировать результаты из приложения-жертвы, работающего на другом ядре того же процессора, включая приложения, работающие внутри анклавов Intel SGX . [36] Исследователи разработали эксплойт для проверки концепции [37] , который извлекал полный ключ ECDSA из анклава SGX, работающего на отдельном ядре ЦП, всего за одну операцию подписи. [36] Уязвимость затрагивает сценарии, в которых ненадежный код работает вместе с доверенным кодом на одном процессоре, например, в среде общего хостинга.
Intel называет уязвимость CrossTalk специальной выборкой данных из буфера регистра (SRBDS). В ответ на исследование Intel выпустила обновления микрокода для смягчения проблемы. Обновленный микрокод гарантирует, что доступ вне ядра задерживается до тех пор, пока не будут завершены конфиденциальные операции, в частности инструкции RDRAND
, RDSEED
и EGETKEY
, и не будет перезаписан промежуточный буфер. [21] Атака SRBDS также затрагивает другие инструкции, такие как те, которые считывают MSR , но Intel не применила к ним дополнительные меры безопасности из-за проблем с производительностью и сниженной необходимости в конфиденциальности результатов этих инструкций. [21] Был затронут широкий спектр процессоров Intel, выпущенных в период с 2012 по 2019 год, включая настольные, мобильные и серверные процессоры. [38] Сами меры по смягчению привели к отрицательному влиянию на производительность при использовании затронутых инструкций, особенно при параллельном выполнении многопоточными приложениями из-за увеличенной задержки, вызванной проверками безопасности и эффективной сериализацией затронутых инструкций по ядрам. Intel представила опцию отказа, настраиваемую через IA32_MCU_OPT_CTRL
MSR на каждом логическом процессоре, которая повышает производительность за счет отключения дополнительных проверок безопасности для инструкций, выполняемых за пределами анклава SGX. [21]
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь )Все процессоры Intel, поддерживающие инструкцию RDRAND, указывают на доступность инструкции RDRAND, сообщая CPUID.01H:ECX.RDRAND[bit 30] = 1
инструкции RDRAND необязательна. На процессорах, поддерживающих эту инструкцию, CPUID Fn0000_0001_ECX[RDRAND] = 1
Все процессоры Intel, поддерживающие инструкцию RDSEED, указывают на доступность инструкции RDSEED, сообщая CPUID.(EAX=07H, ECX=0H):EBX.RDSEED[бит 18] = 1
RDRAND
. С другой стороны, качество RDRAND
чисел должно быть выше, чем у программного PRNG, такого как Xorshift.