Los sistemas operativos modernos imponen límites de seguridad entre procesos, archivos, dispositivos y usuarios. Sin embargo, la forma en que se implementan estos límites varía de manera significativa entre distintos diseños de sistema.

La mayoría de los sistemas operativos convencionales dependen del control de acceso basado en identidad y de los espacios de nombres globales. Los sistemas operativos basados en capacidades adoptan un enfoque fundamentalmente distinto: representan la autoridad de forma explícita y la convierten en un concepto de primer nivel.

Esta publicación introduce los sistemas basados en capacidades, explica en qué se diferencian de los diseños tradicionales y describe por qué son centrales para el diseño de EriX.


El problema: la autoridad ambiental

En los sistemas tradicionales, los procesos suelen tener acceso a los recursos a través de la autoridad ambiental.

La autoridad ambiental significa que un programa puede acceder a un recurso simplemente porque existe en un espacio de nombres compartido y el sistema determina que el programa tiene permiso para usarlo.

Por ejemplo:

  • Un proceso puede abrir /etc/passwd si tiene permisos suficientes.
  • Un programa puede conectarse a un socket de red si el sistema operativo se lo permite.
  • Un servicio puede acceder a archivos basándose en la identidad del usuario o en la pertenencia a grupos.

En todos estos casos, la autoridad para acceder al recurso es implícita.

El proceso no posee una referencia directa y explícita al recurso. En cambio, depende de:

  • nombres globales (rutas de archivo, puertos, identificadores de dispositivo)
  • comprobaciones de acceso (ID de usuario, permisos, ACL)

Este modelo crea varios problemas:

1. Problema del delegado confundido

Un programa puede usar accidentalmente su autoridad en nombre de otro programa.

Por ejemplo, un servicio privilegiado podría leer un archivo solicitado por un cliente no confiable, aunque ese cliente no debería tener acceso al archivo.

2. Autoridad demasiado amplia

Los programas suelen ejecutarse con más permisos de los que realmente necesitan. Esto incrementa el impacto de errores o compromisos de seguridad.

3. Razonamiento difícil

Es difícil determinar qué puede hacer un proceso sin analizar el estado global, las identidades de usuario y las políticas de control de acceso.


La idea central: las capacidades

Una capacidad es un token no falsificable que concede acceso a un objeto específico con derechos específicos.

En lugar de preguntar:

“¿Este proceso tiene permiso para acceder a este recurso?”

un sistema basado en capacidades pregunta:

“¿Este proceso posee una capacidad que autoriza esta operación?”

Si la respuesta es no, la operación no puede continuar.


Propiedades de las capacidades

Las capacidades tienen varias propiedades definitorias:

1. No falsificabilidad

Un proceso no puede crear una capacidad válida de la nada.

Las capacidades son creadas y gestionadas por el kernel, lo que garantiza que no puedan falsificarse ni adivinarse.


2. Autoridad explícita

Toda la autoridad se representa de forma explícita mediante capacidades.

Si un proceso puede realizar una operación, debe poseer una capacidad que lo permita. No existe acceso implícito a través de espacios de nombres globales.


3. Derechos de grano fino

Las capacidades pueden codificar permisos específicos, como:

  • acceso de solo lectura
  • acceso de escritura
  • permisos de ejecución
  • subconjuntos limitados de operaciones

Esto permite un control preciso sobre lo que cada proceso puede hacer.


4. Transferibilidad

Las capacidades pueden transferirse entre procesos, normalmente mediante comunicación entre procesos (IPC).

Esto permite una delegación controlada de autoridad.


Objetos y capacidades

En un sistema basado en capacidades, todo se modela como un objeto:

  • regiones de memoria
  • archivos
  • dispositivos
  • endpoints de IPC
  • procesos

Una capacidad es una referencia a un objeto combinada con un conjunto de derechos.

Un proceso interactúa con el sistema invocando operaciones sobre objetos a través de sus capacidades.

No hay necesidad de nombres globales como rutas de archivo o identificadores de dispositivo dentro del kernel. Todo acceso está mediado por capacidades.


Cómo funcionan los sistemas basados en capacidades

A alto nivel, un sistema basado en capacidades funciona así:

  1. El kernel crea objetos y capacidades.
  2. Cada proceso tiene un espacio de capacidades (a menudo llamado CSpace), que almacena sus capacidades.
  3. Un proceso solo puede operar sobre objetos para los que posee capacidades.
  4. Las capacidades pueden transferirse entre procesos mediante IPC.
  5. El kernel hace cumplir todas las comprobaciones de capacidades.

Esto da como resultado un sistema en el que la autoridad es:

  • explícita
  • localizada
  • transferible
  • fácil de razonar

Ejemplo: abrir un archivo

Modelo tradicional

En un sistema tradicional:

  1. Un proceso llama a open("/etc/config")
  2. El kernel comprueba los permisos:
    • ID de usuario
    • pertenencia a grupos
    • bits de modo del archivo
  3. Si se permite, se devuelve un descriptor de archivo

La autoridad proviene del estado global y de la identidad.


Modelo basado en capacidades

En un sistema basado en capacidades:

  1. Un proceso ya debe poseer una capacidad de archivo
  2. Usa esa capacidad para realizar operaciones de lectura o escritura

Si el proceso no tiene la capacidad, no puede acceder al archivo sin importar qué nombre utilice.

No existe un paso de búsqueda global dentro del kernel.


Delegación y mínimo privilegio

Uno de los aspectos más poderosos de los sistemas basados en capacidades es la delegación.

Un proceso puede dar a otro proceso un subconjunto de su autoridad transfiriéndole una capacidad.

Por ejemplo:

  • Un servidor de archivos da a un cliente acceso de solo lectura a un archivo
  • Un gestor de memoria concede acceso a una región de memoria específica
  • Un proceso concede acceso a un endpoint de IPC

Esto habilita el principio de mínimo privilegio:

Cada componente recibe solo la autoridad que realmente necesita.


Eliminar la autoridad ambiental

Los sistemas basados en capacidades eliminan por completo la autoridad ambiental.

No hay:

  • espacios de nombres globales dentro del kernel
  • acceso implícito basado en identidad
  • privilegios ocultos

Toda autoridad debe pasarse de forma explícita.

Esto facilita mucho analizar:

  • qué puede hacer un proceso
  • cómo fluye la autoridad a través del sistema
  • dónde pueden aparecer problemas de seguridad

Revocación (un problema difícil)

Uno de los desafíos de los sistemas basados en capacidades es la revocación.

Una vez que se entrega una capacidad a un proceso, ¿cómo puede retirarse?

Diferentes sistemas implementan la revocación de distintas maneras:

  • capas de indirección
  • seguimiento de referencias
  • árboles de capacidades
  • mecanismos de versionado

La revocación es un área importante de investigación y se explorará en fases posteriores de EriX.


Sistemas basados en capacidades en la práctica

Las ideas basadas en capacidades no son nuevas. Varios sistemas las han implementado:

  • KeyKOS / EROS
  • seL4 (un micronúcleo verificado formalmente)
  • CHERI (capacidades asistidas por hardware)
  • Capsicum (extensiones de capacidades para FreeBSD)

Estos sistemas demuestran que los diseños basados en capacidades son tanto prácticos como potentes.


Cómo usa EriX las capacidades

EriX está diseñado desde el principio como un sistema basado en capacidades.

En EriX:

  • toda la autoridad se representa mediante capacidades
  • las capacidades están fuertemente tipadas
  • las capacidades son inmutables una vez creadas
  • las capacidades se transfieren mediante IPC
  • el kernel hace cumplir la no falsificabilidad y las invariantes de seguridad

No hay espacios de nombres globales dentro del kernel. Todo acceso a recursos está mediado por capacidades.

Esto se alinea con el objetivo más amplio de hacer que la autoridad sea:

  • explícita
  • mínima
  • fácil de razonar

Por qué esto importa

Los sistemas basados en capacidades proporcionan una base para construir:

  • sistemas más seguros
  • arquitecturas más modulares
  • sistemas más fáciles de analizar y verificar

Al eliminar la autoridad implícita y hacer explícito todo acceso, eliminan clases enteras de vulnerabilidades comunes en los sistemas tradicionales.


Mirando hacia adelante

Las capacidades son un concepto fundamental en EriX. En futuras publicaciones exploraremos cómo se implementan en la práctica, incluyendo:

  • espacios de capacidades (CSpace)
  • comunicación entre procesos (IPC)
  • gestión de memoria mediante capacidades sin tipo
  • delegación y grafos de autoridad

Comprender las capacidades es el primer paso para comprender el resto del sistema.