¿Cómo evita el núcleo que un programa malicioso lea toda la RAM física?

10

Si escribo un programa que intenta leer la memoria en todas las direcciones posibles, y lo ejecuto en un Unix "completo", no podrá acceder a toda la RAM física. Pero, ¿cómo evita el sistema operativo que lo haga?

Estoy más familiarizado con pequeñas arquitecturas de CPU donde cualquier parte del código de ensamblaje puede acceder a todo. No entiendo cómo un programa (el núcleo) puede detectar tales operaciones maliciosas.

nowox
fuente
2
Por lo general, la MMU se encarga de que no pueda acceder a la memoria fuera de las áreas permitidas.
ott--
1
Bueno, el conjunto configura la MMU. Por lo tanto, un código de ensamblaje puede cambiar la configuración de MMU y acceder a una página de memoria diferente, ¿verdad?
nowox
Esto solo es cierto si ejecuta su código como root.
ott--
2
Debería leer sobre tablas de páginas y abstracción del núcleo allí.
Clarus
@ott: incluso root no puede modificar la MMU (al menos no en Linux). Solo el núcleo lo hace.
Basile Starynkevitch

Respuestas:

12

No es el núcleo lo que impide los malos accesos a la memoria, es la CPU. La función del núcleo es solo configurar la CPU correctamente.

Más precisamente, el componente de hardware que evita los malos accesos a la memoria es la MMU . Cuando un programa accede a una dirección de memoria, la CPU decodifica la dirección en función del contenido de la MMU. La MMU establece una traducción de direcciones virtuales a direcciones físicas: cuando la CPU carga o almacena en una determinada dirección virtual, calcula la dirección física correspondiente en función del contenido de MMU. El kernel establece la configuración de MMU de tal manera que cada programa solo puede acceder a la memoria a la que tiene derecho. Los registros de memoria y hardware de otros programas no están asignados en absoluto en la memoria de un programa: estas direcciones físicas no tienen una dirección virtual correspondiente en la configuración MMU para ese programa.

En un cambio de contexto entre diferentes procesos, el núcleo modifica la configuración de MMU para que contenga la traducción deseada para el nuevo proceso.

Algunas direcciones virtuales no se asignan en absoluto, es decir, la MMU las traduce a un valor especial de "no existe tal dirección". Cuando el procesador desreferencia una dirección no asignada, esto causa una trampa: el procesador se bifurca a una ubicación predefinida en el código del núcleo. Algunas trampas son legítimas; por ejemplo, la dirección virtual podría corresponder a una página que está en el espacio de intercambio , en cuyo caso el código del núcleo cargará el contenido de la página del intercambio y luego volverá al programa original de tal manera que la instrucción de acceso a la memoria se ejecute nuevamente. Otras trampas no son legítimas, en cuyo caso el proceso recibe una señal que, por defecto, mata al programa inmediatamente (y si no se bifurca al controlador de señal en el programa: en cualquier caso, la instrucción de acceso a la memoria no se completa).

Gilles 'SO- deja de ser malvado'
fuente
¿Podría especificar un poco la declaración "la CPU decodifica la dirección en función del contenido de la MMU" ? ¿Existe un código real en el programa en ejecución que decodifica direcciones? ¿O cuando una CPU accede a una dirección, el acceso se realiza a MMU, que lo traduce / maneja correctamente (realiza un acceso a la memoria o caché y devuelve el resultado, o activa un procedimiento de kernel)? Entonces, desde la perspectiva del microcontrolador / ensamblaje, la MMU es una parte nueva. La CPU no está conectada directamente a la memoria, está conectada a MMU y ahí es donde se realiza la abstracción de la memoria virtual.
xealits
3
@xealits La traducción de la dirección virtual a la dirección física se realiza dentro de la MMU, que es un circuito de hardware. No hay código para hacer eso en el programa o en el núcleo. El núcleo solo se invoca en casos excepcionales, cuando el programa intenta acceder a una dirección virtual para la cual la entrada MMU dice "dirección no válida". El kernel también hace el trabajo de configurar los registros y las tablas en RAM que usa la MMU.
Gilles 'SO- deja de ser malvado'