Articulo de referencia

Llamadas al sistema que suministran entropía

Las llamadas al sistema que suministran entropía son llamadas al sistema en los núcleos de sistemas operativos tipo Unix a través de las cuales los procesos pueden obtener datos...

Las llamadas al sistema que suministran entropía son llamadas al sistema en los núcleos de sistemas operativos tipo Unix a través de las cuales los procesos pueden obtener datos entrópicos o aleatorios. La primera de ellas fue , introducida en el sistema operativo OpenBSD en la versión 5.6 (noviembre de 2014), como una refactorización del enfoque sysctl(3) KERN_ARND utilizado desde 1997. [ 1 ] Linux ofrece una llamada al sistema muy similar, , que se basó en . [ 2 ] Estuvo disponible por primera vez en Linux 3.17, lanzado en octubre de 2014. [ 3 ] En julio de 2015, Solaris introdujo versiones ligeramente modificadas de y . [ 4 ] En agosto de 2015, FreeBSD introdujo la llamada al sistema para obtener datos aleatorios del núcleo. [ 5 ]getentropygetrandomgetentropygetentropygetrandomread_random

Estas llamadas al sistema permiten que los procesos accedan a datos aleatorios de calidad sin necesidad de abrir ni leer pseudodispositivos de aleatoriedad .

Las API de Microsoft Windows y CryptGenRandomApple iOS son muy similares. Sin embargo, no están implementadas como llamadas al sistema.SecRandom

Motivación

Tradicionalmente, los sistemas operativos tipo Unix proporcionan datos aleatorios a través de dos pseudodispositivos : /dev/randomy /dev/urandom. Sin embargo, leer datos aleatorios de estos dispositivos de forma segura y fiable puede ser difícil y complicado. Por ejemplo, un atacante podría interferir con el acceso de un proceso a los pseudodispositivos abriendo todos los descriptores de archivo disponibles, o mediante un ataque similar de agotamiento de recursos . El uso de estos dispositivos también interfiere con la revocación de privilegios . A menudo, a los procesos sin privilegios se les niega la capacidad de abrir y leer archivos y dispositivos, y los dispositivos de aleatoriedad ni siquiera son visibles para los procesos en chroot .

La dificultad de usar pseudodispositivos aleatorios a menudo lleva a los desarrolladores a usar funciones de bibliotecas estándar en su lugar. Algunas de estas, como las del lenguaje de programación Crand() , POSIX y random(), drand48()son muy inseguras cuando se usan para criptografía o aplicaciones similares, porque estos algoritmos son en realidad deterministas, habiendo sido intencionalmente limitados para satisfacer los requisitos de reutilización de semillas a través de las interfaces srand(), srandom(), y srand48().

Existe una diferencia significativa entre estas llamadas: getentropy()garantiza que se devolverán números aleatorios inmediatamente, sin ningún bloqueo. Requiere soporte operativo que garantice la inicialización del flujo de datos aleatorios lo antes posible. Para incentivar a otros sistemas operativos a seguir este modelo, getentropy()no puede indicar errores a la aplicación. Otras llamadas descritas aquí pueden devolver errores o bloquearse indefinidamente. Dicha semántica de bloqueo se ha visto implicada en problemas importantes. [ 6 ]

A medida que la seguridad se convierte en una prioridad más generalizada en el desarrollo de software, la aleatoriedad de calidad se utiliza con mayor frecuencia y en más contextos. Por ello, proporcionar aleatoriedad de calidad se considera cada vez más una responsabilidad fundamental del núcleo. Las llamadas al sistema son la interfaz tradicional mediante la cual un proceso utiliza los servicios principales del núcleo , y, por lo tanto, los núcleos admiten el acceso a la aleatoriedad a través de llamadas al sistema.

Uso

Debido a que es más rápido y agrega otra capa de mezcla de entropía, generalmente se sugiere que los procesos usen los datos de estas llamadas al sistema a través de un generador de números pseudoaleatorios criptográficamente seguro en el espacio de usuario (CSPRNG) en lugar de asignar los datos recuperados directamente a variables. Para este propósito, la biblioteca estándar C de OpenBSD incluye la función arc4random, que se espera que los programas llamen cuando necesiten datos aleatorios. [ 1 ] Al igual que getentropy, arc4randomtampoco puede bloquearse ni devolver un error.

Este enfoque permite que un programa obtenga menos entropía del núcleo sin reducir la fuerza de sus datos aleatorios. La getentropyllamada al sistema está diseñada en base a esta suposición, proporcionando no más de 256 bytes por llamada. [ 1 ] [ 7 ]

Véase también

Referencias

  1. 1 2 3 "getentropy(2) Página man de OpenBSD" . Páginas del manual de OpenBSD . OpenBSD . Consultado el 27 de mayo de 2016 .
  2. " [ PATCH, RFC ] random: introduce la llamada al sistema getrandom(2)" . LKML . 17 de julio de 2014 . Consultado el 30 de diciembre de 2015 .
  3. "Linux 3.17" . Linux Kernel Newbies . Consultado el 30 de diciembre de 2015 .
  4. Darren, Moffat. "Nuevas llamadas al sistema de Solaris: getentropy(2) y getrandom(2)" . /dev/urandom . Oracle. Archivado del original el 2 de agosto de 2017. Recuperado el 3 de enero de 2016 .
  5. "Revisión r286839" . svnweb.freebsd.org . FreeBSD . Consultado el 29 de agosto de 2017 .
  6. "Python se bloquea durante el arranque" . Consultado el 28 de abril de 2017 .
  7. "arc4random(3) Página man de OpenBSD" . Páginas del manual de OpenBSD . OpenBSD . Consultado el 27 de mayo de 2016 .
  • Llamada al sistema para obtener números aleatorios: getrandom() , LWN.net , 23 de julio de 2014, por Jake Edge