La protección de memoria es una forma de controlar los derechos de acceso a la memoria en un ordenador y forma parte de la mayoría de las arquitecturas de conjuntos de instrucciones y sistemas operativos modernos . El objetivo principal de la protección de memoria es impedir que un proceso acceda a memoria que no le ha sido asignada. Esto evita que un error o malware dentro de un proceso afecte a otros procesos o al propio sistema operativo. La protección puede abarcar todos los accesos a un área específica de memoria, los accesos de escritura o los intentos de ejecutar el contenido de dicha área. Un intento de acceso a memoria no autorizada produce un fallo de hardware , por ejemplo, un fallo de segmentación o una excepción de violación de almacenamiento , que generalmente provoca la terminación anormal del proceso infractor. La protección de memoria para la seguridad informática incluye técnicas adicionales como la aleatorización del espacio de direcciones y la protección del espacio ejecutable .
Métodos
Segmentación
La segmentación consiste en dividir la memoria de un ordenador en segmentos. Una referencia a una ubicación de memoria incluye un valor que identifica un segmento y un desplazamiento dentro de ese segmento. Un descriptor de segmento puede limitar los derechos de acceso, por ejemplo, solo lectura, solo desde ciertos anillos .
La arquitectura x86 cuenta con múltiples funciones de segmentación, útiles para el uso de memoria protegida. [ 1 ] En la arquitectura x86, las tablas de descriptores globales y locales permiten referenciar segmentos de la memoria del ordenador. Los punteros a segmentos de memoria en los procesadores x86 también se almacenan en los registros de segmento del procesador. Inicialmente, los procesadores x86 contaban con cuatro registros de segmento: CS (segmento de código), SS (segmento de pila), DS (segmento de datos) y ES (segmento adicional); posteriormente se añadieron dos más : FS y GS. [ 1 ]
Memoria virtual paginada
En la paginación, el espacio de direcciones de memoria o segmento se divide en bloques de igual tamaño [ b ] llamados páginas . Mediante hardware de memoria virtual , cada página puede residir en cualquier ubicación dentro de un límite adecuado de la memoria física del ordenador, o bien estar marcada como protegida. La memoria virtual permite disponer de un espacio de direcciones de memoria virtual lineal y utilizarlo para acceder a bloques fragmentados en el espacio de direcciones de la memoria física .
La mayoría de las arquitecturas informáticas que admiten paginación también utilizan las páginas como base para la protección de la memoria.
Una tabla de páginas asigna memoria virtual a memoria física. Puede haber una única tabla de páginas, una tabla de páginas para cada proceso, una tabla de páginas para cada segmento o una jerarquía de tablas de páginas, según la arquitectura y el sistema operativo. Las tablas de páginas suelen ser invisibles para el proceso. Facilitan la asignación de memoria adicional, ya que cada nueva página se puede asignar desde cualquier lugar de la memoria física. En algunos sistemas, una entrada en la tabla de páginas también puede designar una página como de solo lectura.
Algunos sistemas operativos establecen un espacio de direcciones diferente para cada proceso, lo que proporciona límites de protección de memoria estrictos. [ 2 ] Es imposible que una aplicación sin privilegios [ c ] acceda a una página que no se le haya asignado explícitamente, porque cada dirección de memoria apunta a una página asignada a esa aplicación o genera una interrupción llamada fallo de página . Las páginas no asignadas y las páginas asignadas a cualquier otra aplicación no tienen direcciones desde el punto de vista de la aplicación.
Un fallo de página no necesariamente indica un error. Los fallos de página no solo se utilizan para la protección de memoria. El sistema operativo puede gestionar la tabla de páginas de tal manera que una referencia a una página que se ha paginado previamente al almacenamiento secundario [ d ] provoque un fallo de página. El sistema operativo intercepta el fallo de página, carga la página de memoria necesaria y la aplicación continúa como si no se hubiera producido ningún fallo. Este esquema, un tipo de memoria virtual , permite que los datos en memoria que no se utilizan actualmente se muevan al almacenamiento secundario y viceversa de forma transparente para las aplicaciones, para aumentar la capacidad total de memoria.
En algunos sistemas, una solicitud de almacenamiento virtual puede asignar un bloque de direcciones virtuales para las que no se han asignado marcos de página, y el sistema solo asignará e inicializará marcos de página cuando se produzcan fallos de página. En algunos sistemas, se puede utilizar una página de protección , ya sea para la detección de errores o para el crecimiento automático de las estructuras de datos.
En algunos sistemas, el mecanismo de fallo de página también se utiliza para la protección del espacio ejecutable, como en el caso de W^X .
Llaves de protección
Un mecanismo de clave de protección de memoria (MPK) [ 3 ] divide la memoria física en bloques de un tamaño específico (por ejemplo, 4 KiB), cada uno con un valor numérico asociado denominado clave de protección. Cada proceso también tiene un valor de clave de protección asociado. Al acceder a la memoria, el hardware comprueba que la clave de protección del proceso actual coincida con el valor asociado al bloque de memoria al que se accede; de lo contrario, se produce una excepción. Este mecanismo se introdujo en la arquitectura System/360 . Actualmente está disponible en los mainframes System z y es ampliamente utilizado por los sistemas operativos System z y sus subsistemas.
Las claves de protección del sistema 360 descritas anteriormente están asociadas a direcciones físicas. Esto difiere del mecanismo de clave de protección utilizado por arquitecturas como la Hewlett-Packard / Intel IA-64 y la Hewlett-Packard PA-RISC , que están asociadas a direcciones virtuales y permiten múltiples claves por proceso.
En las arquitecturas Itanium y PA-RISC, las traducciones ( entradas TLB ) tienen claves (Itanium) o identificadores de acceso (PA-RISC) asociados. Un proceso en ejecución tiene varios registros de claves de protección (16 para Itanium, [ 4 ] 4 para PA-RISC [ 5 ] ). Una traducción seleccionada por la dirección virtual tiene su clave comparada con cada uno de los registros de claves de protección. Si alguna coincide (además de otras posibles comprobaciones), se permite el acceso. Si ninguna coincide, se genera un fallo o una excepción. El gestor de fallos del software puede, si se desea, comprobar la clave faltante con una lista más amplia de claves mantenida por el software; por lo tanto, los registros de claves de protección dentro del procesador pueden tratarse como una caché gestionada por software de una lista más amplia de claves asociadas a un proceso.
PA-RISC tiene una clave de 15 a 18 bits; Itanium exige al menos 18. Las claves suelen estar asociadas a dominios de protección , como bibliotecas, módulos, etc.
En la arquitectura x86, las claves de protección [ 6 ] permiten etiquetar direcciones virtuales para páginas de usuario con cualquiera de las 16 claves de protección. Todas las páginas etiquetadas con la misma clave de protección constituyen un dominio de protección. Un nuevo registro contiene los permisos asociados a cada dominio de protección. Las operaciones de carga y almacenamiento se verifican con respecto a los permisos de la tabla de páginas y los permisos de la clave de protección asociados al dominio de protección de la dirección virtual, y solo se permiten si ambos permisos autorizan el acceso. Los permisos de la clave de protección se pueden configurar desde el espacio de usuario, lo que permite a las aplicaciones restringir directamente el acceso a los datos de la aplicación sin la intervención del sistema operativo. Dado que las claves de protección están asociadas a una dirección virtual, los dominios de protección son por espacio de direcciones, por lo que los procesos que se ejecutan en diferentes espacios de direcciones pueden utilizar los 16 dominios.
Anillos de protección
En Multics y sistemas derivados, cada segmento tiene un anillo de protección para lectura, escritura y ejecución; un intento de un proceso con un número de anillo superior al del segmento provoca un fallo. Existe un mecanismo para llamar de forma segura a procedimientos que se ejecutan en un anillo inferior y regresar al anillo superior. También existen mecanismos para que una rutina que se ejecuta con un número de anillo bajo acceda a un parámetro con el mayor de los dos anillos: el suyo propio y el del proceso que la llama.
Segmentación simulada
La simulación consiste en el uso de un programa de monitorización para interpretar las instrucciones de código máquina de ciertas arquitecturas informáticas. Un simulador de conjunto de instrucciones de este tipo puede proporcionar protección de memoria mediante un esquema similar a la segmentación, validando la dirección y la longitud de cada instrucción en tiempo real antes de su ejecución. El simulador debe calcular la dirección y la longitud de destino y compararlas con una lista de rangos de direcciones válidos que posee sobre el entorno del hilo , como los bloques de memoria dinámica adquiridos desde su inicio, además de las ranuras de memoria estática compartida válidas. El significado de "válido" puede variar a lo largo de la vida del hilo según el contexto. En ocasiones, se le permite modificar un bloque de almacenamiento estático, y en otras no, dependiendo del modo de ejecución actual, que puede o no depender de una clave de almacenamiento o del estado del supervisor.
Generalmente no es recomendable utilizar este método de protección de memoria cuando la CPU dispone de recursos suficientes, ya que consume una valiosa capacidad de procesamiento del ordenador. Sin embargo, se suele utilizar para depuración y pruebas, proporcionando un nivel de detalle adicional a las violaciones de almacenamiento genéricas , e indicando con precisión qué instrucción intenta sobrescribir la sección de memoria específica, que puede tener la misma clave que la memoria no protegida.
Direccionamiento basado en capacidades
El direccionamiento basado en capacidades es un método de protección de memoria que no se utiliza en los ordenadores comerciales modernos. En este método, los punteros se reemplazan por objetos protegidos (denominados capacidades ) que solo pueden crearse mediante instrucciones privilegiadas , las cuales solo pueden ser ejecutadas por el núcleo u otro proceso autorizado. Esto permite al núcleo controlar qué procesos pueden acceder a qué objetos en la memoria, sin necesidad de utilizar espacios de direcciones separados ni cambios de contexto . Solo unos pocos productos comerciales utilizaban seguridad basada en capacidades: Plessey System 250 , IBM System/38 , la arquitectura Intel iAPX 432 y KeyKOS . Los enfoques de capacidades se utilizan ampliamente en sistemas de investigación como EROS y el navegador Combex DARPA. Se utilizan conceptualmente como base para algunas máquinas virtuales , sobre todo Smalltalk y Java . Actualmente, el proyecto CHERI , financiado por DARPA en la Universidad de Cambridge, trabaja en la creación de una máquina de capacidades moderna que también sea compatible con software heredado.
Contaminación dinámica
El marcado dinámico es una técnica para proteger los programas de accesos ilegales a la memoria. Al asignar memoria, durante la ejecución, esta técnica marca tanto la memoria como el puntero correspondiente con la misma marca de marcado. Estas marcas se propagan adecuadamente durante la ejecución del programa y se comprueban cada vez que se accede a una dirección de memoria m mediante un puntero p ; si las marcas de marcado asociadas a m y p difieren, se detiene la ejecución y se informa del acceso ilegal. [ 7 ] [ 8 ]
Los procesadores SPARC M7 (y superiores) implementan la protección dinámica de datos en el hardware. Oracle comercializa esta función como Silicon Secured Memory (SSM) (anteriormente denominada Application Data Integrity (ADI)). [ 9 ]
El diseño de la CPU lowRISC incluye el marcado dinámico bajo el nombre de memoria etiquetada. [ 10 ]
Medidas
El nivel de protección de una implementación particular puede medirse por qué tan fielmente se adhiere al principio de privilegio mínimo . [ 11 ]
Protección de memoria en diferentes sistemas operativos
Los distintos sistemas operativos utilizan diferentes formas de protección o separación de memoria. Si bien la protección de memoria era común en la mayoría de los mainframes y muchos sistemas de minicomputadoras de la década de 1960, la verdadera separación de memoria no se utilizó en los sistemas operativos de computadoras domésticas hasta el lanzamiento de OS/2 (y en RISC OS ) en 1987. En sistemas anteriores, esta falta de protección incluso se utilizaba como una forma de comunicación entre procesos , mediante el envío de un puntero entre ellos. Es posible que los procesos accedan a la memoria del sistema en la familia de sistemas operativos Windows 9x . [ 12 ]
Algunos sistemas operativos que sí implementan protección de memoria son:
- Atari MultiTOS (desde 1991)
- Familia de sistemas operativos Microsoft Windows desde Windows NT 3.1 (1993)
- Microware OS-9 , como módulo opcional (desde 1992)
- OS/2 (1987)
- Faros [ 13 ] (desde 2017)
- Plan9 e Inferno , creados en Bell Labs como sucesores de Unix (1992, 1995).
- RISC OS (1987) (La protección de memoria del sistema operativo no es exhaustiva).
- Sistemas tipo Unix (desde finales de la década de 1970), incluidos Solaris , Linux , BSD , Mac OS X (desde 2001; ahora llamado MacOS), iOS y GNU Hurd.
En sistemas tipo Unix, la mprotectllamada al sistema se utiliza para controlar la protección de la memoria. [ 14 ]
Véase también
- Gestión de memoria (sistemas operativos)
- Violación de almacenamiento , por violación de la protección de memoria
Referencias
- 1 2 Intel (julio de 2008). Manuales para desarrolladores de software de las arquitecturas Intel 64 e IA-32: Volumen 3A: Guía de programación del sistema, parte 1 (PDF) . Intel . Consultado el 21 de agosto de 2008 .
- ↑ Jeffrey S. Chase; Henry M. Levy; Michael J. Feeley; y Edward D. Lazowska. "Compartir y proteger en un sistema operativo de espacio de direcciones único" . doi : 10.1145/195792.195795 1993. pág. 2.
- ↑ Claves de protección de memoria , Jonathan Corbet, 13 de mayo de 2015, LWN.net
- ↑ "Teclas en Itanium" (PDF) . Archivado del original (PDF) el 28/11/2007.
- ↑ "Protección de memoria en HP PA-RISC" (PDF) . Febrero de 1994. Archivado del original (PDF) el 5 de septiembre de 2015. Consultado el 29 de octubre de 2018 .
- ↑ "Manual del desarrollador de software de Intel" (PDF) . Marzo de 2012. Archivado del original (PDF) el 1 de junio de 2012. Consultado el 29 de octubre de 2018 .
- ↑ Clause, James; Doudalis, Ioannis; Orso, Alessandro; Prvulovic, Milos (2007). «Protección eficaz de la memoria mediante marcado dinámico». Actas de la vigésimo segunda conferencia internacional IEEE/ACM sobre ingeniería de software automatizada (PDF) . págs. 284–292 . doi : 10.1145/1321631.1321673 . ISBN 9781595938824. S2CID 6334541 .
- ↑ Doudalis, Ioannis; Clause, James; Venkataramani, Guru; Prvulovic, Milos; Orso, Alessandro (2012). "Protección de memoria eficaz y eficiente mediante contaminación dinámica" (PDF) . IEEE Transactions on Computers . 61 (1): 87– 100. doi : 10.1109/TC.2010.215 . ISSN 0018-9340 . S2CID 15913190 .
- ↑ Jenkins, Michelle. "Oracle anuncia un innovador procesador y diseño de sistemas con SPARC M7" . www.oracle.com . Consultado el 18 de noviembre de 2016 .
- ↑ "Soporte para memoria etiquetada" . www.lowrisc.org . Consultado el 24 de mayo de 2018 .
- ↑ Cook, DJ Medición de la protección de la memoria , aceptado para la 3ª Conferencia Internacional sobre Ingeniería de Software, Atlanta, Georgia, mayo de 1978.
- ↑ "Windows 9x no tiene verdadera protección de memoria" . Everything2. 24/06/2000 . Consultado el 29/04/2009 .
- ↑ «Faros» . 16 de diciembre de 2020.
- ↑ "mprotect" . Especificaciones básicas de The Open Group, número 6. The Open Group.
Notas
- ↑ Dependiendo de la arquitectura, esto puede incluir, por ejemplo, páginas y segmentos no asignados, páginas en un dominio de protección diferente, páginas que requieren un nivel de privilegio más alto.
- ↑ Algunos sistemas, por ejemplo z/OS , admiten más de un tamaño de página.
- ↑ En algunos sistemas existen instrucciones privilegiadas para el acceso al almacenamiento mediante la dirección real.
- ↑ En los primeros tiempos del tiempo compartido , la paginación se realizaba normalmente a un tambor magnético ; en los sistemas contemporáneos, la paginación se realiza normalmente a un disco duro o dispositivo de estado sólido .
Enlaces externos
- Manuales para desarrolladores de Intel : información detallada sobre la protección de memoria para arquitecturas basadas en Intel.
- Gestión de la memoria