ECC RAM no es necesariamente inmune; La memoria de ECC corrige de manera confiable los giros de un bit y detecta la mayoría de los lanzamientos de dos bits, lo que hace que el ataque sea más difícil, pero no es conceptualmente inviable.
La memoria RAM sin ECC no es necesariamente débil; de hecho, según la definición de cómo debe comportarse la RAM, nunca debe ocurrir un solo giro de bit. Lo que estamos hablando aquí es RAM con un defecto: la RAM no funciona como debería. El hecho deprimente es que tales defectos son mucho más comunes de lo que generalmente se supone, ya que, en condiciones normales , dichos defectos no se activan a menudo (o en absoluto).
La solución es obtener RAM no defectuosa. El problema subyacente se convierte entonces en: ¿cómo detectaremos que la RAM está defectuosa? La conocida herramienta MemTest86 incluye una prueba de "interferencia" (ya que al menos v6, disponible en la versión gratuita).
Para una solución de solo software, uno podría imaginar una "actualización manual" realizada por el kernel. Algunos subprocesos del kernel harían regularmente lo siguiente, para todas las páginas en la RAM física:
- Bloquee la página (es decir, márquela como no accesible para el código de usuario).
- Dale la vuelta a todos los bits de la página, asegurando que la caché se vacíe con los códigos de operación relevantes.
- Voltee todos los bits nuevamente, nuevamente con un vaciado de caché. Esto restaura los datos originales en la página.
- Desbloquear la página.
Si userland accede a la página mientras se está actualizando, el controlador de capturas simplemente espera a que se complete la actualización, luego vuelve al proceso para que pueda volver a intentarlo.
El doble giro está destinado a garantizar que incluso el hardware inteligente que intenta seguir las modificaciones reales hará vaciar los datos y, por lo tanto, volver a escribir la página (que rellenará los pozos potenciales en los chips DRAM).
En gran medida, este proceso imitaría lo que ya hace el hardware para la actualización de la memoria. Entonces sería cuestión de decidir con qué frecuencia se debe hacer esto; refrescar más a menudo significa más ancho de banda de CPU / RAM gastado en la actualización, por lo que hay un compromiso. El hecho de que se pueda lograr una compensación aceptable depende de la cantidad de RAM que haya, la velocidad de la memoria RAM y el defecto de la memoria RAM.
La implementación en cualquier sistema operativo dado se deja como un ejercicio para el lector. Supongo que esto puede tener un impacto no trivial en las heurísticas de paginación / intercambio (cuando se realiza la paginación o el intercambio, el kernel intenta desalojar páginas a las que no se ha accedido recientemente, y esta contabilidad la realiza la propia MMU; jugar estragos con esta recopilación de información).