
En los sistemas operativos tipo Unix , /dev/random y /dev/urandom son archivos especiales que proporcionan números aleatorios generados por un generador de números pseudoaleatorios criptográficamente seguro (CSPRNG). El CSPRNG se inicializa con entropía (un valor que proporciona aleatoriedad ) proveniente del ruido ambiental, recopilado de controladores de dispositivos y otras fuentes. Los usuarios pueden obtener números aleatorios del CSPRNG simplemente leyendo el archivo. [ 1 ] No todos los sistemas operativos implementan los mismos métodos para /dev/random y /dev/urandom .
Cuando la entropía disponible es baja, /dev/random se bloquea ; en sistemas más recientes, esto suele ocurrir al iniciar el programa hasta que la entropía sea suficiente, antes de desbloquearse definitivamente. El dispositivo /dev/urandom normalmente nunca fue un dispositivo de bloqueo, incluso si la semilla del generador de números pseudoaleatorios no se había inicializado completamente con entropía desde el arranque.
Este archivo especial se originó en Linux en 1994. Fue rápidamente adoptado por otros sistemas operativos tipo Unix. [ 2 ]
Linux

El kernel de Linux proporciona los archivos de dispositivo separados /dev/random y /dev/urandom . Desde la versión 5.6 del kernel de 2020, /dev/random solo se bloquea cuando el CSPRNG no se ha inicializado. Una vez inicializado, /dev/random y /dev/urandom se comportan de la misma manera. [ 3 ]
En octubre de 2016, con el lanzamiento de la versión 4.8 del kernel de Linux , el /dev/urandom del kernel se cambió a una implementación de generador de números pseudoaleatorios criptográficos (CPRNG) basado en ChaCha20 [ 4 ] por Theodore Ts'o , basado en el cifrador de flujo ChaCha20 de Bernstein , muy apreciado .
Desde la versión 5.17 del kernel de Linux, el generador de números aleatorios cambió de usar la función hash criptográfica SHA-1 en el recolector de entropía a BLAKE2s , una función hash más nueva, rápida y segura. [ 5 ]
Implementación original
La generación de números aleatorios en el espacio del kernel se implementó por primera vez para Linux [ 2 ] en 1994 por Theodore Ts'o . [ 6 ] La implementación utilizó funciones hash seguras en lugar de cifrados , para evitar las restricciones de exportación de criptografía vigentes cuando se diseñó originalmente el generador. La implementación también se diseñó bajo el supuesto de que cualquier función hash o cifrado podría eventualmente resultar débil, por lo que el diseño es robusto ante tales debilidades. La recuperación rápida ante el compromiso del pool no se considera un requisito, ya que los requisitos para el compromiso del pool son suficientes para ataques mucho más fáciles y directos a partes no relacionadas del sistema operativo.
En la implementación de Ts'o, el generador mantiene una estimación del número de bits de ruido en el pool de entropía . A partir de este pool de entropía se crean números aleatorios. Al leerse, el dispositivo /dev/random solo devolverá bytes aleatorios dentro del número estimado de bits de ruido en el pool de entropía. Cuando el pool de entropía está vacío, las lecturas de /dev/random se bloquearán hasta que se recoja ruido ambiental adicional. [ 7 ] El objetivo es que funcione como un generador de números pseudoaleatorios criptográficamente seguro , que proporcione una salida con la mayor entropía posible. Los autores sugieren su uso para generar claves criptográficas para protección de alto valor o a largo plazo. [ 7 ]
Una contraparte de /dev/random es /dev/urandom ("ilimitado" [ 8 ] /fuente aleatoria no bloqueante [ 7 ] ) que reutiliza el pool interno para producir más bits pseudoaleatorios. Esto significa que la llamada no se bloqueará, pero la salida puede contener menos entropía que la lectura correspondiente de /dev/random . Si bien /dev/urandom todavía está pensado como un generador de números pseudoaleatorios adecuado para la mayoría de los propósitos criptográficos, los autores de la página man correspondiente señalan que, teóricamente, puede existir un ataque aún no publicado al algoritmo utilizado por /dev/urandom , y que los usuarios preocupados por tal ataque deberían usar /dev/random en su lugar. [ 7 ] Sin embargo, es poco probable que tal ataque exista, porque una vez que el pool de entropía es impredecible, no filtra seguridad por una cantidad reducida de bits. [ 9 ]
También es posible escribir en /dev/random . Esto permite a cualquier usuario mezclar datos aleatorios en el pool. Los datos no aleatorios son inofensivos, ya que solo un usuario con privilegios puede emitir la llamada ioctl necesaria para aumentar la estimación de entropía. La cantidad actual de entropía y el tamaño del pool de entropía del kernel de Linux, ambos medidos en bits, están disponibles en /proc/sys/kernel/random/ y se pueden mostrar con el comando y respectivamente.cat /proc/sys/kernel/random/entropy_availcat /proc/sys/kernel/random/poolsize
Inyección de entropía
Gutterman, Pinkas y Reinman publicaron en marzo de 2006 un análisis criptográfico detallado del generador de números aleatorios de Linux [ 10 ] en el que describen varias debilidades. Quizás el problema más grave que reportan se da en sistemas embebidos o Live CD , como enrutadores y clientes sin disco , para los cuales el estado de arranque es predecible y el suministro disponible de entropía del entorno puede ser limitado. Para un sistema con memoria no volátil , recomiendan guardar parte del estado del generador de números aleatorios al apagarlo para que pueda incluirse en el estado del generador de números aleatorios en el siguiente reinicio. En el caso de un enrutador para el cual el tráfico de red representa la principal fuente disponible de entropía, señalan que guardar el estado entre reinicios "requeriría que los atacantes potenciales interceptaran todo el tráfico de red" desde que el enrutador se pone en servicio por primera vez, u obtuvieran acceso directo al estado interno del enrutador. Este problema, señalan, es particularmente crítico en el caso de un enrutador inalámbrico cuyo tráfico de red puede capturarse a distancia y que puede estar utilizando el generador de números aleatorios para generar claves para el cifrado de datos.
El kernel de Linux proporciona soporte para varios generadores de números aleatorios de hardware , en caso de que estén instalados. La salida sin procesar de dicho dispositivo se puede obtener desde /dev/hwrng . [ 11 ]
Con el kernel de Linux 3.16 y versiones posteriores, [ 12 ] el propio kernel mezcla datos de generadores de números aleatorios de hardware en /dev/random en una escala variable basada en la calidad de estimación de entropía definible del HWRNG. Esto significa que no se necesita ningún demonio de espacio de usuario, como rngd de rng-tools , para realizar esa tarea.
El conjunto de entropía se puede mejorar con programas como timer_entropyd , haveged , randomsound , etc. Con rng-tools , los generadores de números aleatorios por hardware como Entropy Key, etc., pueden escribir en /dev/random . Los programas de prueba diehard , dieharder y ent pueden probar estos generadores de números aleatorios. [ 13 ] [ 14 ] [ 15 ] [ 16 ]
Crítica de la inyección de entropía
En enero de 2014, Daniel J. Bernstein publicó una crítica [ 17 ] sobre cómo Linux mezcla diferentes fuentes de entropía. Describe un ataque en el que una fuente de entropía capaz de monitorear las otras fuentes de entropía podría modificar su salida para anular la aleatoriedad de las otras fuentes de entropía. Considere la función donde H es una función hash y x , y , z son fuentes de entropía, siendoz la salida de un HRNG malicioso basado en CPU Z:
- Z genera un valor aleatorio de r .
- Z calcula .
- Si la salida de es igual al valor deseado, imprime r como z .
- De lo contrario, repita comenzando desde 1.
Bernstein estimó que un atacante necesitaría repetir 16 veces para comprometer DSA y ECDSA, haciendo que los primeros cuatro bits de la salida del RNG sean 0. Esto es posible porque Linux reinicializa H de forma continua en lugar de usar una única semilla de alta calidad. [ 17 ]
Bernstein también argumenta que la inyección de entropía es inútil una vez que el CSPRNG ha sido inicializado. [ 17 ]
En el kernel 5.17 (con retrocompatibilidad en el kernel 5.10.119), Jason A. Donenfeld propuso un nuevo diseño para la infraestructura del pool de entropía de Linux. Donenfeld informó que el pool anterior, que consistía en un único LFSR de 4096 bits , era vulnerable a dos ataques: (1) un atacante podía deshacer el efecto de una entrada conocida; (2) si se filtraba el estado completo del pool, un atacante podía establecer todos los bits del pool a cero. Su nuevo diseño, más rápido y seguro, utiliza la función hash blake2s para mezclar un pool de 256 bits. [ 18 ]
Sistemas BSD
El sistema operativo FreeBSD proporciona un enlace /dev/urandom a /dev/random . Ambos se bloquean solo hasta que se inicializan correctamente. El generador de números pseudoaleatorios (PRNG) de FreeBSD ( Fortuna ) se inicializa periódicamente y no intenta estimar la entropía. En un sistema con poca actividad de red y de disco, la inicialización se realiza después de una fracción de segundo. [ 19 ]
DragonFly BSD heredó los archivos de dispositivo aleatorios de FreeBSD cuando se bifurcó. [ 20 ] [ 21 ]
Desde OpenBSD 5.1 (1 de mayo de 2012) , /dev/random y /dev/arandom utilizan arc4random , una función CSPRNG basada en RC4 . La función se cambió para usar la más robusta ChaCha20 con OpenBSD 5.5 (1 de mayo de 2014). El sistema utiliza automáticamente generadores de números aleatorios de hardware (como los que se proporcionan en algunos concentradores PCI de Intel) si están disponibles, a través del Marco Criptográfico de OpenBSD . [ 22 ] [ 23 ] /dev/arandom se eliminó en OpenBSD 6.3 (15 de abril de 2018). [ 24 ]
La implementación de la API heredada de NetBSDarc4random() también se ha cambiado a ChaCha20. [ 25 ]
macOS, iOS y otros sistemas operativos de Apple
Todos los sistemas operativos de Apple han migrado a Fortuna desde al menos diciembre de 2019, posiblemente antes. [ 26 ] Se basa en SHA-256 . Se utilizan múltiples fuentes de entropía, como el generador de números aleatorios del enclave seguro, la fluctuación de la temporización de la fase de arranque y la interrupción de hardware (temporización asumida). RDSEED/RDRAND se utiliza en los Mac con procesador Intel que lo admiten. Los datos de semilla (entropía) también se almacenan para reinicios posteriores.
Antes del cambio, macOS e iOS utilizaban Yarrow de 160 bits basado en SHA-1 . [ 27 ]
No hay diferencia entre /dev/random y /dev/urandom ; ambos se comportan de forma idéntica. [ 28 ] [ 29 ]
Otros sistemas operativos
/dev/random y /dev/urandom también están disponibles en Solaris, [ 30 ] NetBSD, [ 31 ] Tru64 UNIX 5.1B, [ 32 ] AIX 5.2 [ 33 ] y HP-UX 11i v2. [ 34 ] Al igual que FreeBSD, AIX implementa su propio diseño basado en Yarrow; sin embargo, AIX utiliza considerablemente menos fuentes de entropía que la implementación estándar de /dev/random y deja de rellenar el pool cuando cree que contiene suficiente entropía. [ 35 ]
En Windows NT , ksecdd.sys proporciona una funcionalidad similar , pero la lectura del archivo especial \Device\KsecDD no funciona como en UNIX. Los métodos documentados para generar bytes criptográficamente aleatorios son CryptGenRandom y RtlGenRandom . Windows PowerShell proporciona acceso a un generador de números pseudoaleatorios criptográficamente seguro mediante el cmdlet Get-SecureRandom . [ 36 ]
Véase también
- CryptGenRandom : el generador de números pseudoaleatorios criptográficamente seguro (CSPRNG) de la API de Microsoft Windows.
- /desarrollo
- Llamadas al sistema que suministran entropía
- Algoritmo de Fortuna
- Generador de números aleatorios por hardware
- Flujos estándar
Referencias
- ↑ "random(7) - Página del manual de Linux" . 10 de febrero de 2023. Consultado el 24 de noviembre de 2023 .
- 1 2 Lloyd, Jack (2008-12-09). "Sobre /dev/random de Syllable" . Recuperado el 2019-08-21 .
- ↑ "/dev/random se parece más a /dev/urandom con Linux 5.6 - Phoronix" . www.phoronix.com .
- ↑ "kernel/git/torvalds/linux.git - Árbol de código fuente del kernel de Linux" . kernel.org. 27 de julio de 2016. Consultado el 23 de noviembre de 2016 .
- ↑ "Generador de números aleatorios de Linux 5.17 experimenta mejoras de velocidad al cambiar de SHA1 a BLAKE2s - Phoronix" . www.phoronix.com .
- ↑ "/dev/random" . Everything2 . 8 de junio de 2003. Archivado del original el 17 de noviembre de 2009. Consultado el 3 de julio de 2013 .
- 1 2 3 4 – Manual del programador de Linux – Archivos especiales de Manned.org
- ↑ "Implementación de /dev/random y /dev/urandom en Linux 1.3.39, función " . 1995-11-04 . Recuperado el 2013-11-21 .
random_read_unlimited - ↑ Filippo Valsorda (29-12-2015). La simple realidad de la entropía .
- ↑ Gutterman, Zvi; Pinkas, Benny; Reinman, Tzachy (2006-03-06). "Análisis del generador de números aleatorios de Linux" (PDF) . Archivado (PDF) del original el 2008-10-03 . Recuperado el 2013-07-03 .
- ↑ "Guía del usuario de criptografía" . Texas Instruments . 4 de junio de 2013. Archivado del original el 16 de abril de 2018. Consultado el 3 de julio de 2013 .
- ↑ "kernel/git/torvalds/linux.git - Árbol de código fuente del kernel de Linux @ be4000bc4644d027c519b6361f5ae3bbfc52c347 "hwrng: crear hilo de relleno"" . Git.kernel.org . Consultado el 18 de octubre de 2016 .
- ↑ "??" . Vanheusden.com . Archivado del original el 21-09-2013 . Recuperado el 23-10-2016 .
- ↑ "Archivo de código de Google para los más apasionados" . Code.google.com . Consultado el 18 de octubre de 2016 .
- ↑ "El CD-ROM de números aleatorios de Marsaglia que incluye la batería Diehard de pruebas de aleatoriedad" . Stat.fsu.edu . Archivado del original el 25 de enero de 2016. Consultado el 23 de octubre de 2016 .
- ↑ "rng-tools" . Gnu.org . Consultado el 23 de octubre de 2016 .
- 1 2 3 Daniel J. Bernstein (05/02/2014). "cr.yp.to: 05/02/2014: ¡Ataques de entropía!" .
¿Existe algún argumento serio que defienda que añadir nueva entropía constantemente sea algo positivo? La página del manual de Linux /dev/urandom afirma que sin nueva entropía el usuario es "teóricamente vulnerable a un ataque criptográfico", pero (como he mencionado en varias ocasiones) este es un argumento absurdo.
- ↑ " [ PATCH 5.15 038/145 ] random: use computational hash for entropy extraction" . lore.kernel.org .
- ↑ – Manual de interfaces del kernel de FreeBSD
- ↑ "random(4)" . Páginas del manual en línea de DragonFly . Consultado el 15 de junio de 2024 .
- ↑ "Una comparación de la velocidad de /dev/random en Linux y BSD" . ianix.com . Consultado el 15 de junio de 2024 .
- ↑ – Manual de interfaces del kernel de OpenBSD
- ↑ deraadt , ed. (21-07-2014). "libc/crypt/arc4random.c" . Referencia cruzada de BSD, OpenBSD src/lib/ . Recuperado el 13-01-2015 .
Generador de números aleatorios basado en ChaCha para OpenBSD.
- ↑ naddy, ed. (14-11-2017). "src/etc/MAKEDEV.common" . Espejo del código fuente de OpenBSD en GitHub src/etc/ . Recuperado el 14-11-2017 .
/dev/arandom eliminado de OpenBSD.
- ↑ riastradh, ed. (16-11-2014). "libc/gen/arc4random.c" . Referencia cruzada de BSD, NetBSD src/lib/ . Recuperado el 13-01-2015 .
API arc4random(3) heredada de OpenBSD reimplementada usando el PRF ChaCha20, con estado por hilo.
- ↑ "Seguridad de la plataforma Apple" . Apple Inc.
- ↑ "xnu/bsd/dev/random en xnu-1456.1.26 - apple-oss-distributions/xnu" . Apple Inc. Consultado el 1 de noviembre de 2025 .
- ↑ – Manual de las interfaces del kernel de Darwin y macOS
- ↑ "Seguridad de iOS" (PDF) . Apple Inc. Octubre de 2012. Archivado del original (PDF) el 5 de abril de 2014. Consultado el 27 de mayo de 2015 .
- ↑ Moffat, Darren (12 de septiembre de 2013). "Generación de números aleatorios en Solaris" . Blog de Oracle Solaris . Consultado el 30 de abril de 2022 .
- ↑ – Manual de interfaces del kernel de NetBSD
- ↑ "random(4)" . 1999-09-19. Archivado del original el 2011-06-07 . Recuperado el 2013-07-03 .
- ↑ "Dispositivos aleatorios y ultrarrandom" . Centro de información de pSeries y AIX . 15 de marzo de 2010. Archivado del original el 3 de marzo de 2021. Consultado el 3 de julio de 2013 .
- ↑ "Generador de números aleatorios robusto de HP-UX" . 23 de julio de 2004. Archivado del original el 24 de diciembre de 2008. Consultado el 3 de julio de 2013 .
- ↑ Roberts, Iain (25-04-2003). "Dispositivos /dev/random y /dev/urandom de AIX 5.2" . Lists.gnupg.org. Archivado del original el 22-02-2012 . Recuperado el 03-07-2013 .
- ↑ "Get-SecureRandom (Microsoft.PowerShell.Utility) - PowerShell" . learn.microsoft.com . Consultado el 16 de junio de 2024 .
Enlaces externos
- Biege, Thomas (2006-11-06). "Análisis de un generador de números pseudoaleatorios robusto mediante la anatomía del dispositivo de números aleatorios de Linux" (PDF) . GitHub .
- Huhn, Thomas (2014). "Mitos sobre /dev/urandom" .Describe la infraestructura /dev/random de Linux 4.8 y la inutilidad de contabilizar la entropía "gastada". Incluye citas de criptógrafos. (La contabilización de la entropía "gastada" se eliminó en el kernel 5.17).
- Tecnología del sistema de archivos Unix
- Archivo del dispositivo
- generación de números aleatorios