stringtranslate.com

Seguridad basada en capacidades

La seguridad basada en capacidades es un concepto en el diseño de sistemas informáticos seguros , uno de los modelos de seguridad existentes . Una capacidad (conocida en algunos sistemas como clave ) es una muestra de autoridad comunicable e infalsificable . Se refiere a un valor que hace referencia a un objeto junto con un conjunto asociado de derechos de acceso . Un programa de usuario en un sistema operativo basado en capacidades debe utilizar una capacidad para acceder a un objeto. La seguridad basada en capacidades se refiere al principio de diseñar programas de usuario de manera que compartan capacidades directamente entre sí de acuerdo con el principio de privilegio mínimo , y a la infraestructura del sistema operativo necesaria para que dichas transacciones sean eficientes y seguras. La seguridad basada en capacidades debe contrastarse con un enfoque que utiliza permisos tradicionales de UNIX y listas de control de acceso .

Aunque la mayoría de los sistemas operativos implementan una instalación que se asemeja a las capacidades, generalmente no brindan suficiente soporte para permitir que el intercambio de capacidades entre entidades que posiblemente no confíen entre sí sea el medio principal para otorgar y distribuir derechos de acceso en todo el sistema. Por el contrario, un sistema basado en capacidades está diseñado con ese objetivo en mente.

Introducción

Las capacidades logran su objetivo de mejorar la seguridad del sistema al usarse en lugar de referencias falsificadas . Una referencia falsificada (por ejemplo, un nombre de ruta ) identifica un objeto, pero no especifica qué derechos de acceso son apropiados para ese objeto y el programa de usuario que contiene esa referencia. En consecuencia, cualquier intento de acceder al objeto al que se hace referencia debe ser validado por el sistema operativo, según la autoridad ambiental del programa solicitante, generalmente mediante el uso de una lista de control de acceso (ACL). En cambio, en un sistema con capacidades, el mero hecho de que un programa de usuario posea esa capacidad le da derecho a utilizar el objeto al que se hace referencia de acuerdo con los derechos especificados por esa capacidad. En teoría, un sistema con capacidades elimina la necesidad de cualquier lista de control de acceso o mecanismo similar al brindar a todas las entidades todas y solo las capacidades que realmente necesitarán.

Una capacidad normalmente se implementa como una estructura de datos privilegiada que consta de una sección que especifica los derechos de acceso y una sección que identifica de forma única el objeto al que se accederá. El usuario no accede directamente a la estructura de datos o al objeto, sino a través de un identificador . En la práctica, se utiliza de forma muy parecida a un descriptor de archivo en un sistema operativo tradicional (un identificador tradicional), pero para acceder a todos los objetos del sistema. El sistema operativo normalmente almacena las capacidades en una lista, con algún mecanismo implementado para evitar que el programa modifique directamente el contenido de la capacidad (para falsificar derechos de acceso o cambiar el objeto al que apunta). Algunos sistemas también se han basado en el direccionamiento basado en capacidades (soporte de hardware para capacidades), como Plessey System 250 .

Los programas que poseen capacidades pueden realizar funciones en ellos, como pasarlos a otros programas, convertirlos a una versión con menos privilegios o eliminarlos. El sistema operativo debe garantizar que solo se puedan realizar operaciones específicas en las capacidades del sistema, para mantener la integridad de la política de seguridad.

Las capacidades analizadas en este artículo no deben confundirse con las "Capacidades" de la interfaz del sistema operativo portátil ( POSIX ) 1e/2c. Estos últimos son privilegios generales que no se pueden transferir entre procesos.

Ejemplos

Una capacidad se define como una referencia de objeto protegido que, en virtud de su posesión por un proceso de usuario, otorga a ese proceso la capacidad (de ahí el nombre) de interactuar con un objeto de ciertas maneras. Esas formas podrían incluir leer datos asociados con un objeto, modificar el objeto, ejecutar los datos en el objeto como un proceso y otros derechos de acceso imaginables. Lógicamente, la capacidad consiste en una referencia que identifica de forma única un objeto particular y un conjunto de uno o más de estos derechos.

Supongamos que, en el espacio de memoria de un proceso de usuario, existe la siguiente cadena:

/etc/contraseña

Aunque esto identifica un objeto único en el sistema, no especifica derechos de acceso y, por lo tanto, no es una capacidad. Supongamos que, en cambio, existe el siguiente par de valores:

/etc/contraseñaO_RDWR

Este par identifica un objeto junto con un conjunto de derechos de acceso. Sin embargo, el par todavía no es una capacidad porque la posesión de estos valores por parte del proceso del usuario no dice nada sobre si ese acceso sería realmente legítimo.

Supongamos ahora que el programa de usuario ejecuta con éxito la siguiente declaración:

int fd = open ( "/etc/passwd" , O_RDWR );    

La variable fdahora contiene el índice de un descriptor de archivo en la tabla de descriptores de archivo del proceso. Este descriptor de archivo es una capacidad. Su existencia en la tabla de descriptores de archivos del proceso es suficiente para mostrar que el proceso efectivamente tiene acceso legítimo al objeto. Una característica clave de esta disposición es que la tabla de descriptores de archivos está en la memoria del núcleo y el programa de usuario no puede manipularla directamente.

Compartir entre procesos

En los sistemas operativos tradicionales, los programas suelen comunicarse entre sí y con el almacenamiento mediante referencias como las de los dos primeros ejemplos. Los nombres de las rutas a menudo se pasan como parámetros de línea de comandos, se envían a través de sockets y se almacenan en el disco. Estas referencias no son capacidades y deben validarse antes de poder usarse. En estos sistemas, una pregunta central es "¿bajo la autoridad de quién se debe evaluar una referencia determinada?" Esto se convierte en una cuestión crítica, especialmente para los procesos que deben actuar en nombre de dos entidades diferentes con autoridad. Se vuelven susceptibles a un error de programación conocido como problema del diputado confuso , que muy frecuentemente resulta en un agujero de seguridad .

En un sistema basado en capacidades, las capacidades mismas se pasan entre procesos y almacenamiento utilizando un mecanismo que el sistema operativo sabe que mantiene la integridad de esas capacidades.

Un enfoque novedoso para resolver este problema implica el uso de un sistema operativo ortogonalmente persistente . En un sistema de este tipo, no es necesario descartar entidades ni invalidar sus capacidades y, por lo tanto, se requiere un mecanismo similar a una ACL para restaurar esas capacidades en un momento posterior. El sistema operativo mantiene la integridad y seguridad de las capacidades contenidas en todo el almacenamiento, tanto volátil como no volátil, en todo momento; en parte realizando todas las tareas de serialización por sí mismo, en lugar de requerir que los programas de usuario lo hagan, como es el caso en la mayoría de los sistemas operativos. Debido a que los programas de usuario están exentos de esta responsabilidad, no hay necesidad de confiar en ellos para reproducir únicamente capacidades legales, ni para validar solicitudes de acceso utilizando un mecanismo de control de acceso . Un ejemplo de implementación es la máquina Flex de principios de los años 1980.

Capacidades POSIX

El borrador 1003.1e de la interfaz de sistema operativo portátil (POSIX) especifica un concepto de permisos llamado "capacidades". Sin embargo, las capacidades de POSIX difieren de las capacidades de este artículo. Una capacidad POSIX no está asociada con ningún objeto; un proceso que tiene capacidad CAP_NET_BIND_SERVICE puede escuchar en cualquier puerto TCP por debajo de 1024. Este sistema se encuentra en Linux. [1]

Por el contrario, Capsicum Unix hibrida un verdadero modelo de sistema de capacidades con un diseño Unix y una API POSIX. Las capacidades de Capsicum son una forma refinada de descriptor de archivos, un derecho delegable entre procesos y se puede hacer referencia a tipos de objetos adicionales más allá del POSIX clásico, como los procesos, a través de capacidades. En el modo de capacidad de Capsicum, los procesos no pueden utilizar espacios de nombres globales (como el espacio de nombres del sistema de archivos) para buscar objetos y, en cambio, deben heredarlos o delegarlos. Este sistema se encuentra de forma nativa en FreeBSD, pero hay parches disponibles para otros sistemas. [2]

Implementaciones

Los sistemas comerciales y de investigación notables que emplean seguridad basada en capacidades incluyen los siguientes:

Referencias

  1. ^ capabilities(7)  -  Manual del programador de Linux : descripción general, convenciones y miscelánea
  2. ^ capsicum(4)  -  Manual de interfaces del kernel de FreeBSD
  3. ^ "Pimiento (4)".
  4. ^ https://www.cl.cam.ac.uk/research/security/capsicum/papers/2010usenix-security-capsicum-website.pdf [ URL básica PDF ]
  5. ^ "Genode OS: un soplo de aire fresco en la seguridad del software y los sistemas operativos". Rudd-O.com . Consultado el 21 de diciembre de 2023 .
  6. ^ "El sistema operativo Fuchsia de Google se ejecuta prácticamente en cualquier cosa". Engadget . 2016-08-14 . Consultado el 21 de diciembre de 2023 .
  7. ^ Děcký, Martín. "Sistemas operativos basados ​​en microkernel y basados ​​en capacidades" (PDF) . D3S . D3S . Consultado el 23 de diciembre de 2023 .
  8. ^ Dziuba, Ted. "El ruso lleva a Phantom hacia la inmortalidad del sistema operativo". El registro . El registro . Consultado el 31 de diciembre de 2023 .

Otras lecturas

"Capacidades" de POSIX en Linux:

enlaces externos