stringtranslate.com

CryptGenAleatorio

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]

Fondo

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.

Método de operación

Antes de Windows Vista

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 :

[ 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:

[ omitido: largas listas de campos de información del sistema de bajo nivel y contadores de rendimiento ] [4]

Windows Vista y superior

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:

Seguridad

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.

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 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 ] .

Criterios comunes

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.

Validación FIPS

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]

Alternativas

nivel API

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.

Usando RtlGenRandom

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]

Usando RNGCryptoServiceProvider

Los programadores que utilizan .NET deben utilizar la clase RNGCryptoServiceProvider. [12]

Uso de API de criptografía: próxima generación (CNG)

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.

Lenguajes de programación

Ver también

Referencias

  1. ^ Función CryptGenRandom (Windows) "Importante: esta API está obsoleta. El software nuevo y existente debería comenzar a utilizar las API de criptografía de próxima generación. Microsoft puede eliminar esta API en versiones futuras". (Este aviso se aplica a toda CryptoAPI).
  2. ^ "Microsoft confirma que XP contiene un error en el generador de números aleatorios". Archivado desde el original el 22 de junio de 2008.
  3. ^ Función RtlGenRandom (Windows)
  4. ^ Howard, Michael; Leblanc, David (2003). Escritura de código seguro, segunda edición . Educación Pearson. ISBN 0-7356-1722-8.
  5. ^ abcdefgh Ferguson, Niels (octubre de 2019). "La infraestructura de generación de números aleatorios de Windows 10" (PDF) . descargar.microsoft.com .
  6. ^ ab "Identificadores de algoritmo CNG (Bcrypt.h): aplicaciones Win32". aprender.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 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.
  7. ^ Dorrendorf, Leo; Zvi Gutterman; Benny Rosas. «Criptoanálisis del Generador de Números Aleatorios del Sistema Operativo Windows» (PDF) . Archivado desde el original (PDF) el 18 de mayo de 2012 . Consultado el 12 de noviembre de 2007 .
  8. ^ abcdefgh "Lista de validación RNG". División de Seguridad Informática del NIST . Consultado el 20 de marzo de 2024 .
  9. ^ "El 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 desde el original (PDF) el 24 de febrero de 2013 . Consultado el 18 de junio de 2013 .
  10. ^ "Programa de validación de algoritmos criptográficos: lista de validación rng".
  11. ^ Registro web de Michael Howard: número aleatorio criptográficamente seguro en Windows sin usar CryptoAPI
  12. ^ "Copia archivada". Archivado desde el original el 8 de septiembre de 2006 . Consultado el 27 de agosto de 2007 .{{cite web}}: Mantenimiento CS1: copia archivada como título ( enlace )
  13. ^ Crypto API de próxima generación (Windows)
  14. ^ BCryptGenRandom (Windows)
  15. ^ http://msdn.microsoft.com/en-us/library/sxtz2fa8(VS.80).aspx Centro de desarrolladores de Visual C++, rand_s
  16. ^ https://docs.python.org/2/library/os.html#os.urandom Referencia de la biblioteca Python, módulo del sistema operativo
  17. ^ http://docs.oracle.com/javase/8/docs/technotes/guides/security/SunProviders.html#SunMSCAPI Documentación técnica de Oracle Java SE 8, proveedores de Sun

enlaces externos