CryptGenRandom es una función de generación de números pseudoaleatorios criptográficamente segura que está obsoleta [1] y que está incluida en Microsoft CryptoAPI . En los programas Win32 , Microsoft recomienda su uso en cualquier lugar donde se necesite generar números aleatorios. Un artículo de 2007 de la Universidad Hebrea sugirió problemas de seguridad en la implementación de CryptGenRandom en Windows 2000 (asumiendo que el atacante tiene el control de la máquina). Microsoft reconoció más tarde que los mismos problemas existen en Windows XP , pero no en Vista . Microsoft lanzó una solución para el error con Windows XP Service Pack 3 a mediados de 2008. [2]
La API Win32 incluye un 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 de Windows. Las tecnologías de Windows, como la compatibilidad con 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 que se suministra con Microsoft CryptoAPI.CryptGenRandom
Los proveedores de criptografía proporcionados por Microsoft comparten la misma implementación de , actualmente basada en una funciónCryptGenRandom
interna llamada . [3] Hasta 2007, solo se había publicado un esquema general del algoritmo :RtlGenRandom
[actualizar]
[ RtlGenRandom ] genera como se especifica en el apéndice 3.1 de FIPS 186-2 con SHA-1 como función G. Y con la entropía de:
- El ID del proceso actual (GetCurrentProcessID).
- El ID del hilo actual (GetCurrentThreadID).
- El recuento de tics desde el momento del arranque (GetTickCount).
- La hora actual (GetLocalTime).
- Varios 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 de la computadora y la ruta de búsqueda. [...]
- Contadores de CPU internos de alta precisión, como RDTSC, RDMSR, RDPMC
[ omitido: listas largas de campos de información del sistema de bajo nivel y contadores de rendimiento ] [4]
Microsoft ha documentado la implementación del generador de números aleatorios de Windows 10 con cierto detalle en un documento técnico publicado en 2019. [5] En Windows 10:
CryptGenRandom
o RtlGenRandom
, finalmente recaen en ProcessPrng
, que devuelve bytes del PRNG por procesador del proceso. El PRNG siempre utiliza el algoritmo AES-CTR-DRBG según lo especificado por FIPS SP800-90. Aunque BCryptGenRandom
acepta solicitudes de algoritmos más antiguos para compatibilidad con versiones anteriores, solo devuelve números aleatorios del PRNG por procesador. [5] : 8 La seguridad de CSPRNG de un criptosistema es crucial porque es el origen del material de claves dinámicas. Las claves necesarias "sobre la marcha", como las claves de sesión TLS que protegen las conexiones HTTPS , se originan en CSPRNG. Si estos números pseudoaleatorios son predecibles, las claves de sesión también lo son. Dado que CryptGenRandom
CSPRNG es el estándar de facto en entornos Win32, su seguridad es fundamental para los usuarios de Windows.
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 la vulnerabilidad, un atacante primero tendría que comprometer el programa que ejecuta el generador de números aleatorios. Las debilidades del artículo dependen de que un atacante extraiga los bits de estado del generador. Un atacante en posición de llevar a cabo este ataque normalmente ya estaría en posición de derrotar a cualquier generador de números aleatorios (por ejemplo, simplemente puede rastrear las salidas del generador o fijarlas en la memoria a 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 pueden usar la información que obtienen para determinar números aleatorios anteriores que se generaron, lo que potencialmente compromete la información, como los números de tarjetas de crédito, ya enviados.
Los ataques del artículo se basan en el hecho de que CryptGenRandom utiliza el cifrado de flujo RC4 , que se puede ejecutar en sentido inverso una vez que se conoce su estado. También aprovechan el hecho de que CryptGenRandom se ejecuta en modo de usuario , lo que permite que cualquiera que obtenga acceso 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 de estado de CryptGenRandom; si bien esto significa que un compromiso de un proceso no compromete transitivamente a todos los demás procesos, también puede aumentar la longevidad de cualquier ruptura exitosa.
Como los detalles del algoritmo CryptGenRandom no eran públicos en ese momento, el equipo de Dorrendorf utilizó herramientas de ingeniería inversa para discernir cómo funciona el algoritmo. Su artículo es el primer registro publicado de cómo funciona el generador de números aleatorios criptográficos de Windows [ cita requerida ] .
Windows 2000, XP y 2003 han superado con éxito las evaluaciones EAL4+, incluidas las implementaciones CryptGenRandom() y FIPSGenRandom(). La documentación de Security Target está disponible en el Portal de Criterios Comunes e indica el cumplimiento de los requisitos EAL4. Como resultado, se pueden sacar pocas conclusiones sobre la seguridad del algoritmo; EAL4 mide los productos en relación con las mejores prácticas y los objetivos de seguridad establecidos, pero rara vez implica un criptoanálisis en profundidad.
Microsoft ha obtenido la validación de sus implementaciones de RNG en los siguientes entornos:
Estas pruebas están "diseñadas para probar la conformidad con las diversas especificaciones RNG aprobadas en lugar de proporcionar una medida de la seguridad de un producto. [...] Por lo tanto, la validación no debe interpretarse como una evaluación o aprobación de la seguridad general del producto". Como resultado, se pueden sacar 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 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 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 solo con fines históricos". [10]
Los desarrolladores de Windows tienen varios medios alternativos para acceder a la funcionalidad de CryptGenRandom; estas alternativas invocan el mismo algoritmo y comparten las mismas características de seguridad, pero pueden tener otras ventajas.
Si se requiere compatibilidad con versiones anteriores de Windows XP para su programa, se puede llamar a la función 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 es un problema, el programa debería usar la BCryptGenRandom
llamada 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 necesitas incorporar CryptoAPI (CryptAcquireContext y demás), lo cual está bien si estás usando otras funciones criptográficas.
En una instalación predeterminada de Windows XP y posteriores, CryptGenRandom llama a una función llamada ADVAPI32!RtlGenRandom, que no requiere que cargues todo el material de CryptAPI. De hecho, la nueva función CRT de Whidbey , rand_s, llama a RtlGenRandom. [11]
Los programadores que utilizan .NET deben utilizar la clase RNGCryptoServiceProvider. [12]
El CNG [13] es un reemplazo a largo plazo de la obsoleta API Crypto. Proporciona una función equivalente BCryptGenRandom [14] , así como funciones dedicadas para la generación de claves.
rand_s
se utiliza RtlGenRandom
para generar números aleatorios criptográficamente seguros. [11]SunMSCAPI
JCA disponible con las distribuciones OpenJDK y Oracle del JRE en Windows proporciona una implementación SecureRandom con el nombre de algoritmo Windows-PRNG. Esta clase reenvía todas las consultas de bytes aleatorios o de inicialización, así como también establece bytes de inicialización adicionales para CryptGenRandom. [16]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 generador 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.
{{cite web}}
: CS1 maint: copia archivada como título ( enlace )