Investigadores del Project Zero de Google han descubierto un método mediante el cual en un sistema x86-64 con memoria DDR DRAM y que esté ejecutando Linux (otros sistemas por demostrar), un atacante puede aprovecharse de una vulnerabilidad física en esta memoria para conseguir privilegios al kernel en el sistema o para salir del espacio de memoria asignado en una aplicación.

ddr

 

 

La técnica en cuestión que ha recibido el nombre de rowhammer, se basa en un problema en estos chips de DRAM que posibilita que accediendo repetidamente una fila en la memoria se puede causar un "bit flipping" en una fila adyacente, es decir que se produce una sobrecarga en las celdas de una fila que pueden afectar al contenido de la fila adyacente, cambiando su contenido (estado binario de energía) y de esta manera alterar los datos contenidos en la memoria.

Atacando a la memoria DDR DRAM

Para hacernos una mejor idea de este ataque, tenemos que tener en cuenta la estructura 2D de la memoria DRAM, en la que sus millones de celdas se organizan en filas y columnas. Estas a su vez se agrupan en bloques que finalmente se asignan a los diversos procesos del sistema que en principio no comparten los mismos espacios. Esta protección es la que se evade con rowhammer por la posibilidad de afectar físicamente a filas adyacentes que pueden pertenecer a otros procesos.

A medida que la tecnología en memoria avanzaba los chips ganaban en capacidad paradojicamente esta vulnerabilidad se hacía cada vez más sencilla de llevar a cabo debido a que la mayor concentración por chip dificultaba prevenir la interacción eléctrica entre las celdas.

Los investigadores del Project Zero han conseguido desarrollar dos exploits PoC con los cuales a través de rowhammer han conseguido primero introducir bit flips para conseguir privilegios a nivel de kernel consiguiendo de esta manera acceso de escritura a toda la memoria física y por otro lado han conseguido escapar del espacio sandbox del cliente. El primero de los PoC es teóricamente evitable, desactivando la instrucción CLFLUSH, para el segundo no se ha establecido por el momento ninguna acción para poder evitarlo.

Fuente Google Project Zero