¿Qué tan malo es alimentar / dev / random con / dev / urandom?

7

He visto muchos publicaciones de blog , o blog comentarios que recomienda alimentar / dev / random entropy utilizando el resultado de / dev / urandom.

No soy un experto en criptografía, pero parece ser una buena forma de reemplazar números difíciles de predecir con números mucho menos aleatorios. Pero, ¿hay alguna idea de qué tan peor es efectivamente?

Si alguna vez encuentro un servidor con una configuración de este tipo, ¿necesito invalidar los certificados tls, las claves ssh y gpg que conozca, como con el infame error de Debian CVE-2008-0166? ¿O es más parecido a que un atacante patrocinado por el estado pueda encontrar mi clave privada en unos miles de millones de euros?

    
pregunta ascobol 02.05.2016 - 22:27
fuente

3 respuestas

3

Estoy asumiendo un sistema Linux aquí, en algunos sistemas operativos como FreeBSD y Mac OS no hay ninguna diferencia entre /dev/random y /dev/urandom , y otros no tienen esos dispositivos

Tanto /dev/random como /dev/urandom usan el mismo conjunto de entropía. La diferencia es que / dev / random "cuenta" cuántos bytes se han extraído, estimando la entropía que queda en el conjunto. Si en algún momento considera que no hay suficiente entropía para lo que se solicita, se bloqueará, mientras que /dev/urandom proporcionará los bytes solicitados.

El hecho es que solo /dev/urandom hubiera estado perfectamente bien (excepto poco después del arranque) . Alimentar a /dev/random con /dev/urandom es una forma de hacer trampa, pero realmente no debería romper la seguridad.

  

¿Debo invalidar los certificados tls, las claves ssh y gpg, como las del infame error de CVE-2008-0166?

En absoluto.

  

O es más parecido a que un atacante patrocinado por el estado pueda encontrar mi clave privada con unos miles de millones de euros

Incluso para un atacante patrocinado por el estado, no creo que no se pueda tratar de averiguar los bytes aleatorios que se extrajeron de la agrupación aleatoria en un sistema normal.

La excepción son los dispositivos integrados, como los enrutadores, en los que con demasiada frecuencia se genera una clave aleatoria (por ejemplo, para https o ssh) poco después del inicio, donde en realidad tienen un estado bastante determinista.

Aún así, para las claves de largo plazo como las que usted menciona, es posible que prefiera alimentar desde /dev/random sabiendo que tomará más tiempo, y simplemente evitar el uso de /dev/urandom . Y eso también está bien.

    
respondido por el Ángel 02.05.2016 - 23:05
fuente
2

Es una estupidez, pero no es peligroso.

El motivo es que Linux es conservador y trata los datos que alimenta en /dev/random como deterministas, por lo que no aumenta su entropía interna estimada.

Desde la página de manual :

  

Escribir en /dev/random o /dev/urandom actualizará el conjunto de entropía con los datos escritos, pero esto no dará como resultado un mayor recuento de entropía. Esto significa que afectará el contenido leído de ambos archivos, pero no hará que las lecturas de /dev/random sean más rápidas.

Entonces, copiar bytes de /dev/urandom a /dev/random solo desperdicia la CPU, pero no es peligroso. Si ve que esto se hace en un servidor, no debe preocuparse por ello per se. Lo más perturbador de esto es probablemente una pista de que el servidor fue configurado por una persona que cree en aceite de serpiente por seguridad o, lo que es peor, trata de eludir las funciones de seguridad que se instalaron por una razón. Aunque este último no hubiera funcionado en este caso. 1 Entonces, tal vez compruebe si hay otras cosas en el servidor que podrían ser menos benignas.

Por otra parte, la lectura de /dev/random podría ser útil en una secuencia de inicio porque se bloqueará hasta que el sistema haya reunido suficiente entropía en su grupo interno para hacer que /dev/urandom sea seguro de usar.

1 Si realmente quieres ser mezquino y hacer que /dev/random no se bloquee, incluso si el kernel ha estimado que tiene poca entropía, simplemente puedes convertirlo en un alias para /dev/urandom . .

# rm -f /dev/random
# mknod -m 0666 /dev/random c 1 9

Consulte la página de manual de mknod y observe la salida de

$ stat /dev/random /dev/urandom

si estás confundido acerca de lo que está pasando aquí. (El comando stat es seguro de ejecutar.)

Por supuesto, recomiendo fuertemente contra trucos asquerosos como este.

    
respondido por el 5gon12eder 06.02.2017 - 01:59
fuente
0

Intentaré responder una pregunta simplificada: ¿existe un ataque factible en un CSPRNG verdadero (generador de números aleatorios criptográficamente seguro)? Y luego, ¿qué pasa si no es un CSPRNG perfecto?

caso 1)

Para simplificar las cosas, suponga que no se agrega entropía después de la configuración de inicialización de un CSPRNG verdadero determinista. Además, no asuma ninguna fuga de información en la inicialización.

Desde wikipedia, la definición de CSPRNG es la siguiente:

  

Cada CSPRNG debe satisfacer la siguiente prueba de bits. Es decir, dados los primeros k bits de una secuencia aleatoria, no hay tiempo polinomial   Algoritmo que puede predecir el bit (k + 1) con probabilidad de éxito.   No despreciable mejor que el 50%. Andrew Yao demostró en 1982 que una   generador pasando la prueba de bit siguiente pasará todos los demás   Pruebas estadísticas de aleatoriedad en tiempo polinómico.

     

Cada CSPRNG debe soportar "extensiones de compromiso de estado". En el caso de que parte o la totalidad de su estado haya sido revelado (o adivinado)   correctamente), debería ser imposible reconstruir el flujo de   Números aleatorios previos a la revelación. Además, si hay un   La entrada de entropía durante la ejecución, no debería ser factible utilizar el conocimiento.   del estado de la entrada para predecir las condiciones futuras del estado CSPRNG.

Eso dice incluso si parte de la secuencia de salida aleatoria se filtra, las partes de la secuencia antes y después de esa parte filtrada no se pueden determinar.

En ese caso, está completamente seguro al utilizar /dev/urandom , incluso si hay una filtración de los datos de secuencia aleatoria y incluso si no se agregan datos aleatorios externos a la secuencia después de la inicialización.

caso 2)

Supongamos que resulta que el llamado CSPRNG está realmente roto. Solo por la venta del argumento, supongamos que, dada una filtración parcial de la secuencia, tanto las partes pasadas como futuras de la secuencia "lo suficientemente cerca" de la filtración están gravemente comprometidas.

En tal caso de CSPRNG roto, la entropía agregada agregará seguridad al sistema. Si 256 bits verdaderos de entropía separan la fuga y un número aleatorio X utilizado para un propósito crítico, entonces el espacio de búsqueda para un ataque en X se amplía en 2 ^ 256, y por lo tanto es totalmente seguro.

Entonces, el caso 2 es un riesgo bajo las siguientes 2 condiciones:

  1. Hay una fuga del estado de secuencia aleatoria.
  2. El PRNG no es un CSPRNG perfecto.

Pero asegurar una entropía suficiente puede mitigar perfectamente el riesgo.

Sobre la condición (1): la posibilidad de una fuga de datos. Algunas implementaciones de Java proporcionan acceso a los datos / dev / random subyacentes. Lo dice en la documentación de Java.

Eso es genial para elegir números aleatorios en Java, pero podría ser usado por malware basado en Java para filtrar información en su secuencia aleatoria. Además de Java, cada vez que cree una contraseña aleatoria con su software y la distribuya a un sitio web externo, es probable que se filtre información sobre su estado de secuencia aleatoria.

Sobre la condición (2): si bien es posible demostrar que un PRNG en particular no es un CSPRNG, no es posible probar que un PRNG en particular es un CSPRNG. Solo debes esperar que el CSPRNG no haya sido refutado sin que lo sepas. También hay sombras de gris: un ataque particular solo abre una ventana estrecha de vulnerabilidad antes y después de una fuga, y requeriría enormes recursos para explotarla. Evaluar el riesgo de un ataque desconocido (para usted) con un número concreto es difícil o imposible, pero tratar el riesgo como una variable desconocida y examinar el costo de la mitigación frente a las consecuencias, ya que el riesgo varía, es un ejercicio significativo.

Nota: hay una pregunta de un laico: si el PRNG es determinista, ¿cómo puede el siguiente bit no ser predecible si ocurre una fuga? La respuesta es que aunque el algoritmo de secuencia aleatoria general en sí mismo se conoce públicamente, la función utilizada para la transición de un par (valor, estado) al siguiente par (valor, estado) se elige inicialmente de una gran familia de funciones, por ejemplo, una de 2 ^ 256 tales funciones. Luego se pueden usar otros 256 bits para inicializar la función elegida. (En realidad, solo se requieren 128 bits para inicializar la secuencia /dev/random ).

    
respondido por el Craig Hicks 27.04.2018 - 10:16
fuente

Lea otras preguntas en las etiquetas