Row hammer (también escrito como Rowhammer ) es un exploit de seguridad informática que aprovecha un efecto secundario no intencionado e indeseable en la memoria dinámica de acceso aleatorio (DRAM) en la que las celdas de memoria interactúan eléctricamente entre sí al filtrar sus cargas, posiblemente cambiando el contenido de filas de memoria cercanas que no fueron abordadas en el acceso a la memoria original. Esta elusión del aislamiento entre las celdas de memoria DRAM resulta de la alta densidad de celdas en la DRAM moderna y puede desencadenarse mediante patrones de acceso a la memoria especialmente diseñados que activan rápidamente las mismas filas de memoria numerosas veces. [1] [2] [3]
El efecto martillo de fila se ha utilizado en algunos exploits de seguridad informática de escalada de privilegios , [2] [4] [5] [6] y los ataques basados en red también son teóricamente posibles. [7] [8]
Existen diferentes técnicas basadas en hardware para evitar que se produzca el efecto martillo de fila, incluido el soporte requerido en algunos procesadores y tipos de módulos de memoria DRAM . [9] [10]
En la RAM dinámica (DRAM), cada bit de datos almacenados ocupa una celda de memoria separada que está implementada eléctricamente con un capacitor y un transistor . El estado de carga de un condensador (cargado o descargado) es lo que determina si una celda DRAM almacena "1" o "0" como valor binario . Una gran cantidad de celdas de memoria DRAM están empaquetadas en circuitos integrados , junto con cierta lógica adicional que organiza las celdas con el fin de leer, escribir y actualizar los datos. [11] [12]
Las celdas de memoria (cuadrados azules en ambas ilustraciones) se organizan en matrices y se abordan mediante filas y columnas. Una dirección de memoria aplicada a una matriz se divide en dirección de fila y dirección de columna, que son procesadas por los decodificadores de direcciones de fila y columna (en ambas ilustraciones, rectángulos verdes verticales y horizontales, respectivamente). Después de que una dirección de fila selecciona la fila para una operación de lectura (la selección también se conoce como activación de fila ), los bits de todas las celdas de la fila se transfieren a los amplificadores de detección que forman el búfer de fila (cuadrados rojos en ambas ilustraciones), desde donde el bit exacto se selecciona utilizando la dirección de la columna. En consecuencia, las operaciones de lectura son de naturaleza destructiva porque el diseño de la DRAM requiere que las celdas de memoria se reescriban después de que se hayan leído sus valores transfiriendo las cargas de las celdas al búfer de fila. Las operaciones de escritura decodifican las direcciones de manera similar, pero como resultado del diseño, se deben reescribir filas enteras para cambiar el valor de un solo bit. [1] : 2–3 [11] [12] [13]
Como resultado del almacenamiento de bits de datos mediante condensadores que tienen una tasa de descarga natural, las celdas de memoria DRAM pierden su estado con el tiempo y requieren una reescritura periódica de todas las celdas de memoria, lo cual es un proceso conocido como actualización. [1] : 3 [11] Como otro resultado del diseño, la memoria DRAM es susceptible a cambios aleatorios en los datos almacenados, que se conocen como errores de memoria blanda y se atribuyen a rayos cósmicos y otras causas. Existen diferentes técnicas que contrarrestan los errores de la memoria blanda y mejoran la confiabilidad de la DRAM, de las cuales la memoria de código de corrección de errores (ECC) y sus variantes avanzadas (como la memoria lockstep ) son las más utilizadas. [14]
Las mayores densidades de los circuitos integrados DRAM han llevado a celdas de memoria físicamente más pequeñas que contienen menos carga, lo que resulta en menores márgenes de ruido operativo , mayores tasas de interacciones electromagnéticas entre las celdas de memoria y una mayor posibilidad de pérdida de datos. Como resultado, se han observado errores de perturbación , causados por celdas que interfieren con el funcionamiento de otras y que se manifiestan como cambios aleatorios en los valores de los bits almacenados en las celdas de memoria afectadas. La conciencia de los errores de perturbación se remonta a principios de la década de 1970 y a Intel 1103 como los primeros circuitos integrados DRAM disponibles comercialmente; Desde entonces, los fabricantes de DRAM han empleado varias técnicas de mitigación para contrarrestar los errores de perturbación, como mejorar el aislamiento entre celdas y realizar pruebas de producción. Sin embargo, los investigadores demostraron en un análisis de 2014 que los chips SDRAM DDR3 disponibles comercialmente fabricados en 2012 y 2013 son susceptibles a errores de perturbación, al tiempo que utilizaron el término martillo de fila para nombrar el efecto secundario asociado que llevó a los cambios de bits observados . [1] [3] [15]
La posibilidad de que se produzca el efecto martillo de fila en la memoria DDR3 [16] se atribuye principalmente a la alta densidad de celdas de memoria de DDR3 y a los resultados de las interacciones asociadas entre las celdas, mientras que las rápidas activaciones de filas DRAM se han determinado como la causa principal. Las activaciones frecuentes de filas provocan fluctuaciones de voltaje en las líneas de selección de filas asociadas, que se ha observado que inducen tasas de descarga superiores a las naturales en condensadores que pertenecen a filas de memoria cercanas (adyacentes, en la mayoría de los casos), que se denominan filas víctimas ; Si las celdas de memoria afectadas no se actualizan antes de que pierdan demasiada carga, se producen errores de perturbación. Las pruebas muestran que se puede observar un error de perturbación después de realizar alrededor de 139.000 accesos posteriores a filas de memoria (con vaciados de caché ), y que hasta una celda de memoria de cada 1.700 celdas puede ser susceptible. Esas pruebas también muestran que la tasa de errores de perturbación no se ve sustancialmente afectada por el aumento de la temperatura ambiente, mientras que depende del contenido real de la DRAM porque ciertos patrones de bits dan como resultado tasas de errores de perturbación significativamente más altas. [1] [2] [15] [17]
Una variante llamada martilleo de doble cara implica activaciones dirigidas de dos filas de DRAM que rodean una fila de víctima: en la ilustración proporcionada en esta sección, esta variante activaría ambas filas amarillas con el objetivo de inducir cambios de bit en la fila morada, que en este caso El caso sería la fila de víctimas. Las pruebas muestran que este enfoque puede dar como resultado una tasa significativamente mayor de errores de perturbación, en comparación con la variante que activa solo una de las filas DRAM vecinas de la fila de la víctima. [4] [18] : 19–20 [19]
A medida que los proveedores de DRAM implementaron mitigaciones, los patrones tuvieron que volverse más sofisticados para evitar las mitigaciones de martillo de fila. Los patrones de martillo de hilera más recientes incluyen patrones no uniformes basados en frecuencia. [20] Estos patrones consisten en muchos pares de agresores de doble cara donde cada uno de ellos es golpeado con una frecuencia, fase y amplitud diferentes. Usando esto y sincronizando patrones con el comando REFRESH, es posible determinar de manera muy efectiva "puntos ciegos" donde la mitigación ya no puede brindar protección. Con base en esta idea, los académicos construyeron un fuzzer de martillo en fila llamado Blacksmith [21] que puede evitar las mitigaciones existentes en todos los dispositivos DDR4.
Existen diferentes métodos para detectar, prevenir, corregir o mitigar con mayor o menor éxito el efecto martillo. Las pruebas muestran que los códigos de corrección de errores simples , que proporcionan capacidades de corrección de un solo error y detección de errores dobles (SECDED), no pueden corregir o detectar todos los errores de perturbación observados porque algunos de ellos incluyen más de dos bits invertidos por palabra de memoria . [1] : 8 [15] : 32 Además, las investigaciones muestran que los cambios de martillo de fila de tres bits dirigidos con precisión evitan que la memoria ECC note las modificaciones. [22] [23]
Una solución menos eficaz es introducir actualizaciones de memoria más frecuentes, con intervalos de actualización más cortos que los habituales 64 ms, [a] pero esta técnica da como resultado un mayor consumo de energía y una mayor sobrecarga de procesamiento; algunos proveedores proporcionan actualizaciones de firmware que implementan este tipo de mitigación. [24] Una de las medidas de prevención más complejas realiza la identificación basada en contadores de las filas de memoria a las que se accede con frecuencia y actualiza proactivamente sus filas vecinas; otro método emite actualizaciones aleatorias infrecuentes adicionales de las filas de memoria vecinas a las filas a las que se accede, independientemente de su frecuencia de acceso. Las investigaciones muestran que estas dos medidas de prevención causan impactos insignificantes en el rendimiento. [1] : 10–11 [25]
Desde el lanzamiento de la microarquitectura Ivy Bridge , los procesadores Intel Xeon admiten la llamada actualización de fila pseudo objetivo (pTRR) que se puede utilizar en combinación con módulos de memoria dual en línea (DIMM) DDR3 compatibles con pTRR para mitigar el efecto de martillo de fila al Actualiza automáticamente las posibles filas de víctimas, sin impacto negativo en el rendimiento o el consumo de energía. Cuando se utilizan con DIMM que no son compatibles con pTRR, estos procesadores Xeon recurren de forma predeterminada a realizar actualizaciones de DRAM al doble de la frecuencia habitual, lo que da como resultado una latencia de acceso a la memoria ligeramente mayor y puede reducir el ancho de banda de la memoria hasta entre un 2% y un 4%. [9]
El estándar de memoria móvil LPDDR4 publicado por JEDEC [26] incluye soporte de hardware opcional para la llamada actualización de fila objetivo (TRR) que evita el efecto martillo de fila sin afectar negativamente el rendimiento o el consumo de energía. [10] [27] [28] Además, algunos fabricantes implementan TRR en sus productos DDR4 , [29] [30] aunque no forma parte del estándar de memoria DDR4 publicado por JEDEC. [31] Internamente, TRR identifica posibles filas de víctimas, contando el número de activaciones de filas y comparándolas con los valores de recuento máximo de activación (MAC) y ventana de activación máxima (t MAW ) específicos del chip predefinidos , y actualiza estas filas para evitar cambios de bits. . El valor MAC es el número total máximo de activaciones de fila que se pueden encontrar en una fila DRAM particular dentro de un intervalo de tiempo que es igual o más corto que la cantidad de tiempo t MAW antes de que sus filas vecinas se identifiquen como filas víctimas; TRR también puede marcar una fila como fila víctima si la suma de activaciones de fila para sus dos filas vecinas alcanza el límite MAC dentro de la ventana de tiempo t MAW . [26] [32] La investigación demostró que las mitigaciones de TRR implementadas en DDR4 UDIMM y chips LPDDR4X de dispositivos producidos entre 2019 y 2020 no son efectivas para proteger contra Rowhammer. [20]
Debido a la necesidad de una gran cantidad de activaciones de filas DRAM realizadas rápidamente, los exploits de martillo de fila generan una gran cantidad de accesos a memoria no caché que causan errores de caché , que pueden detectarse monitoreando la tasa de errores de caché para detectar picos inusuales utilizando contadores de rendimiento de hardware . [4] [33]
La versión 5.0 del software de diagnóstico de memoria MemTest86 , lanzada el 3 de diciembre de 2013, agregó una prueba de martillo en fila que verifica si la RAM de la computadora es susceptible a errores de perturbación, pero solo funciona si la computadora arranca UEFI ; sin UEFI, arranca una versión anterior sin prueba de martillo. [34]
La protección de la memoria , como forma de evitar que los procesos accedan a memoria que no ha sido asignada a cada uno de ellos, es uno de los conceptos detrás de la mayoría de los sistemas operativos modernos . Al utilizar la protección de la memoria en combinación con otros mecanismos relacionados con la seguridad, como los anillos de protección , es posible lograr una separación de privilegios entre procesos, en la que los programas y los sistemas informáticos en general se dividen en partes limitadas a los privilegios específicos que requieren para realizar una tarea particular. tarea. El uso de la separación de privilegios también puede reducir el alcance del daño potencial causado por ataques a la seguridad informática al restringir sus efectos a partes específicas del sistema. [35] [36]
Los errores de perturbación (explicados en la sección anterior) anulan eficazmente varias capas de protección de la memoria al " cortocircuitarlas " a un nivel de hardware muy bajo, creando prácticamente un tipo de vector de ataque único que permite a los procesos alterar el contenido de partes arbitrarias de la memoria principal. manipulando directamente el hardware de memoria subyacente. [2] [4] [18] [37] En comparación, los vectores de ataque "convencionales", como los desbordamientos de búfer, tienen como objetivo eludir los mecanismos de protección a nivel de software, explotando varios errores de programación para lograr alteraciones de contenidos de la memoria principal que de otro modo serían inaccesibles. [38]
La investigación inicial sobre el efecto martillo, publicada en junio de 2014, describió la naturaleza de los errores de perturbación e indicó el potencial para construir un ataque, pero no proporcionó ningún ejemplo de un exploit de seguridad que funcione. [1] Un artículo de investigación posterior de octubre de 2014 no implicaba la existencia de ningún problema relacionado con la seguridad que surgiera del efecto martillo. [dieciséis]
El 9 de marzo de 2015, el Proyecto Zero de Google reveló dos exploits de escalada de privilegios de trabajo basados en el efecto martillo de fila, estableciendo su naturaleza explotable en la arquitectura x86-64 . Uno de los exploits revelados tiene como objetivo el mecanismo Google Native Client (NaCl) para ejecutar un subconjunto limitado de instrucciones de máquina x86-64 dentro de un sandbox , [18] : 27 explotando el efecto de martillo de fila para escapar del sandbox y obtener la capacidad de emitir llamadas al sistema directamente. Esta vulnerabilidad de NaCl , rastreada como CVE - 2015-0565, se ha mitigado modificando NaCl para que no permita la ejecución de la instrucción de máquina ( vaciado de línea de caché [39] ), que anteriormente se creía necesaria para construir una fila efectiva. ataque de martillo. [2] [4] [37]clflush
El segundo exploit revelado por Project Zero se ejecuta como un proceso Linux sin privilegios en la arquitectura x86-64, explotando el efecto martillo de fila para obtener acceso sin restricciones a toda la memoria física instalada en una computadora. Al combinar los errores de perturbación con la pulverización de memoria , este exploit es capaz de alterar las entradas de la tabla de páginas [18] : 35 utilizadas por el sistema de memoria virtual para asignar direcciones virtuales a direcciones físicas , lo que da como resultado que el exploit obtenga acceso ilimitado a la memoria. [18] : 34, 36–57 Debido a su naturaleza y a la incapacidad de la arquitectura x86-64 para crear clflush
una instrucción de máquina privilegiada, este exploit difícilmente puede mitigarse en computadoras que no utilizan hardware con mecanismos de prevención de martillo de fila incorporados. . Mientras probaba la viabilidad de los exploits, Project Zero descubrió que aproximadamente la mitad de las 29 computadoras portátiles probadas experimentaron errores de perturbación, y algunos de ellos ocurrieron en computadoras portátiles vulnerables en menos de cinco minutos de ejecución de código que inducía el martillo en fila; Las computadoras portátiles probadas se fabricaron entre 2010 y 2014 y utilizaron memoria DDR3 sin ECC. [2] [4] [37]
En julio de 2015, un grupo de investigadores de seguridad publicó un artículo que describe una forma independiente de la arquitectura y del conjunto de instrucciones para explotar el efecto martillo de fila. En lugar de depender de las clflush
instrucciones para realizar vaciados de caché, este enfoque logra accesos a memoria no almacenados en caché al provocar una tasa muy alta de desalojo de caché utilizando patrones de acceso a memoria cuidadosamente seleccionados. Aunque las políticas de reemplazo de caché difieren entre procesadores, este enfoque supera las diferencias arquitectónicas mediante el empleo de un algoritmo de estrategia de desalojo de caché adaptable . [18] : 64–68 La prueba de concepto de este enfoque se proporciona como una implementación de código nativo y como una implementación de JavaScript pura que se ejecuta en Firefox 39. La implementación de JavaScript, llamada Rowhammer.js , [40] utiliza tipos de letra grandes. matrices y se basa en su asignación interna utilizando páginas grandes ; como resultado, demuestra un exploit de muy alto nivel de una vulnerabilidad de muy bajo nivel. [41] [42] [43] [44]
En octubre de 2016, los investigadores publicaron DRAMMER, una aplicación de Android que utiliza un martillo de hilera, junto con otros métodos, para obtener acceso root de manera confiable en varios teléfonos inteligentes populares. [45] La vulnerabilidad fue reconocida como CVE - 2016-6728 [46] y Google lanzó una mitigación dentro de un mes. Sin embargo, debido a la naturaleza general de las posibles implementaciones del ataque, es difícil implementar de manera confiable un parche de software efectivo. En junio de 2018, la mayoría de las propuestas de parches realizadas por el mundo académico y la industria no eran prácticas de implementar o eran insuficientes para detener todos los ataques. Como mitigación, los investigadores propusieron una defensa ligera que previene ataques basados en el acceso directo a la memoria (DMA) aislando los buffers DMA con filas de guardia. [47] [48]
En mayo de 2021, un equipo de investigación de Google anunció un nuevo exploit, Half-Double, que aprovecha el empeoramiento de la física de algunos de los chips DRAM más nuevos. [49]
En marzo de 2024, un grupo de investigadores de ETH Zürich anunció ZenHammer, un exploit de martillo para chips AMD Zen , y también anunció el primer uso de martillo para explotar la SDRAM DDR5 . [50] [51]
En junio de 2024, un grupo de investigadores de ETH Zürich anunció RISC-H, un exploit de martillo para chips RISC-V ; este es el primer estudio de Rowhammer sobre RISC-V. [52]
InfoWorld
9 de marzo de 2015, por Serdar Yegulalp