Entropía del kernel de Linux: ¿le importa a / dev / urandom y cuál es el mínimo?

8

Esta pregunta se ha formulado varias veces, pero todavía no se entiende claramente algo de otras respuestas

Tengo algunos servidores que se ejecutan con un kernel de Linux personalizado (módulos de controladores mínimos, etc.) y no tengo discos conectados (todo está basado en NAS). El kernel entropy_avail puede ser 180-200 con mayor frecuencia y puede ir tan bajo como 140 veces más. Mis aplicaciones usan /dev/urandom (una aplicación java que usa SecureRandom() que utiliza internamente /dev/urandom )

  • De esta buena writeup , parece, /dev/urandom random stream depende principalmente del archivo semilla generado en el momento de la instalación (y la posterior reinicialización durante el tiempo de arranque). ¿Significa que la cifra entropy_avail no tiene impacto en los números aleatorios generados con /dev/urandom ? La pregunta es, ¿los números aleatorios de% co_de dependen de alguna manera de la entropía disponible?
  • En caso afirmativo, ¿cuál es un límite inferior aceptable para la entropía disponible en el sistema? (200, 256? Hay muchos que se citan por ahí ..)
  • Si no, entonces citando la página de manual.
      

    Una lectura del dispositivo / dev / urandom no bloqueará la espera de más          entropía Si no hay suficiente entropía, un número pseudoaleatorio          El generador se utiliza para crear los bytes solicitados.

  •   
  ¿No es eso contradictorio?
  • El significado de /dev/urandom . Entendemos por la página del manual que el tamaño total de la agrupación de entropía es 4096 bits , lo que implica que hay 2 ^ 4096 posibilidades para el resultado. Entonces, si entropy_avail es 140, ¿significa que se reduce a 2 ^ 140? Todavía creo que es un número enorme, ¿desde qué punto debo empezar a preocuparme?
  • En mi caso, como puede ver, el entropy_avail es probablemente más bajo de lo que se observa en un sistema de escritorio normal. ¿Debo considerar las herramientas de generación de entropía de software (heged, rngd, etc.) o algún hardware específico para ayudar a mejorarlo? ¿Eso realmente impactaría la salida de entropy_avail ?
pregunta user3461411 20.04.2015 - 18:17
fuente

2 respuestas

16

Entropy se requiere en el siguiente sentido: si un PRNG tiene solo n bits de entropía, esto significa que tiene (conceptualmente) solo 2 < em> n posibles estados internos, y por lo tanto, podrían romperse mediante la enumeración brutal de estos 2 estados n , siempre que n es lo suficientemente bajo para que tal ataque de fuerza bruta sea factible.

Entonces las cosas se vuelven complejas, porque el "nivel de entropía" informado por el kernel NO es la entropía. No del que hablo más arriba.

Desde un punto de vista criptográfico , el algoritmo que calcula la salida de /dev/random y /dev/urandom es a (supuestamente) PRNG criptográficamente seguro . Lo que importa para la seguridad práctica es, de hecho, la entropía acumulada del estado interno. Salvo debilidades criptográficas en ese PRNG (no se conoce ninguna en este momento), la entropía solo puede aumentar o permanecer constante a lo largo del tiempo. De hecho, la "entropía" también se puede llamar "aquello que el atacante no sabe" y si el PRNG es criptográficamente seguro, entonces, por definición, la observación de gigabytes de producción solo produce información insignificante en el estado interno. Eso es lo que significa criptográficamente seguro .

Por lo tanto, si /dev/urandom tenía 200 bits de entropía en algún momento desde el último arranque, entonces still tiene 200 bits de entropía, o incluso más.

Desde el punto de vista de quien haya escrito ese código (y la temida página de manual correspondiente), la entropía se "agota" con el uso. Esta es la postura de alguien que asume, por el bien del argumento, que el PRNG no es no criptográficamente seguro, y de hecho es de alguna manera equivalente a simplemente emitir el estado interno tal como está. Desde ese punto de vista, si /dev/random comenzó con n bits de entropía y produce k bits, entonces ahora tiene nk bits de entropía .

Sin embargo, este punto de vista no es en última instancia sostenible, ya que si bien se basa en la suposición de que el PRNG está completamente roto y no funciona, también se basa en también , al mismo tiempo , en el supuesto de que el PRNG todavía es criptográficamente lo suficientemente seguro como para convertir la "entropía del hardware" (las fuentes de los elementos de datos que se supone que son algo aleatorios) en una buena secuencia uniforme de bits. En pocas palabras, la noción de agotamiento de la entropía funciona solo mientras asumamos la suposición extrema de que el PRNG es completamente débil, pero bajo este supuesto, la estimación de cuánta es realmente la entropía está completamente errada.

En esencia, ese punto de vista es contradictorio. Desafortunadamente, /dev/random implementa una estrategia de bloqueo que se basa en esta estimación de entropía defectuosa, lo cual es bastante inconveniente.

/dev/urandom nunca bloquea , independientemente de la cantidad de "entropía de hardware" que se haya recopilado desde el último arranque. Sin embargo, en las instalaciones "normales" de Linux, se inserta una semilla aleatoria al principio del proceso de arranque; esa semilla se guardó en el arranque anterior y se renueva inmediatamente después de la inserción. Esa semilla en su mayoría extiende la entropía de /dev/urandom a través de reinicios. Así que la afirmación se convierte en: si /dev/urandom tenía 200 bits de entropía en algún momento desde que se instaló el sistema operativo , entonces todavía tiene 200 bits de entropía.

Este comportamiento aún puede ser un poco problemático para algunos casos específicos, por ejemplo, arranque sin disco. La máquina de arranque puede necesitar cierta aleatoriedad antes para tener acceso a sus archivos (por ejemplo, para establecer un IPsec contexto necesario para llegar al servidor que contiene dichos archivos). Una mejor implementación de /dev/urandom se bloquearía hasta que se haya reunido una cantidad suficiente de entropía de hardware (por ejemplo, 128 bits), pero luego produciría bits "para siempre", sin implementar algún tipo de agotamiento de entropía. Esto es precisamente lo que hace /dev/urandom de FreeBSD. Y esto es bueno.

Resumen: no te preocupes. Si el PRNG utilizado en el kernel es criptográficamente seguro, como parece ser, entonces el recuento de "entropy_avail" no tiene sentido. Si el PRNG utilizado en el kernel es no criptográficamente seguro, entonces el recuento de "entropy_avail" es todavía defectuoso, y usted está en graves problemas de todos modos.

Tenga en cuenta que las instantáneas de VM rompen la entropía, ya que el comportamiento de la VM después de la restauración siempre funcionará en el estado que se guardó en la instantánea, y divergirá solo a través de la acumulación de eventos de hardware nuevos (lo que puede ser complicado en una VM, ya que el hardware de la VM no es verdadero hardware). El contador "entropy_avail" del kernel y el comportamiento de bloqueo de /dev/random , cambian nada a eso. Las instantáneas / restauraciones de VM son una vulnerabilidad de seguridad mucho más plausible para el PRNG del sistema que el escenario académico, puramente teórico que "entropy_avail" intenta capturar (y en realidad no logra).

    
respondido por el Thomas Pornin 20.04.2015 - 19:07
fuente
-1

Existe la instrucción RDRAND basada en hardware en los procesadores IvyBridge Intel. Si eso está disponible (es decir, el chip tiene instucción y no tiene el encubrimiento de errores de hardware de RDRAND), entonces creo que Linux lo usa automáticamente. Lo que significa que debes obtener cantidades muy grandes de números aleatorios verdaderos muy rápido.

    
respondido por el SeanOCVN 20.04.2015 - 23:56
fuente

Lea otras preguntas en las etiquetas