¿Por qué funciona este ataque de caché?

11

Recientemente estuve leyendo el siguiente documento sobre cómo realizar un ataque de caché en Javascript:

enlace

Pero estaba confundido por cómo podría funcionar. En el documento, un búfer de 8 MB era suficiente para tener una alta tasa de éxito para encontrar un conjunto de desalojo (para un caché de 12 vías). No estoy exactamente seguro de cómo esto es posible.

Calculé los números para mi propia computadora, y parece que no funcionaría (caché de 3MB, 12 vías):

  • El búfer de desalojo puede ser de 4 MB en lugar de 8 MB
  • Esto es lo que almacenaría el índice del búfer:
    • Bits 0 - 6: byte dentro de la línea de caché
    • Bits 6 - 12: primeros 6 bits del índice establecido
    • Bits after 12: no es útil, ya que se puede asignar a cualquier dirección física
  • Hay 1024 páginas en el búfer de desalojo
  • De estas 1024 páginas, debe haber 12 que se asignen a una página física que comparta el mismo valor para los bits 12 a 18 que la dirección de la víctima. No soy bueno con la probabilidad, pero esto parece bastante poco confiable

¿Por qué funciona?

Lo probé en mi propia computadora, y parece poder desalojar la dirección de la víctima el 70% del tiempo (aunque incluso si no ejecuto ningún desalojo, la dirección de la víctima todavía parece para obtener una tasa de fallos de alrededor del 20%).

    
pregunta sunny-lan 18.01.2018 - 21:23
fuente

1 respuesta

2

Suponiendo que el sistema operativo asigna páginas de forma completamente aleatoria, mi mejor cálculo dice que hay un 11% de probabilidad de que cualquier dirección de víctima tenga al menos 12 páginas coincidentes en su búfer de 4MB. Eso no es muy probable, y ciertamente no está de acuerdo con la tasa de éxito del 70% que viste.

Sin embargo, existen buenas razones para que un sistema operativo evite la asignación aleatoria de páginas y, en su lugar, haga todo lo posible para asignar páginas contiguas. Una razón para esto es que el sistema operativo a veces necesita asignar grandes búferes contiguos (para admitir páginas grandes o grandes búferes de DMA, por ejemplo), y la asignación aleatoria de páginas físicas dificultaría mucho encontrar una región lo suficientemente grande. Esto se conoce como fragmentación de la memoria.

Pero en el contexto de esta discusión, un beneficio más interesante de la asignación contigua es (irónicamente) el rendimiento del caché de nivel 3. Si está ejecutando un algoritmo que utiliza un búfer de memoria grande, la forma de obtener el mejor rendimiento es asignar memoria física contigua, para que las páginas individuales no se expulsen entre sí de la memoria caché. Si el SO logra maximizar el rendimiento de esta manera, también logrará maximizar la efectividad del ataque: su búfer de 4MB cubrirá todo el caché, y tendrá un 100% de probabilidad de desalojar una página víctima. Por lo tanto, su tasa de éxito observada del 70% es menos una medida de probabilidad y más una medida aproximada de la efectividad del sistema operativo en la asignación de páginas para un buen rendimiento de caché.

Si desea ver un ejemplo de un sistema operativo funcionando de esta manera en la práctica, lea sobre Linux repartidor de amigos . Comienza por romper la memoria en un conjunto de grandes bloques libres. Luego, si quiere asignar una página, toma uno de esos bloques grandes y lo divide por la mitad. Luego toma una de las mitades y la divide de nuevo en dos, y continúa hasta que tiene un par de bloques de 1 página, en cuyo punto también tiene un bloque de 2 páginas, uno de 4 tamaños, uno De tamaño 8, etc. Las primeras dos asignaciones serán esos dos bloques de 1 página, que están uno al lado del otro porque son el resultado de romper un bloque de 2 páginas por la mitad. La tercera asignación romperá el otro bloque de 2 páginas a la mitad, que nuevamente estará al lado de los otros dos por las mismas razones.

Entonces, cada vez que necesita una nueva página, el asignador toma el bloque más pequeño que puede encontrar y lo descompone hasta que tenga una sola página. Finalmente, cuando se libera una página, el asignador verifica si hay una página libre justo al lado, para que pueda volver a formar esas dos páginas en un bloque más grande. El efecto neto es mantener las asignaciones aproximadamente contiguas cuando sea posible.

    
respondido por el Jander 16.07.2018 - 11:23
fuente

Lea otras preguntas en las etiquetas