HardZone – Así es como la CPU protege a la RAM de software malintencionado

Los programas no paran de hacer peticiones a memoria de manera continua, ya que le manda al hardware no solo a procesar datos, cambiarlos de sitio, crear nuevos datos, eliminar los ya existentes, etcétera. Pero, hay secciones de la memoria a las que si accede un programa entonces puede terminar haciendo estropicios en el funcionamiento general del sistema. A esto le llamamos protección de memoria.

Llegado a un determinado punto en su evolución, las CPUs empezaron a implementar sistema de protección de memoria que separaban el direccionamiento a la RAM en varias secciones. Para entenderlo solo tenéis que imaginar que existe un barrio de uso exclusivo en una ciudad y una policía que impide el acceso a dicho barrio a los que no pueden usarlo, siendo los ciudadanos privilegiados de utilizarlo todos los procesos propios del sistema operativo.

¿Por qué es necesaria la protección de memoria?

La protección de memoria se hizo necesaria en las CPU para PC tan pronto como se vio que era necesario crear entornos multitarea en la que varios programas compartieran el acceso a la memoria en diferentes turnos. Los primeros años de la informática eran con programas monotarea que realizaban ellos mismo también la tarea de sistemas operativos al mismo tiempo, en especial en los ordenadores domésticos de 8 y 16 bits basados en el MOS 6502 y el Z80A.

Un caso famoso por la falta de protección de memoria en la CPU la tenemos en el clásico Commodore Amiga, cuyas versiones basadas en el 68K estándar solían tener cuelgues continuos debido a ejecutar un SO multitarea en una CPU sin protección de memoria, al igual que ocurría con los Apple Macintosh bajo el mismo procesador.

A día de hoy todas las CPUs incorporan protección de memoria, al tener que ejecutar sistemas operativos multitarea de enorme complejidad donde la cantidad de procesos simultáneos se cuenta por miles.

¿Cómo funciona la protección de memoria?

En las CPUs contemporáneas la protección de memoria es llevada a cabo por el mismo procesador, con tal de ahorrarle males de cabeza a los desarrolladores. Toda CPU tiene almacenada en una serie de registros la llamada Page Table, que es la que le informa cómo está organizada la memoria del sistema. La Page Table no solo se utiliza para traducir direcciones de memoria virtuales a físicas, sino también que parte de la memoria es accesible por las aplicaciones y cuáles no.

Cuando una aplicación hace un acceso a una parte de la memoria a la que no tiene permitido hacer, la CPU entonces genera una interrupción que le da control al sistema operativo. A partir de ahí depende como se haya implementado la solución a nivel de software. Puede que el sistema operativo decida cerrar por completo el programa y todos sus procesos de manera unilateral.

Hay que tener en cuenta que la Page Table no solamente dispone de la información de la organización de memoria, así como sus partes de acceso privilegiadas, sino también de la situación de la RAM en cada momento. Su gestión es llevada a cabo por un hilo del kernel del sistema operativo, el cual se encarga de asignar los diferentes recursos a los programas activos, ya sean en forma de tiempo de ejecución de la CPU o del acceso a la memoria.

Vetando programas

La RAM bajo la visión de toda CPU actual se divide en páginas y no en direcciones de memoria. Las cuales son traducidas en direcciones de memoria físicas por parte de la unidad de manejo de memoria. Pero, ¿qué ocurre cuando una parte de un programa ejecuta un acceso no permitido a la memoria? El proceso lo hemos explicado antes, pero para evitar que la CPU pueda entrar en un bucle absurdo lo que se hace es marcar a través de un bit en el direccionamiento virtual que el binario que se almacenan no es un programa sino datos.

De tal manera que cuando la CPU vuelve a recorrer esas direcciones de memoria virtuales ya no lo hace como si fuese un programa, sino como un conjunto de datos que ignora. Obviamente si hay un programa con una instrucción de salto a esa dirección de memoria entonces se producirá un error, pero el código que intentaba acceder a la RAM ya no se ejecutará más.

Este bit en las CPU x86 es llamado bit No-Execute o NX. Se trata de una medida de seguridad muy simple que el sistema operativo puede manejar, pero no es la única que tiene un sistema operativo para evitar la ejecución de código no válido. Aunque el mecanismo de protección no siempre funciona y existen otros mecanismos con los que la CPU le ofusca la memoria protegida a las aplicaciones.

Por ejemplo, el sistema operativo se asigna a sí mismo un bit de acceso exclusivo para todos sus hilos de ejecución. Cuando una aplicación sin sus privilegios se asigna el acceso a la RAM protegida cambiando el bit de acceso, lo que hace el SO es revertir ese bit manipulando en la Page Table la sección que corresponde a las aplicaciones

¿Cómo obtiene la CPU la Page Table?

El primer programa que se ejecuta en un PC, tenga el factor forma que tenga, es el sistema operativo. Algunos sistemas más complejos cargan un sistema previó que pone en marcha el hardware y le pasa el testimonio al SO de manera enmascarada. Este proceso no depende del hardware, pero todo hardware tiene una dirección de memoria en la que empieza y desde allí recorre la memoria en un sentido u otro dependiendo de si estamos ante una CPU Big Endian o Little Endian.

Por lo que en dichas direcciones de memoria ha de existir la información para arrancar el PC, la cual a día de hoy es la UEFI pero en sus inicios era la BIOS. La cual hace de telonera al sistema operativo. Pero, ¿de dónde saca el sistema operativo la situación de la memoria RAM? Pues lo hace a través del uso de dos tablas almacenadas dentro del chipset de la placa base llamadas tablas ACPI.

La ACPI es el primer mecanismo que se encarga de gestionar los accesos a memoria de los periféricos y también la organización de la RAM. Para ello le entrega dos tablas al sistema operativo que tienen la misma función. Dichas tablas son:

RSDT (Root System Descriptor Table).
 XSDT (Extended Root System Descriptor Table).

Si el sistema operativo es de 32 bits entonces le entregará el RSDT, si lo es de 64 bits el XSDT. A partir de ahí el sistema operativo ya tendrá todo lo necesario para gestionar los acceso a memoria junto al procesador.

El sistema operativo es monarca

En el direccionamiento a la memoria hay una serie de bits que las aplicaciones no pueden utilizar y que tienen completamente vetado el acceso. En realidad las peticiones a los recursos del hardware no las hacen las aplicaciones mismas, sino el sistema operativo. Por lo que ninguna aplicación puede tocar el bit que desactiva el acceso a la memoria protegida sin permiso del mismo sistema operativo.

Esto provoca una serie de problemas de cara al acceso a memoria en sistemas virtualizados, lo que lleva a tener que añadir bits adicionales en el direccionamiento de memoria virtual, lo cual sirve para indicarle a la CPU un nivel de privilegio especial para las aplicaciones que se ejecutan en una máquina virtual.

Para ello no solamente se ha de equipar a la CPU con esta posibilidad, sino que influencia la forma en la que el sistema operativo está organizado. Los sistemas operativos en la nube suelen ejecutar un hipervisor, el cual es el encargado de gestionar los acceso a la RAM de las diferentes máquinas virtuales.

The post Así es como la CPU protege a la RAM de software malintencionado appeared first on HardZone.