Rowhammer (también escrito como row hammer o RowHammer) es una vulnerabilidad de seguridad informática que aprovecha un efecto secundario no deseado en la memoria de acceso aleatorio dinámico (DRAM), en el cual las células de memoria interactúan eléctricamente entre sí al filtrar sus cargas, pudiendo alterar el contenido de filas de memoria cercanas que no fueron direccionadas en el acceso original a la memoria. Esta violación del aislamiento entre las células de memoria DRAM resulta de la alta densidad de células en las memorias DRAM modernas y puede desencadenarse mediante patrones de acceso a la memoria diseñados específicamente que activan repetidamente las mismas filas de memoria numerosas veces.[1][2][3]
El efecto Rowhammer ha sido utilizado en algunos exploits de escalada de privilegios en seguridad informática,[2][4][5][6] y también son teóricamente posibles los ataques basados en redes.[7][8]
Existen diferentes técnicas basadas en hardware para prevenir el efecto Rowhammer, incluyendo soporte requerido en algunos procesadores y tipos de módulos de memoria DRAM.[9][10]
En la memoria DRAM, cada bit de datos almacenados ocupa una célula de memoria separada que se implementa eléctricamente con un condensador y un transistor. El estado de carga de un condensador (cargado o descargado) determina si una célula DRAM almacena "1" o "0" como un valor binario. Enormes cantidades de células de memoria DRAM se empaquetan en circuitos integrados, junto con lógica adicional que organiza las células para leer, escribir y refrescar los datos.[11][12]
Las células de memoria (cuadrados azules en ambas ilustraciones) se organizan además en matrices y se direccionan a través de filas y columnas. Una dirección de memoria aplicada a una matriz se divide en la dirección de fila y la 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 células en la fila se transfieren a los amplificadores de detección que forman el búfer de fila (cuadrados rojos en ambas ilustraciones), desde donde se selecciona el bit exacto usando la dirección de columna. En consecuencia, las operaciones de lectura son de naturaleza destructiva porque el diseño de DRAM requiere que las células de memoria se reescriban después de que sus valores han sido leídos al transferir las cargas de las células al búfer de fila. Las operaciones de escritura decodifican las direcciones de manera similar, pero debido al diseño, se deben reescribir filas completas para cambiar el valor de un solo bit.[1]: 2–3 [11][12][13]
Debido a que los datos se almacenan utilizando condensadores que tienen una tasa de descarga natural, las células de memoria DRAM pierden su estado con el tiempo y requieren una reescritura periódica de todas las células de memoria, un proceso conocido como refresco.[1]: 3 [11] Como otro resultado del diseño, la memoria DRAM es susceptible a cambios aleatorios en los datos almacenados, conocidos como errores de memoria suaves y atribuidos a rayos cósmicos y otras causas. Existen diferentes técnicas que contrarrestan los errores de memoria suaves y mejoran la fiabilidad de DRAM, de las cuales la memoria de código de corrección de errores (ECC) y sus variantes avanzadas (como la memoria en lockstep) son las más comúnmente utilizadas.[14]
El aumento de la densidad de los circuitos integrados de DRAM ha llevado a células de memoria físicamente más pequeñas que contienen menos carga, lo que resulta en márgenes de ruido operativo más bajos, tasas aumentadas de interacciones electromagnéticas entre las células de memoria y una mayor posibilidad de pérdida de datos. Como resultado, se han observado «errores de perturbación», causados por la interferencia de las células entre sí y que se manifiestan como cambios aleatorios en los valores de los bits almacenados en las células de memoria afectadas. La conciencia de los errores de perturbación data de principios de la década de 1970 con el Intel 1103, los primeros circuitos integrados DRAM disponibles comercialmente; desde entonces, los fabricantes de DRAM han empleado diversas técnicas de mitigación para contrarrestar los errores de perturbación, como mejorar el aislamiento entre las células y realizar pruebas de producción. Sin embargo, los investigadores demostraron en un análisis de 2014 que los chips de DDR3 SDRAM fabricados en 2012 y 2013 son susceptibles a errores de perturbación, utilizando el término "Rowhammer" para nombrar el efecto secundario asociado que condujo a los cambios de bits observados.[1][3][15]
La oportunidad para que el efecto Rowhammer ocurra en la memoria DDR3[16] se atribuye principalmente a la alta densidad de células de memoria de DDR3 y a los resultados de las interacciones asociadas entre las células, mientras que las activaciones rápidas de filas DRAM se han determinado como la causa principal. Las activaciones frecuentes de filas causan fluctuaciones de voltaje en las líneas de selección de filas asociadas, lo que se ha observado que induce tasas de descarga más altas de lo normal en los condensadores pertenecientes a filas de memoria cercanas (adyacentes, en la mayoría de los casos), conocidas como "filas víctimas"; si las células de memoria afectadas no se refrescan antes de que pierdan demasiada carga, ocurren errores de perturbación. Las pruebas muestran que puede observarse un error de perturbación después de realizar alrededor de 139,000 accesos consecutivos a filas de memoria (con limpiezas de caché), y que hasta una célula de memoria en cada 1,700 células puede ser susceptible. Las pruebas también muestran que la tasa de errores de perturbación no se ve afectada sustancialmente por un aumento en la temperatura ambiental, mientras que depende del contenido real de DRAM porque ciertos patrones de bits resultan en tasas de error de perturbación significativamente más altas.[1][2][15][17]
Una variante llamada "martilleo de doble cara" implica activaciones dirigidas de dos filas DRAM que rodean una fila 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 bits en la fila púrpura, que en este caso sería la fila víctima. Las pruebas muestran que este enfoque puede resultar en una tasa de errores de perturbación significativamente más alta, en comparación con la variante que activa solo una de las filas DRAM vecinas de la fila víctima.[4][18]: 19–20 [19]
A medida que los proveedores de DRAM han implementado mitigaciones, los patrones han tenido que volverse más sofisticados para eludir las mitigaciones de Rowhammer. Los patrones 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 martilleado con una frecuencia, fase y amplitud diferentes. Usando esto y sincronizando los patrones con el comando REFRESH, es posible determinar de manera muy efectiva «puntos ciegos» donde la mitigación ya no puede proporcionar protección. Basándose en esta idea, académicos construyeron un fuzzer de Rowhammer llamado "Blacksmith"[21] que puede eludir las mitigaciones existentes en todos los dispositivos DDR4.
Existen diferentes métodos para la detección, prevención, corrección o mitigación más o menos exitosa del efecto Rowhammer. Las pruebas muestran que el simple código de corrección de errores, que proporciona capacidades de corrección de errores de un solo bit y detección de errores dobles (SECDED), no es capaz de 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, la investigación muestra que los cambios de bits de Rowhammer dirigidos con precisión a tres bits impiden que la memoria ECC note las modificaciones.[22][23]
Una solución menos efectiva es introducir un refresco de memoria más frecuente, con intervalos de refresco más cortos que los habituales 64 ms,[24] pero esta técnica resulta en un mayor consumo de energía y un mayor sobrecarga de procesamiento; algunos proveedores proporcionan actualizaciones de firmware que implementan este tipo de mitigación.[25] Una de las medidas de prevención más complejas realiza la identificación basada en contadores de filas de memoria accedidas frecuentemente y refresca proactivamente sus filas vecinas; otro método emite refrescos aleatorios poco frecuentes de filas de memoria vecinas a las filas accedidas, independientemente de su frecuencia de acceso. La investigación muestra que estas dos medidas de prevención causan impactos insignificantes en el rendimiento.[1]: 10–11 [26]
Desde el lanzamiento de la microarquitectura Ivy Bridge, los procesadores Intel Xeon soportan el llamado «refresco de fila objetivo pseudo» (pTRR) que puede usarse en combinación con módulos de memoria de doble línea DDR3 (DIMMs) compatibles con pTRR para mitigar el efecto Rowhammer al refrescar automáticamente las posibles filas víctimas, sin impacto negativo en el rendimiento o el consumo de energía. Cuando se usan con DIMMs que no son compatibles con pTRR, estos procesadores Xeon por defecto realizan refrescos de DRAM al doble de la frecuencia habitual, lo que resulta en una latencia de acceso a memoria ligeramente mayor y puede reducir el ancho de banda de memoria hasta en un 2–4%.[9]
El estándar de memoria móvil LPDDR4 publicado por JEDEC[27] incluye soporte de hardware opcional para el llamado «refresco de fila objetivo» (TRR) que previene el efecto Rowhammer sin impactar negativamente el rendimiento o el consumo de energía.[10][28][29] Además, algunos fabricantes implementan TRR en sus productos DDR4,[30][31] aunque no es parte del estándar de memoria DDR4 publicado por JEDEC.[32] Internamente, TRR identifica posibles filas víctimas contando el número de activaciones de filas y comparándolo con valores predefinidos específicos del chip de "conteo máximo de activaciones" (MAC) y "ventana máxima de activaciones" (tMAW). TRR también puede marcar una fila como víctima si la suma de activaciones de filas para sus dos filas vecinas alcanza el límite MAC dentro de la ventana de tiempo tMAW.[27][33] La investigación mostró que las mitigaciones TRR implementadas en UDIMMs DDR4 y chips LPDDR4X de dispositivos producidos entre 2019 y 2020 no son efectivas para proteger contra Rowhammer.[20]
Debido a la necesidad de enormes cantidades de activaciones rápidas de filas DRAM, los exploits de Rowhammer emiten grandes cantidades de accesos a memoria sin caché que causan fallos de caché, los cuales pueden detectarse monitoreando la tasa de fallos de caché para picos inusuales usando contadores de rendimiento de hardware.[4][34]
La versión 5.0 del software de diagnóstico de memoria MemTest86, lanzada el 3 de diciembre de 2013, añadió una prueba de Rowhammer que verifica si la RAM de la computadora es susceptible a errores de perturbación, pero solo funciona si la computadora arranca con UEFI; sin UEFI, arranca una versión anterior sin la prueba de martilleo.[35]
La protección de memoria, como una forma de prevenir que los procesos accedan a memoria que no les ha sido asignada, es uno de los conceptos detrás de la mayoría de los sistemas operativos modernos. Al usar la protección de 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 cual 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. Usar la separación de privilegios también puede reducir la extensión del daño potencial causado por ataques de seguridad informática al restringir sus efectos a partes específicas del sistema.[36][37]
Los errores de perturbación (explicados en la sección anterior) derrotan efectivamente varias capas de protección de memoria al «cortocircuitarlas» a un nivel de hardware muy bajo, creando prácticamente un tipo único de vector de ataque que permite a los procesos alterar el contenido de partes arbitrarias de la memoria principal al manipular directamente el hardware de memoria subyacente.[2][4][18][38] En comparación, los vectores de ataque «convencionales» como los desbordamientos de búfer buscan eludir los mecanismos de protección a nivel de software, explotando varios errores de programación para lograr alteraciones de contenidos de memoria principal de otra manera inaccesibles.[39]
hammer:
mov (X), %eax // leer desde la dirección X
mov (Y), %ebx // leer desde la dirección Y
clflush (X) // vaciar caché para la dirección X
clflush (Y) // vaciar caché para la dirección Y
jmp hammer
|
Un fragmento de código en ensamblador x86 que induce el efecto Rowhammer (las direcciones de memoria X y Y deben mapearse a diferentes filas DRAM en el mismo banco de memoria)[1]: 3 [4][18]: 13–15
|
La investigación inicial sobre el efecto Rowhammer, publicada y presentada en junio de 2014 en el Simposio Internacional sobre Arquitectura de Computadoras, describió y analizó la naturaleza de los errores de perturbación de lectura en chips DRAM DDR3. Este artículo[1] estudió experimentalmente 129 módulos DRAM DDR3 reales de tres fabricantes de DRAM y demostró cambios de bits de perturbación en 110 de ellos. También mostró que un programa de nivel de usuario ejecutado en dos sistemas reales de Intel y AMD induce cambios de bits en la memoria principal. El trabajo indicó el potencial para construir un ataque, diciendo que "Con algo de esfuerzo de ingeniería, creemos que podemos desarrollar el Código 1a en un ataque de perturbación que inyecte errores en otros programas, cause fallos en el sistema, o incluso secuestre el control del sistema. Dejamos esa investigación para el futuro, ya que el objetivo principal en este trabajo es entender y prevenir los errores de perturbación en DRAM".[1]
Un artículo de investigación posterior de octubre de 2014 no implicó la existencia de problemas relacionados con la seguridad derivados del efecto Rowhammer.[16]
El 9 de marzo de 2015, Google's Project Zero reveló dos exploits de escalada de privilegios funcionales basados en el efecto Rowhammer, estableciendo su naturaleza explotable en la arquitectura x86-64. Uno de los exploits revelados apunta al 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 Rowhammer para escapar del sandbox y obtener la capacidad de emitir llamadas al sistema directamente. Esta vulnerabilidad de NaCl, rastreada como CVE-2015-0565, ha sido mitigada modificando el NaCl para que no permita la ejecución de la instrucción clflush
(vaciado de línea de caché[40]) instrucción de máquina, que anteriormente se creía necesaria para construir un ataque Rowhammer efectivo.[2][4][38]
El segundo exploit revelado por Project Zero se ejecuta como un proceso Linux sin privilegios en la arquitectura x86-64, explotando el efecto Rowhammer para obtener acceso sin restricciones a toda la memoria física instalada en una computadora. Al combinar los errores de perturbación con rociado de memoria, este exploit es capaz de alterar las entradas de tabla de páginas[18]: 35 utilizadas por el sistema de memoria virtual para mapear direcciones virtuales a direcciones físicas, lo que resulta en que el exploit obtenga acceso sin restricciones a la memoria.[18]: 34, 36–57 Debido a su naturaleza y la incapacidad de la arquitectura x86-64 para hacer de clflush
una instrucción de máquina privilegiada, este exploit apenas puede mitigarse en computadoras que no usan hardware con mecanismos de prevención de Rowhammer integrados. Mientras probaban la viabilidad de los exploits, Project Zero encontró que aproximadamente la mitad de los 29 portátiles probados experimentaron errores de perturbación, con algunos ocurriendo en portátiles vulnerables en menos de cinco minutos de ejecución del código que induce Rowhammer; los portátiles probados fueron fabricados entre 2010 y 2014 y usaban memoria DDR3 no ECC.[2][4][38]
En julio de 2015, un grupo de investigadores publicó un artículo que describe una forma independiente de la arquitectura y el conjunto de instrucciones para explotar el efecto Rowhammer. En lugar de depender de la instrucción clflush
para realizar vaciados de caché, este enfoque logra accesos a memoria sin caché al causar una tasa muy alta de expulsión 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 al emplear una estrategia de expulsión de caché adaptativa algoritmo.[18]: 64–68 La prueba de concepto para este enfoque se proporciona tanto como una implementación de código nativo, como una implementación pura en JavaScript que se ejecuta en Firefox 39. La implementación en JavaScript, llamada "Rowhammer.js",[41] usa grandes arrays tipados y depende de su asignación de memoria interna utilizando páginas grandes; como resultado, demuestra un exploit de muy alto nivel de una vulnerabilidad de muy bajo nivel.[42][43][44][45]
En octubre de 2016, los investigadores publicaron DRAMMER, una aplicación de Android que usa Rowhammer, junto con otros métodos, para obtener acceso root de manera confiable en varios teléfonos inteligentes populares.[46] La vulnerabilidad fue reconocida como CVE-2016-6728[47] 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 un parche de software efectivo de manera confiable. Hasta junio de 2018, la mayoría de las propuestas de parches hechas por la academia y la industria eran poco prácticas de implementar o insuficientes para detener todos los ataques. Como mitigación, los investigadores propusieron una defensa ligera que previene ataques basados en acceso directo a memoria (DMA) al aislar los búferes DMA con filas de guarda.[48][49]
En mayo de 2020, el trabajo TRRespass[50] mostró que los chips DRAM DDR4, que se afirmaban protegidos y resilientes contra Rowhammer, son en realidad vulnerables a Rowhammer. Este trabajo introdujo un nuevo patrón de acceso, llamado martilleo de múltiples lados, que elude las protecciones de Rowhammer implementadas dentro de los chips DRAM DDR4.
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.[51]
En marzo de 2024, un grupo de investigadores en ETH Zúrich anunció ZenHammer, un exploit de Rowhammer para chips AMD Zen, y también anunció el primer uso de Rowhammer para explotar DDR5 SDRAM.[52][53]
En junio de 2024, un grupo de investigadores en ETH Zúrich anunció RISC-H, un exploit de Rowhammer para chips RISC-V, siendo este el primer estudio de Rowhammer en RISC-V.[54]
InfoWorld
, 9 de marzo de 2015, por Serdar Yegulalp