CryptGenRandom es una función de generación de números pseudoaleatorios criptográficamente segura en desuso [1] que se incluye en Microsoft CryptoAPI . En programas Win32 , Microsoft recomienda su uso en cualquier lugar donde se necesite generación de 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 (suponiendo que el atacante tenga el control de la máquina). Microsoft reconoció más tarde que existen los mismos problemas 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 soporte integral para la seguridad criptográfica, incluida la compatibilidad nativa con TLS (a través de la API SCHANNEL ) y firma de código . Estas capacidades se basan en bibliotecas nativas de Windows para operaciones criptográficas, como la generación de claves RSA y AES . Estas bibliotecas, a su vez, dependen de un generador de números pseudoaleatorios criptográficamente seguro (CSPRNG). CryptGenRandom es el CSPRNG estándar para el entorno de programación Win32.
Los proveedores de criptografía proporcionados por Microsoft comparten la misma implementación de CryptGenRandom, actualmente basada en una función interna llamada RtlGenRandom . [3] En 2007 sólo se había publicado un resumen general del algoritmo[actualizar] :
[ RtlGenRandom ] 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 recuento de ticks 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 nombre de usuario, nombre de computadora y ruta de búsqueda. [...]
- Contadores de CPU internos 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]
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
, lo 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 de cada procesador. [5] : 8 La seguridad del CSPRNG de un criptosistema es importante porque es el origen del material de claves dinámicas. Las claves necesarias "sobre la marcha", como las claves de sesión AES TLS que protegen las sesiones HTTPS con sitios web bancarios, se originan a partir de CSPRNG. Si estos números pseudoaleatorios son predecibles, las claves de sesión también lo son. Debido a que CryptGenRandom es el CSPRNG estándar de facto en entornos Win32, su seguridad es fundamental para los usuarios de Windows.
Los detalles del algoritmo de CryptGenRandom no se han publicado oficialmente. Al igual que cualquier algoritmo de generación de números aleatorios no publicado, puede ser susceptible a debilidades teóricas, incluido el uso de algoritmos obsoletos y la dependencia de la recopilación de entropía en varios contadores que aumentan monótonamente y que podrían ser estimados o controlados hasta cierto punto por un atacante con acceso local. al sistema.
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. Todas las debilidades del documento dependen de que un atacante extraiga los bits de estado del generador. Un atacante en condiciones de llevar a cabo este ataque normalmente ya estaría en condiciones de derrotar cualquier generador de números aleatorios (por ejemplo, puede simplemente olfatear las salidas del generador o fijarlas en la memoria con valores conocidos). Sin embargo, el equipo de la Universidad Hebrea señala que un atacante sólo necesita robar los bits de estado una vez para violar persistentemente la seguridad de una instancia de CryptGenRandom. También pueden utilizar la información que obtienen para determinar números aleatorios anteriores que se generaron, lo que podría comprometer información, como números de tarjetas de crédito, ya enviadas.
Los ataques del documento se basan en el hecho de que CryptGenRandom utiliza el cifrado de flujo RC4 , que puede ejecutarse hacia atrás 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 aprovechando un desbordamiento de búfer , obtenga información del estado de CryptGenRandom para ese proceso. Finalmente, CryptGenRandom actualiza su semilla de entropía con poca frecuencia. Este problema se ve agravado por el hecho de que cada proceso Win32 tiene su propia instancia del estado CryptGenRandom; Si bien esto significa que el compromiso de un proceso no compromete transitivamente todos los demás procesos, también puede aumentar la longevidad de cualquier ruptura exitosa.
Debido a que los detalles del algoritmo CryptGenRandom no son públicos, 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 criptográfico de números aleatorios de Windows [ cita requerida ] .
Windows 2000, XP y 2003 se han sometido con éxito a 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 de EAL4. Como resultado, se pueden sacar pocas conclusiones sobre la seguridad del algoritmo; EAL4 mide los productos según 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 respaldo 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 de RNG. [9]
La lista de validación de RNG lleva el siguiente aviso: "A partir del 1 de enero de 2016, de acuerdo con las Transiciones SP800-131A Revisión 1: 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á aprobada. Esta lista se proporciona únicamente con fines históricos". [10]
Los desarrolladores de Windows tienen varios medios alternativos para acceder a la funcionalidad CryptGenRandom; Estas alternativas invocan el mismo algoritmo y comparten las mismas características de seguridad, pero pueden tener otras ventajas.
Históricamente, siempre les dijimos a los desarrolladores que no usaran funciones como rand para generar claves, nonces y contraseñas, sino que deberían usar 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 Whidbey CRT, 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 Crypto API. Proporciona una función equivalente BCryptGenRandom [14] así como funciones dedicadas para la generación de claves.
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}}
: Mantenimiento CS1: copia archivada como título ( enlace )