RDRAND
(para "lectura aleatoria"; conocida como Intel Secure Key Technology , [1] anteriormente conocida como Bull Mountain [2] ) es una instrucción para devolver números aleatorios de un generador de números aleatorios de hardware en chip Intel que ha sido sembrado por un -chip fuente de entropía. [3] está disponible en los procesadores Ivy Bridge [a] y es parte de las arquitecturas de conjuntos de instrucciones Intel 64 e IA-32 . AMD agregó soporte para la instrucción en junio de 2015. [5] RDRAND
El generador de números aleatorios cumple con los estándares de seguridad y criptográficos como NIST SP 800-90A , [6] FIPS 140-2 y ANSI X9.82 . [3] Intel también solicitó a Cryptography Research Inc. que revisara el generador de números aleatorios en 2012, lo que resultó en el análisis en papel del Generador digital de números aleatorios Ivy Bridge de Intel . [7]
RDSEED
es similar RDRAND
y proporciona acceso de nivel inferior al hardware generador de entropía. Las RDSEED
instrucciones del generador y del procesador rdseed
están disponibles con las CPU Intel Broadwell [8] y las CPU AMD Zen . [9]
Descripción general
La CPUID
instrucción se puede utilizar en CPU AMD e Intel para verificar si la RDRAND
instrucción es compatible. Si es así, el bit 30 del registro ECX se establece después de llamar a la función estándar CPUID 01H
. [10] Se verifica la característica de los procesadores AMD usando la misma prueba. [11] la RDSEED
disponibilidad se puede verificar en las CPU Intel de manera similar. Si RDSEED
es compatible, el bit 18 del registro EBX se establece después de llamar a la función estándar CPUID 07H
. [12]
El código de operación para RDRAND
es 0x0F 0xC7
, seguido de un byte ModRM que especifica el registro de destino y, opcionalmente, se combina con un prefijo REX en modo de 64 bits. [13]
Intel Secure Key es el nombre de Intel tanto para la RDRAND
instrucción como para la implementación de hardware subyacente del generador de números aleatorios (RNG), [3] que recibió el nombre en código "Bull Mountain" durante el desarrollo. [14] Intel llama a su RNG un "generador de números aleatorios digitales" o DRNG. El generador toma pares de muestras de entropía sin procesar de 256 bits generadas por la fuente de entropía de hardware y las aplica a un acondicionador de Estándar de cifrado avanzado (AES) (en modo CBC-MAC ) que las reduce a una sola muestra de entropía condicionada de 256 bits. Un generador de bits aleatorios determinista llamado CTR_DRBG definido en NIST SP 800-90A es sembrado por la salida del acondicionador, proporcionando números aleatorios criptográficamente seguros a las aplicaciones que los solicitan a través de la RDRAND
instrucción. [3] [14] El hardware emitirá un máximo de 511 muestras de 128 bits antes de cambiar el valor de inicialización. El uso de la RDSEED
operación proporciona acceso a las muestras acondicionadas de 256 bits del AES-CBC-MAC.
La RDSEED
instrucción se agregó a Intel Secure Key para sembrar otro generador de números pseudoaleatorios, [15] disponible en las CPU de Broadwell . La fuente de entropía de la RDSEED
instrucción se ejecuta de forma asíncrona en un circuito temporizado y utiliza ruido térmico dentro del silicio para generar un flujo aleatorio de bits a una velocidad de 3 GHz, [16] más lento que los 6,4 Gbit / s efectivos que se pueden obtener de RDRAND
(ambos las tasas se comparten entre todos los núcleos y subprocesos ). [17] La RDSEED
instrucción está destinada a sembrar un PRNG de software de ancho arbitrario, mientras que RDRAND
está destinada a aplicaciones que simplemente requieren números aleatorios de alta calidad. Si no se requiere seguridad criptográfica, un software PRNG como Xorshift suele ser más rápido. [18]
Actuación
En un Core i7-7700K Intel, 4500 MHz (45 x 100 MHz) procesador (Kaby Lago-S microarquitectura), una sola RDRAND
o RDSEED
instrucción se lleva a 110ns o 463 ciclos de reloj, sin importar el tamaño de operando (16/32/64 bits). Este número de ciclos de reloj se aplica a todos los procesadores con microarquitectura Skylake o Kaby Lake . En los procesadores de microarquitectura Silvermont , cada una de las instrucciones toma alrededor de 1472 ciclos de reloj, independientemente del tamaño del operando; y en los procesadores Ivy BridgeRDRAND
tarda hasta 117 ciclos de reloj. [19]
En una CPU AMD Ryzen, cada una de las instrucciones toma alrededor de 1200 ciclos de reloj para un operando de 16 o 32 bits, y alrededor de 2500 ciclos de reloj para un operando de 64 bits. [19]
Un simulador astrofísico de Monte Carlo examinó el tiempo necesario para generar 10 7 números aleatorios de 64 bits utilizando RDRAND
un procesador Intel i7-3740 QM de cuatro núcleos. Descubrieron que una implementación de C RDRAND
funcionaba aproximadamente 2 veces más lento que el generador de números aleatorios predeterminado en C, y aproximadamente 20 veces más lento que el Mersenne Twister . Aunque RDRAND
se ha construido un módulo de Python , se encontró que era 20 veces más lento que el generador de números aleatorios predeterminado en Python, [20] aunque no se puede hacer una comparación de rendimiento entre un PRNG y un CSPRNG .
Una actualización de microcódigo publicada por Intel en junio de 2020, diseñada para mitigar la vulnerabilidad de CrossTalk (consulte la sección de problemas de seguridad a continuación), impacta negativamente el rendimiento RDRAND
y RDSEED
debido a controles de seguridad adicionales. En los procesadores con las mitigaciones aplicadas, cada instrucción afectada incurre en una latencia adicional y la ejecución simultánea de RDRAND
o RDSEED
entre núcleos se serializa de manera efectiva. Intel introdujo un mecanismo para relajar estos controles de seguridad, reduciendo así el impacto en el rendimiento en la mayoría de los escenarios, pero los procesadores Intel no aplican esta relajación de seguridad de forma predeterminada. [21]
Compiladores
Visual C ++ 2015 proporciona compatibilidad de contenedor intrínseco para las funciones RDRAND
y RDSEED
. [22] GCC 4.6+ y Clang 3.2+ proporcionan funciones intrínsecas para RDRAND
cuando se especifica -mrdrnd en las banderas , [23] también configuran __RDRND__ para permitir la compilación condicional . Las versiones más nuevas también proporcionan la immintrin.h
posibilidad de envolver estos elementos integrados en funciones compatibles con la versión 12.1+ del compilador C de Intel. Estas funciones escriben datos aleatorios en la ubicación a la que apunta su parámetro y devuelven 1 en caso de éxito. [24]
Aplicaciones
Es una opción para generar números aleatorios criptográficamente seguros usando RDRAND
y RDSEED
en OpenSSL, para ayudar a proteger las comunicaciones.
Una aplicación científica de RDRAND
se puede encontrar en astrofísica. [25] Las observaciones de radio de estrellas de baja masa y enanas marrones han revelado que algunas de ellas emiten ráfagas de ondas de radio. Estas ondas de radio son causadas por reconexión magnética , el mismo proceso que causa las erupciones solares en el Sol. RDRAND
se utilizó para generar grandes cantidades de números aleatorios para un simulador de Monte Carlo , para modelar las propiedades físicas de las enanas marrones y los efectos de los instrumentos que las observan. Descubrieron que alrededor del 5% de las enanas marrones son lo suficientemente magnéticas para emitir fuertes ráfagas de radio. También evaluaron el rendimiento de la RDRAND
instrucción en C y Python en comparación con otros generadores de números aleatorios. [20]
Recepción
En septiembre de 2013, en respuesta a un artículo del New York Times que revelaba el esfuerzo de la NSA por debilitar el cifrado , [26] Theodore Ts'o publicó públicamente sobre el uso de RDRAND
for /dev/random
en el kernel de Linux : [27]
Estoy muy contento de haber resistido la presión de los ingenieros de Intel para
/dev/random
confiar solo en lasRDRAND
instrucciones. Para citar el [artículo del New York Times [26] ]: 'Para este año, el Proyecto de Habilitación de Sigint había encontrado formas dentro de algunos de los chips de cifrado que codifican información para empresas y gobiernos, ya sea trabajando con fabricantes de chips para insertar puertas traseras. .. 'Confiar únicamente en el generador de números aleatorios de hardware que utiliza una implementación sellada dentro de un chip que es imposible de auditar es una MALA idea.
Linus Torvalds descartó las preocupaciones sobre el uso de RDRAND
en el kernel de Linux y señaló que no se usa como la única fuente de entropía /dev/random
, sino que se usa para mejorar la entropía al combinar los valores recibidos RDRAND
con otras fuentes de aleatoriedad. [28] [29] Sin embargo, Taylor Hornby de Defuse Security demostró que el generador de números aleatorios de Linux podría volverse inseguro si se introduce una puerta trasera en la RDRAND
instrucción que se dirige específicamente al código que lo usa. La implementación de prueba de concepto de Hornby funciona en un kernel de Linux sin modificar antes de la versión 3.13. [30] [31] [32] El problema se solucionó en el kernel de Linux en 2013. [33]
Los desarrolladores cambiaron el kernel de FreeBSD para dejar de usar RDRAND
y VIA PadLock directamente con el comentario "Para FreeBSD 10, vamos a retroceder y eliminar los RDRAND
backends de Padlock y alimentarlos en Yarrow en lugar de entregar su salida directamente a / dev / random . será posible acceder a generadores de números aleatorios de hardware, es decir, RDRAND
Candado, etc., directamente mediante ensamblaje en línea o utilizando OpenSSL desde el área de usuario, si es necesario, pero ya no podemos confiar en ellos ". [28] [34] FreeBSD / dev / random usa Fortuna y RDRAND a partir de FreeBSD 11. [35]
Temas de seguridad
El 9 de junio de 2020, investigadores de Vrije Universiteit Amsterdam publicaron un ataque de canal lateral llamado CrossTalk ( CVE-2020-0543 ) que afectó RDRAND
a varios procesadores Intel. [36] Descubrieron que las salidas del generador de números aleatorios digitales de hardware (DRNG) se almacenaban en un búfer de transición que se compartía entre todos los núcleos. La vulnerabilidad permitió que se leyera el código malicioso que se ejecutaba en un procesador afectado RDRAND
y los RDSEED
resultados de la instrucción de una aplicación víctima que se ejecutaba en otro núcleo del mismo procesador, incluidas las aplicaciones que se ejecutan dentro de los enclaves Intel SGX . [36] Los investigadores desarrollaron un exploit de prueba de concepto [37] que extrajo una clave ECDSA completa de un enclave SGX que se ejecuta en un núcleo de CPU separado, después de una sola operación de firma. [36] La vulnerabilidad afecta a escenarios en los que el código que no es de confianza se ejecuta junto con el código de confianza en el mismo procesador, como en un entorno de alojamiento compartido.
Intel se refiere a la vulnerabilidad CrossTalk como muestreo de datos de búfer de registro especial (SRBDS). En respuesta a la investigación, Intel lanzó actualizaciones de microcódigo para mitigar el problema. Garantiza el microcódigo actualizados que los accesos fuera del núcleo se retrasan hasta que las operaciones sensibles - específicamente el RDRAND
, RDSEED
y EGETKEY
las instrucciones - se han completado y el tampón de ensayo se ha sobrescrito. [21] El ataque SRBDS también afecta a otras instrucciones, como las que leen MSR , pero Intel no les aplicó protecciones de seguridad adicionales debido a problemas de rendimiento y la menor necesidad de confidencialidad de los resultados de esas instrucciones. [21] Una amplia gama de procesadores Intel lanzados entre 2012 y 2019 se vieron afectados, incluidos los procesadores de escritorio, móviles y de servidor. [38] Las mitigaciones en sí dieron como resultado impactos negativos en el rendimiento al usar las instrucciones afectadas, particularmente cuando se ejecutan en paralelo por aplicaciones de subprocesos múltiples, debido a la mayor latencia introducida por las comprobaciones de seguridad y la serialización efectiva de las instrucciones afectadas en los núcleos. Intel introdujo una opción de exclusión voluntaria, configurable a través del IA32_MCU_OPT_CTRL
MSR en cada procesador lógico, que mejora el rendimiento al deshabilitar las comprobaciones de seguridad adicionales para las instrucciones que se ejecutan fuera de un enclave SGX. [21]
Ver también
- Conjunto de instrucciones AES
- Bullrun (programa de descifrado)
- OpenSSL
Notas
- ^ En algunas versiones de Ivy Bridge, debido a un error, la instrucción RDRAND provoca una excepción de instrucción ilegal. [4]
Referencias
- ^ "¿Qué es la tecnología Intel® Secure Key?" . Intel . Consultado el 23 de septiembre de 2020 .
- ^ Hofemeier, Gael (22 de junio de 2011). "Obtenga más información sobre la nueva instrucción RDRAND de Intel" . Blogs de Intel Developer Zone . Consultado el 30 de diciembre de 2013 .
- ^ a b c d "Generador de números aleatorios digitales de Intel (DRNG): Guía de implementación de software, revisión 1.1" (PDF) . Intel Corporation . 2012-08-07 . Consultado el 25 de noviembre de 2012 .
- ^ Familia de procesadores Intel Core de tercera generación para equipos de escritorio, actualización de especificaciones (PDF) . Corporación Intel. Enero 2013.
- ^ "Manual del programador de la arquitectura AMD64 Volumen 3: Instrucciones de uso general y del sistema" (PDF) . Guías, manuales y documentos ISA para desarrolladores de AMD . Junio de 2015 . Consultado el 16 de octubre de 2015 .
- ^ Barker, Elaine; Kelsey, John (enero de 2012). "Recomendación para la generación de números aleatorios utilizando generadores de bits aleatorios deterministas" (PDF) . Instituto Nacional de Estándares y Tecnología . Consultado el 16 de septiembre de 2013 . Cite journal requiere
|journal=
( ayuda ) - ^ Hamburgo, Mike; Kocher, Paul; Marson, Mark (12 de marzo de 2012). "Análisis del generador de números aleatorios digitales Ivy Bridge de Intel" (PDF) . Cryptography Research, Inc . Archivado desde el original (PDF) el 30 de diciembre de 2014 . Consultado el 21 de agosto de 2015 .
- ^ Hofemeier, Gael (26 de julio de 2012). "Introducción a las instrucciones Intel AES-NI e Intel SecureKey" . Zona de desarrolladores Intel . Intel . Consultado el 24 de octubre de 2015 .
- ^ "AMD inicia la habilitación de Linux en la arquitectura" Zen "de próxima generación - Phoronix" . www.phoronix.com . Consultado el 25 de octubre de 2015 .
- ^ "Volumen 1, Sección 7.3.17, 'Instrucción del generador de números aleatorios ' " (PDF) . Manual del desarrollador de software de arquitecturas Intel® 64 e IA-32 Volúmenes combinados: 1, 2A, 2B, 2C, 3A, 3B y 3C . Corporación Intel. Junio de 2013. p. 177 . Consultado el 24 de junio de 2013 .
Todos los procesadores Intel que admiten la instrucción RDRAND indican la disponibilidad de la instrucción RDRAND mediante el informe CPUID.01H: ECX.RDRAND [bit 30] = 1
- ^ "Manual del programador de la arquitectura AMD64 Volumen 3: Instrucciones de uso general y del sistema" (PDF) . AMD. Junio de 2015. p. 278 . Consultado el 15 de octubre de 2015 .
El soporte para la instrucción RDRAND es opcional. En procesadores que admiten la instrucción, CPUID Fn0000_0001_ECX [RDRAND] = 1
- ^ "Volumen 1, Sección 7.3.17, 'Instrucción del generador de números aleatorios ' " (PDF) . Manual del desarrollador de software de arquitecturas Intel® 64 e IA-32 Volúmenes combinados: 1, 2A, 2B, 2C, 3A, 3B y 3C . Corporación Intel. Junio de 2013. p. 177 . Consultado el 25 de octubre de 2015 .
Todos los procesadores Intel que admiten la instrucción RDSEED indican la disponibilidad de la instrucción RDSEED mediante informes de CPUID (EAX = 07H, ECX = 0H): EBX.RDSEED [bit 18] = 1
- ^ "Guía de implementación de software Intel® Digital Random Number Generator (DRNG) | Intel® Developer Zone" . Software.intel.com . Consultado el 30 de enero de 2014 .
- ^ a b Taylor, Greg; Cox, George (septiembre de 2011). "Detrás del nuevo generador de números aleatorios de Intel" . Espectro IEEE .
- ^ John Mechalas (noviembre de 2012). "La diferencia entre RDRAND y RDSEED" . software.intel.com . Intel Corporation . Consultado el 1 de enero de 2014 .
- ^ Mechalas, John. "Guía de implementación del software Intel Digital Random Number Generator (DRNG), sección 3.2.1 Fuente de entropía (ES)" . Software de Intel . Intel . Consultado el 18 de febrero de 2015 .
- ^ https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide dice 800 megabytes, que son 6,4 gigabits por segundo
- ^ La implementación de 64 bits más simple de Xorshift tiene 3 XOR y 3 turnos ; si se ejecutan en un bucle cerrado en 4 núcleos a 2 GHz, el rendimiento es de 80 Gb / seg. En la práctica, será menor debido a los gastos generales de carga / almacenamiento, etc., pero es probable que supere los 6,4 Gb / seg
RDRAND
. Por otro lado, la calidad deRDRAND
los númerosde'debería ser superior a la de un software PRNG como Xorshift. - ^ a b http://www.agner.org/optimize/instruction_tables.pdf
- ^ a b Route, Matthew (10 de agosto de 2017). "Síntesis de población enana ultrafría radiante". El diario astrofísico . 845 : 66. arXiv : 1707.02212 . doi : 10.3847 / 1538-4357 / aa7ede .
- ^ a b c d "Muestreo de datos de búfer de registro especial" . Intel . Consultado el 26 de diciembre de 2020 .
- ^ "Lista de intrínsecos x86" . docs.microsoft.com . 2020-02-28 . Consultado el 7 de mayo de 2020 .
- ^ "Funciones integradas de X86: uso de la colección de compiladores GNU (GCC)" .
- ^ "Guía y referencia para desarrolladores Intel® C ++ Compiler 19.1" . 2019-12-23.
- ^ "Síntesis de población enana ultrafría ultracolar de Intel Secure Key-Powered" . Reunión de la Sociedad Astronómica Estadounidense # 234, id. 207.01. Boletín de la Sociedad Astronómica Estadounidense, vol. 51, N ° 4.
- ^ a b Perlroth, Nicole; Larson, Jeff; Shane, Scott (5 de septiembre de 2013). "NSA capaz de frustrar las salvaguardias básicas de la privacidad en la Web" . The New York Times . Consultado el 15 de noviembre de 2017 .
- ^ Ts'o, Theodore (6 de septiembre de 2013). "Estoy muy contento de haber resistido la presión de los ingenieros de Intel para permitir que / dev / random confíe ...". Archivado desde el original el 11 de junio de 2018.
- ^ a b Richard Chirgwin (9 de diciembre de 2013). "FreeBSD abandona la aleatoriedad del hardware" . El registro .
- ^ Gavin Clarke (10 de septiembre de 2013). "Torvalds derriba la llamada para tirar 'backdoored' Intel RDRAND en criptografía de Linux" . theregister.co.uk . Consultado el 12 de marzo de 2014 .
- ^ Taylor Hornby (6 de diciembre de 2013). "¡La prueba de concepto de puerta trasera RDRAND está funcionando! Stock kernel (3.8.13), solo se modifica la instrucción RDRAND" . Consultado el 9 de abril de 2015 .
- ^ Taylor Hornby [@DefuseSec] (10 de septiembre de 2013). "Escribí un breve diálogo explicando por qué el uso de RDRAND en Linux es problemático. Http://pastebin.com/A07q3nL3 / cc @kaepora @voodooKobra" (Tweet) . Consultado el 11 de enero de 2016 , a través de Twitter .
- ^ Daniel J. Bernstein; Tanja Lange (16 de mayo de 2014). "Generación de aleatoriedad" (PDF) . Consultado el 9 de abril de 2015 .
- ^ Hornby, Taylor (9 de mayo de 2017). "Quieres mantener habilitado RDRAND. Lo que hice solo mostró que en una versión anterior del kernel, RDRAND podría controlar potencialmente la salida" . @DefuseSec . Consultado el 30 de octubre de 2019 .
- ^ "Informe de estado trimestral de FreeBSD" . Freebsd.org . Consultado el 30 de enero de 2014 .
- ^ "aleatorio (4)" . www.freebsd.org . Consultado el 25 de septiembre de 2020 .
- ^ a b c Ragab, Hany; Milburn, Alyssa; Razavi, Kaveh; Bos, Herbert; Giuffrida, Cristiano. "CrossTalk: las fugas de datos especulativos en los núcleos son reales" (PDF) . Grupo de Seguridad de Sistemas y Redes, Vrije Universiteit Amsterdam (VUSec) . Consultado el 26 de diciembre de 2020 .
- ^ "VUSec RIDL cpuid_leak PoC, modificado para fugas de salida rdrand" . GitHub . Consultado el 26 de diciembre de 2020 .
- ^ "Procesadores afectados: muestreo de datos de búfer de registro especial" . Zona de desarrolladores Intel . Consultado el 26 de diciembre de 2020 .
enlaces externos
- Biblioteca RdRand .NET
- Proyecto de código abierto RdRand .NET