CryptGenRandom es una función generadora de números pseudoaleatorios criptográficamente segura que se incluye en Microsoft CryptoAPI . En programas Win32 , Microsoft recomendaba su uso siempre que se necesitara generar números aleatorios (desde entonces ha sido reemplazada por BCryptGenRandom , véase más abajo). El equivalente en kernel32 es RtlGenRandom .
Un artículo de 2007 de la Universidad Hebrea sugirió problemas de seguridad en la implementación de CryptGenRandom en Windows 2000 (suponiendo que el atacante tuviera el control de la máquina). Microsoft reconoció posteriormente que los mismos problemas existían en Windows XP , pero no en Vista . Microsoft lanzó una solución para el error con el Service Pack 3 de Windows XP a mediados de 2008. [ 1 ]
CryptGenRandom está obsoleto, ya que pertenece a la API criptográfica de Windows, que también está obsoleta. El reemplazo moderno de la API de criptografía de próxima generación (CNG) es BCryptGenRandom (y las funciones subyacentes ProcessPrng y SystemPrng). [ 2 ]
Fondo
La API Win32 incluye soporte integral para criptografía a través de Microsoft CryptoAPI , un conjunto de primitivas criptográficas proporcionadas por Microsoft para su uso en aplicaciones Windows. Tecnologías de Windows como el soporte TLS (a través de la API Schannel ) y la firma de código dependen de estas primitivas, que a su vez dependen de un generador de números pseudoaleatorios criptográficamente seguro (CSPRNG). es el CSPRNG estándar suministrado con Microsoft CryptoAPI.CryptGenRandom
Método de operación
Antes de Windows Vista
Los proveedores de criptografía de Microsoft comparten la misma implementación de CryptGenRandom, actualmente basada en una función interna llamada RtlGenRandom. [ 3 ] Hasta 2007, solo se había publicado un esquema general del algoritmo .:
[ RtlGenRandom ] se genera según lo especificado en el apéndice 3.1 de FIPS 186-2 con SHA-1 como función G. Y con entropía de:
- El ID del proceso actual (GetCurrentProcessID).
- El ID del hilo actual (GetCurrentThreadID).
- El número de ticks desde el momento del arranque (GetTickCount).
- La hora actual (GetLocalTime).
- Diversos contadores de rendimiento de alta precisión (QueryPerformanceCounter).
- Un hash MD4 del bloque de entorno del usuario, que incluye el nombre de usuario, el nombre del equipo y la ruta de búsqueda. [...]
- Contadores internos de CPU de alta precisión, como RDTSC, RDMSR, RDPMC.
[ omitido: largas listas de campos de información del sistema de bajo nivel y contadores de rendimiento ] [ 4 ]
Windows Vista y versiones posteriores
Microsoft ha documentado con cierto detalle la implementación del generador de números aleatorios de Windows 10 en un documento técnico publicado en 2019. [ 5 ] En Windows 10:
- Existe una jerarquía de generadores de números aleatorios. El núcleo tiene un generador de números pseudoaleatorios raíz (PRNG raíz), del cual se deriva toda la aleatoriedad. El núcleo utiliza este PRNG raíz para inicializar un PRNG por procesador lógico (de modo que el estado del PRNG es local a cada hilo y no requiere bloqueo). Cuando se inicia un proceso, solicita bytes aleatorios al PRNG del núcleo por procesador para inicializar su propio PRNG de proceso. Luego, utiliza este PRNG de proceso para inicializar también un PRNG almacenado en búfer por procesador lógico. [ 5 ]
- Todas las llamadas desde el espacio de usuario para obtener aleatoriedad, ya sea
CryptGenRandomoRtlGenRandom, en última instancia recaen enProcessPrng, que devuelve bytes del PRNG por procesador del proceso. El PRNG siempre utiliza el algoritmo AES-CTR-DRBG, tal como lo especifica FIPS SP800-90. AunqueBCryptGenRandomacepta solicitudes de algoritmos más antiguos para compatibilidad con versiones anteriores , solo devuelve números aleatorios del PRNG por procesador. [ 5 ] : 8- AES-CTR-DRBG, en lugar de FIPS 186, ha sido el valor predeterminado desde Windows Vista y Windows Server 2008. [ 6 ]
- La eliminación de otros algoritmos ocurrió en Windows 10. [ 6 ]
- El generador de números aleatorios raíz se reinicia periódicamente a partir de los grupos de entropía. [ 5 ] : 9 Al arrancar, cuando hay muy poca entropía disponible, un procedimiento especial de "inicialización" proporciona la semilla a partir de archivos de semilla, entropía externa, aleatoriedad TPM , instrucciones RDRAND /RDSEED, tabla ACPI-OEM0, entropía UEFI y la hora actual. [ 5 ] : 11
- El núcleo mantiene múltiples grupos de entropía. Múltiples fuentes de entropía se agregan a los grupos, siendo la principal la temporización de interrupciones. [ 5 ] : 12 Cuando se utiliza un grupo, el hash SHA-512 de su contenido se toma como salida. [ 5 ] : 10 Windows no estima la entropía. [ 5 ] : 16
Seguridad
La seguridad del generador de números pseudoaleatorios criptográficamente seguro (CSPRNG) de un sistema criptográfico es crucial, ya que es la fuente de las claves dinámicas. Las claves necesarias para generarse sobre la marcha, como las claves de sesión TLS que protegen las conexiones HTTPS , se originan en los CSPRNG. Si estos números pseudoaleatorios son predecibles, las claves de sesión también lo serán. Dado que CryptGenRandomes el CSPRNG estándar de facto en entornos Win32, su seguridad es fundamental para los usuarios de Windows.
Criptoanálisis
Un criptoanálisis de CryptGenRandom, publicado en noviembre de 2007 por Leo Dorrendorf y otros de la Universidad Hebrea de Jerusalén y la Universidad de Haifa , encontró debilidades significativas en la implementación del algoritmo en Windows 2000. [ 7 ]
Para aprovechar esta vulnerabilidad, un atacante primero tendría que comprometer el programa que ejecuta el generador de números aleatorios. Las debilidades descritas en el artículo dependen de que el atacante extraiga los bits de estado del generador. Un atacante capaz de llevar a cabo este ataque normalmente ya estaría en condiciones de burlar cualquier generador de números aleatorios (por ejemplo, podría interceptar las salidas del generador o fijarlas en memoria con valores conocidos). Sin embargo, el equipo de la Universidad Hebrea señala que un atacante solo necesita robar los bits de estado una vez para violar persistentemente la seguridad de una instancia de CryptGenRandom. También puede usar la información obtenida para determinar números aleatorios generados anteriormente, lo que podría comprometer información, como números de tarjetas de crédito, que ya se hayan enviado.
Los ataques descritos en el artículo se basan en el hecho de que CryptGenRandom utiliza el cifrado de flujo RC4 , que puede ejecutarse en sentido inverso una vez que se conoce su estado. También aprovechan que CryptGenRandom se ejecuta en modo usuario , lo que permite que cualquiera que acceda al sistema operativo a nivel de usuario, por ejemplo, explotando un desbordamiento de búfer , obtenga la información de estado de CryptGenRandom para ese proceso. Finalmente, CryptGenRandom actualiza su semilla a partir de la entropía con poca frecuencia. Este problema se agrava por el hecho de que cada proceso Win32 tiene su propia instancia del estado de CryptGenRandom; si bien esto significa que una vulneración de un proceso no compromete transitivamente a todos los demás, también puede aumentar la duración de cualquier ataque exitoso.
Dado que los detalles del algoritmo CryptGenRandom no eran públicos en ese momento, el equipo de Dorrendorf utilizó herramientas de ingeniería inversa para descifrar su funcionamiento. Su artículo es el primer registro publicado sobre cómo opera el generador de números aleatorios criptográficos de Windows .
Criterios comunes
Windows 2000, XP y 2003 han superado con éxito las evaluaciones EAL4+, incluidas las implementaciones de CryptGenRandom() y FIPSGenRandom(). La documentación del Objetivo de Seguridad está disponible en el Portal de Criterios Comunes e indica el cumplimiento de los requisitos EAL4. Como resultado, no se pueden extraer muchas conclusiones sobre la seguridad del algoritmo; EAL4 evalúa los productos según las mejores prácticas y los objetivos de seguridad establecidos, pero rara vez implica un criptoanálisis exhaustivo.
Validación FIPS
Microsoft ha obtenido la validación de sus implementaciones de generadores de números aleatorios en los siguientes entornos:
- Implementación de RNG en Windows Vista y Server 2008 (certificado 435) [ 8 ]
- Implementaciones de RNG de Windows Vista (certificado 321) [ 8 ]
- Proveedor criptográfico mejorado de Windows 2003 (rsaenh.dll) (certificado 316) [ 8 ]
- Proveedor criptográfico Diffie-Hellman y DSS mejorado de Windows 2003 (dssenh.dll) (certificado 314) [ 8 ]
- Módulo criptográfico en modo kernel de Windows 2003 (fips.sys) (certificado 313) [ 8 ]
- Proveedor criptográfico mejorado de Windows CE y Windows Mobile (rsaenh.dll) (certificado 292) [ 8 ]
- Proveedor criptográfico mejorado de Windows CE y Windows Mobile (rsaenh.dll) (certificado 286) [ 8 ]
- Proveedor criptográfico mejorado de Windows CE (rsaenh.dll) (certificado 66) [ 8 ]
Estas pruebas están diseñadas para comprobar la conformidad con las distintas especificaciones aprobadas del generador de números aleatorios (RNG), en lugar de proporcionar una medida de la seguridad del producto. [...] Por lo tanto, la validación no debe interpretarse como una evaluación o un respaldo de la seguridad general del producto. En consecuencia, se pueden extraer pocas conclusiones sobre la seguridad del algoritmo; las evaluaciones FIPS no necesariamente inspeccionan el código fuente ni evalúan la forma en que se generan las semillas del RNG. [ 9 ]
La lista de validación de RNG incluye el siguiente aviso: "A partir del 1 de enero de 2016, de conformidad con la Revisión 1 de la norma SP800-131A, Transiciones: Recomendación para la transición del uso de algoritmos criptográficos y longitudes de clave, el uso de RNG especificados en FIPS 186-2, [X9.31] y la versión de 1998 de [X9.62] ya no está aprobado. Esta lista se proporciona únicamente con fines históricos." [ 10 ]
Alternativas
Nivel de API
Los desarrolladores de Windows disponen de varias alternativas para acceder a la funcionalidad CryptGenRandom; estas alternativas utilizan el mismo algoritmo y comparten las mismas características de seguridad, pero pueden tener otras ventajas.
Usando RtlGenRandom
Si su programa requiere compatibilidad con versiones anteriores hasta Windows XP, puede llamar a la función de la API de Windows RtlGenRandom(que se encuentra en advapi32.dll[ 3 ] ) para generar datos aleatorios seguros, como se muestra a continuación. Si esto no representa un problema, el programa debería usar la BCryptGenRandomllamada más reciente.
Históricamente, siempre les hemos dicho a los desarrolladores que no utilicen funciones como `rand` para generar claves, nonces y contraseñas, sino que utilicen funciones como `CryptGenRandom`, que crea números aleatorios criptográficamente seguros. El problema con `CryptGenRandom` es que requiere incorporar la API de criptografía (CryptAcquireContext, etc.), lo cual no supone ningún problema si se utilizan otras funciones criptográficas.
En una instalación predeterminada de Windows XP y versiones posteriores, CryptGenRandom llama a una función llamada ADVAPI32!RtlGenRandom, que no requiere que cargues todo el contenido de CryptAPI. De hecho, la nueva función CRT de Whidbey , rand_s, llama a RtlGenRandom. [ 11 ]
Uso de RNGCryptoServiceProvider
Los programadores que utilizan .NET deben usar la clase RNGCryptoServiceProvider. [ 12 ]
Uso de la API de criptografía: Próxima generación (CNG)
El CNG [ 13 ] es un reemplazo a largo plazo para la API Crypto obsoleta. Proporciona una función equivalente BCryptGenRandom [ 14 ] así como funciones dedicadas para la generación de claves.
Lenguajes de programación
- La función de la biblioteca C de Microsoft
rand_sse utilizaRtlGenRandompara generar números aleatorios criptográficamente seguros. [ 11 ] - La función urandom de Python en el módulo os , que usa /dev/urandom en sistemas tipo Unix , llama a CryptGenRandom en sistemas Windows. [ 15 ]
- El proveedor
SunMSCAPIJCA disponible con las distribuciones OpenJDK y Oracle de JRE en Windows proporciona una implementación de SecureRandom con el nombre de algoritmo Windows-PRNG. Esta clase reenvía todas las consultas de bytes aleatorios o semilla, así como la configuración de bytes semilla adicionales a CryptGenRandom. [ 16 ]
Véase también
- Llamadas al sistema que proporcionan entropía : el equivalente aproximado de CryptGenRandom en OpenBSD y el kernel de Linux.
- /dev/random : una fuente de aleatoriedad en la mayoría de los núcleos tipo Unix.
- Ataque al generador de números aleatorios
Referencias
- ↑ "Microsoft confirma que XP contiene un error en el generador de números aleatorios" . Archivado del original el 22 de junio de 2008.
- ↑ Función CryptGenRandom (Windows) "Importante: Esta API está obsoleta. El software nuevo y existente debe comenzar a usar las API de criptografía de próxima generación. Microsoft podría eliminar esta API en futuras versiones." (Este aviso se aplica a toda la API de criptografía).
- 1 2 "Función RtlGenRandom (ntsecapi.h)" . Microsoft Learn . Microsoft. 22 de febrero de 2024. Consultado el 7 de noviembre de 2024 .
- ↑ Howard, Michael; Leblanc, David (2003). Writing Secure Code, Second Edition . Pearson Education. ISBN 0-7356-1722-8.
- 1 2 3 4 5 6 7 8 Ferguson, Niels (octubre de 2019). "La infraestructura de generación de números aleatorios de Windows 10" (PDF) . download.microsoft.com .
- 1 2 "Identificadores de algoritmo CNG (Bcrypt.h) - Aplicaciones Win32" . learn.microsoft.com . 13 de abril de 2023.
Nota: A partir de Windows Vista con SP1 y Windows Server 2008, el generador de números aleatorios se basa en el modo de contador AES especificado en el estándar NIST SP 800-90. [...] Windows 10: A partir de Windows 10, se ha eliminado el algoritmo de generación de números aleatorios de curva elíptica dual. Los usos existentes de este algoritmo seguirán funcionando; sin embargo, el generador de números aleatorios se basa en el modo de contador AES especificado en el estándar NIST SP 800-90.
- ↑ Dorrendorf, Leo; Zvi Gutterman; Benny Pinkas. "Criptoanálisis del generador de números aleatorios del sistema operativo Windows" (PDF) . Archivado del original (PDF) el 18 de mayo de 2012. Consultado el 12 de noviembre de 2007 .
- 1 2 3 4 5 6 7 8 "Lista de validación de RNG" . División de Seguridad Informática del NIST . Recuperado el 20 de marzo de 2024 .
- ↑ "Sistema de validación del generador de números aleatorios (RNGVS)" (PDF) . División de seguridad informática del Instituto Nacional de Estándares y Tecnología. 31 de enero de 2005. Archivado del original (PDF) el 24 de febrero de 2013. Consultado el 18 de junio de 2013 .
- ↑ "Programa de validación de algoritmos criptográficos: Lista de validación de rng" .
- 1 2 "rand_s" . Microsoft Learn . Microsoft. 2 de diciembre de 2022. Consultado el 7 de noviembre de 2024 .
- ↑ "Copia archivada" . Archivado del original el 8 de septiembre de 2006. Consultado el 27 de agosto de 2007 .
{{cite web}}: CS1 mantenimiento: copia archivada como título ( enlace ) - ↑ API criptográfica de próxima generación (Windows)
- ↑ BCryptGenRandom (Windows)
- ↑ https://docs.python.org/2/library/os.html#os.urandom Referencia de la biblioteca de Python, módulo OS
- ↑ http://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunMSCAPI Documentación técnica de Oracle Java SE 8, Proveedores Sun
Enlaces externos
- Programas de licencias de código compartido de Microsoft
- Algoritmos criptográficos
- Generadores de números pseudoaleatorios
- Generadores de números pseudoaleatorios criptográficamente seguros
- Interfaces de programación de aplicaciones de Microsoft
- Tecnología de seguridad de Microsoft Windows