RDRAND
(para "leer aleatorio") es una instrucción para devolver números aleatorios desde un generador de números aleatorios de hardware en chip de Intel que ha sido sembrado por una fuente de entropía en chip. [1] También se conoce como Intel Secure Key Technology , [2] cuyo nombre en código es Bull Mountain . [3] Intel introdujo la función alrededor de 2012, y AMD agregó soporte para la instrucción en junio de 2015. ( está disponible en los procesadores Ivy Bridge [a] y es parte de las arquitecturas de conjuntos de instrucciones Intel 64 e IA-32 ). [5]RDRAND
El generador de números aleatorios cumple con estándares criptográficos y de seguridad como NIST SP 800-90A , [6] FIPS 140-2 y ANSI X9.82. [1] Intel también solicitó a Cryptography Research Inc. que revisara el generador de números aleatorios en 2012, lo que dio como resultado el artículo Análisis del generador de números aleatorios digitales 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]
La CPUID
instrucción se puede utilizar tanto en CPU AMD como Intel para comprobar 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] Los procesadores AMD se comprueban para la función utilizando la misma prueba. [11] RDSEED
La disponibilidad se puede comprobar en CPU Intel de una 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 RDRAND
es 0x0F 0xC7
, seguido de un byte ModRM que especifica el registro de destino y opcionalmente combinado con un prefijo REX en modo de 64 bits. [13]
Intel Secure Key es el nombre que Intel le da a la RDRAND
instrucción y a la implementación de hardware del generador de números aleatorios (RNG) subyacente, [1] que recibió el nombre en código "Bull Mountain" durante el desarrollo. [14] Intel llama a su RNG "generador de números aleatorios digitales" o DRNG. El generador toma pares de muestras de entropía bruta de 256 bits generadas por la fuente de entropía del hardware y las aplica a un acondicionador de Estándar de cifrado avanzado (AES) (en modo CBC-MAC ) que las reduce a una única muestra de entropía condicionada de 256 bits. Un generador de bits aleatorios determinista llamado CTR DRBG definido en NIST SP 800-90A se genera a partir de 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. [1] [14] El hardware emitirá un máximo de 511 muestras de 128 bits antes de cambiar el valor de la semilla. El uso de la RDSEED
operación proporciona acceso a las muestras condicionadas de 256 bits del AES-CBC-MAC.
La RDSEED
instrucción se agregó a Intel Secure Key para generar otro generador de números pseudoaleatorios, [15] disponible en las CPU BroadwellRDSEED
. La fuente de entropía para la instrucción se ejecuta de manera asincrónica en un circuito con temporizador automático 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
(ambas velocidades se comparten entre todos los núcleos y subprocesos ). [17] La RDSEED
instrucción está destinada a generar 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 PRNG de software como Xorshift suele ser más rápido. [18]
En un procesador Intel Core i7-7700K de 4500 MHz (45 × 100 MHz) (microarquitectura Kaby Lake-S), una sola RDRAND
instrucción RDSEED
tarda 110 ns, o 463 ciclos de reloj, independientemente del tamaño del operando (16/32/64 bits). Esta cantidad de ciclos de reloj se aplica a todos los procesadores con microarquitectura Skylake o Kaby Lake . En los procesadores con microarquitectura Silvermont , cada una de las instrucciones tarda 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 para generar 10 7 números aleatorios de 64 bits utilizando RDRAND
un procesador Intel i7-3740 QM de cuatro núcleos. Encontraron que una implementación en C de RDRAND
se ejecutaba aproximadamente 2 veces más lento que el generador de números aleatorios predeterminado en C, y aproximadamente 20 veces más lento que Mersenne Twister . Aunque se ha construido un módulo Python de RDRAND
, 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 lanzada por Intel en junio de 2020, diseñada para mitigar la vulnerabilidad CrossTalk (consulte la sección de problemas de seguridad a continuación), afecta negativamente el rendimiento de RDRAND
y RDSEED
debido a controles de seguridad adicionales. En los procesadores con las mitigaciones aplicadas, cada instrucción afectada genera 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 manera predeterminada. [21]
Visual C++ 2015 proporciona compatibilidad intrínseca con envoltorios para las funciones RDRAND
y . [22] GCC 4.6+ y Clang 3.2+ proporcionan funciones intrínsecas para cuando se especifica en los indicadores , [23] también configurando para permitir la compilación condicional . Las versiones más nuevas también proporcionan la 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 indicada por su parámetro y devuelven 1 en caso de éxito. [24]RDSEED
RDRAND
-mrdrnd
__RDRND__
immintrin.h
Es una opción para generar números aleatorios criptográficamente seguros usando RDRAND
y RDSEED
en OpenSSL , para ayudar a asegurar las comunicaciones.
Se evaluó la aplicación científica de Twister RDRAND
en un simulador de Monte Carlo , centrándose en el rendimiento y la reproducibilidad, en comparación con otros generadores de números aleatorios. Se concluyó que el uso RDRAND
de Twister en lugar de Mersenne no proporciona resultados diferentes, sino un rendimiento y una reproducibilidad peores. [25] [20]
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 lo siguiente sobre el uso de RDRAND
for /dev/random
en el kernel de Linux : [27]
Me alegro mucho de haber resistido la presión de los ingenieros de Intel para que
/dev/random
dependiera únicamente de lasRDRAND
instrucciones. Para citar el artículo del New York Times [26 ]: "Este año, el proyecto Sigint Enabling Project había encontrado formas de introducirse en 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 núcleo Linux y señaló que no se utiliza como la única fuente de entropía para /dev/random
, sino que se utiliza para mejorar la entropía combinando los valores recibidos de 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 apunta específicamente al código que lo usa. La implementación de prueba de concepto de Hornby funciona en un núcleo Linux sin modificar anterior a la versión 3.13. [30] [31] [32] El problema se mitigó en el núcleo Linux en 2013. [33]
Los desarrolladores cambiaron el kernel de FreeBSDRDRAND
para que no use directamente VIA PadLock con el comentario "Para FreeBSD 10, vamos a dar marcha atrás y eliminar RDRAND
los backends de Padlock y alimentarlos a Yarrow en lugar de enviar su salida directamente a /dev/random . Todavía será posible acceder a generadores de números aleatorios de hardware, es decir, RDRAND
VIA Padlock, etc., directamente mediante ensamblaje en línea o usando OpenSSL desde el espacio 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]
El 9 de junio de 2020, investigadores de la 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 (DRNG) de hardware se almacenaban en un búfer de ensayo que se compartía entre todos los núcleos. La vulnerabilidad permitía que el código malicioso que se ejecutaba en un procesador afectado leyera RDRAND
los RDSEED
resultados de las instrucciones de una aplicación víctima que se ejecutaba en otro núcleo de ese mismo procesador, incluidas las aplicaciones que se ejecutaban dentro de los enclaves Intel SGX . [36] Los investigadores desarrollaron un exploit de prueba de concepto [37] que extraía una clave ECDSA completa de un enclave SGX que se ejecutaba 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 no confiable se ejecuta junto con el código confiable 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. El microcódigo actualizado garantiza que los accesos fuera del núcleo se retrasen hasta que se completen las operaciones sensibles (específicamente las instrucciones RDRAND
, RDSEED
y EGETKEY
) y se haya sobrescrito el búfer de ensayo. [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 preocupaciones 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 procesadores de escritorio, móviles y servidores. [38] Las mitigaciones en sí mismas resultaron en impactos negativos en el rendimiento al usar las instrucciones afectadas, particularmente cuando se ejecutan en paralelo por aplicaciones multiproceso, debido a la mayor latencia introducida por los controles de seguridad y la serialización efectiva de las instrucciones afectadas en todos 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]
{{cite journal}}
: Requiere citar revista |journal=
( ayuda )Todos los procesadores Intel que admiten la instrucción RDRAND indican la disponibilidad de la instrucción RDRAND mediante un informe CPUID.01H:ECX.RDRAND[bit 30] = 1
La compatibilidad con la instrucción RDRAND es opcional. En los procesadores que admiten la instrucción, CPUID Fn0000_0001_ECX[RDRAND] = 1
Todos los procesadores Intel que admiten la instrucción RDSEED indican la disponibilidad de la instrucción RDSEED mediante el informe CPUID.(EAX=07H, ECX=0H):EBX.RDSEED[bit 18] = 1
RDRAND
. Por otro lado, la calidad de RDRAND
los números de debería ser superior a la de un PRNG de software como Xorshift.