# Capability

Il termine capability è un concetto utilizzato nella sicurezza informatica ed è uno dei modelli di sicurezza esistenti. Una capability (conosciuta anche come chiave) è un token di autorità comunicabile e non falsificabile. Essa consiste in un valore che fa riferimento ad un oggetto insieme a una collezione di diritti di accesso. Un programma utente che viene eseguito su un sistema operativo basato su capability deve utilizzare una capability per accedere ad un oggetto.
Un sistema di sicurezza basato su capability è il principio di design che permette ai programmi utente lo scambio diretto delle capabilities seguendo il principio del privilegio minimo, e all'infrastruttura del sistema operativo di rendere questi passaggi efficienti e sicuri.
Anche se molti sistemi operativi implementano meccanismi che assomigliano alle capabilities, solitamente non offrono il supporto per lo scambio delle capabilities tra entità come metodo principale di autorizzazione e distribuzione dei diritti di accesso. Al contrario quest'ultimo è proprio lo scopo di un sistema basato su capability.
Questo sistema di sicurezza utilizza un approccio contrastante rispetto a quello introdotto dai domini gerarchici di protezione.
Il termine capability, come viene utilizzato in questo articolo, non va confuso con l'omonima parola associata a POSIX 1e/2c. Quest'ultimo è un sistema che prevede privilegi meno raffinati e non trasferibili tra processi.

## Introduzione

Le capabilities hanno l'obiettivo di migliorare la sicurezza dei sistemi sostituendo riferimenti falsificabili. Questi ultimi (per esempio un percorso) identifica un oggetto, ma non specifica quali sono i suoi permessi e quale programma detiene quel riferimento. Di conseguenza, il sistema operativo necessita di validare ogni tentativo di accedere all'oggetto in riferimento tramite access control list (ACL). In un sistema con capability, invece, il semplice possesso di una capability permette al programma di utilizzare l'oggetto riferito in conformità con i permessi specificati dalla capability. In teoria, un sistema operativo basato su capability rimuove completamente la necessita di utilizzare le access control list o altri meccanismi simili.
Una capability è tipicamente implementata come una struttura dati privilegiata che consiste in una sezione che specifica i diritti di accesso e una sezione che identifica univocamente l'oggetto da raggiungere. L'utente non accede direttamente alla struttura dati o all'oggetto, ma attraverso un puntatore. In pratica, viene utilizzato in maniera simile a un descrittore di file di un sistema operativo tradizionale, ma per accedere a ogni oggetto nel sistema. Le capabilities sono tipicamente memorizzate dal sistema operativo in una lista, implementando alcuni meccanismi che prevengono al programma di modificare direttamente il contenuto della capability (come anche per falsificare diritti di accesso e modificare l'oggetto a cui si punta).
Un programma che possiede capabilities può eseguire funzioni su esse, come condividerle con altri programmi, realizzare una versione con meno privilegi o eliminarle completamente. Il sistema operativo deve fare in modo che solo alcune specifiche operazioni possano essere eseguite sulle capabilities nel sistema, in maniera da poter mantenere l'integrità della sicurezza.

## Esempi

Una capability è definita come un riferimento protetto ad un oggetto la quale garantisce al processo la possibilità (in inglese appunto capability) di interagire con l'oggetto in determinati modi. Questi includono leggere il dato associato all'oggetto, modificare l'oggetto, eseguire il dato dell'oggetto come processo e altri possibili permessi di accesso. La capability consiste in un riferimento che identifica un oggetto particolare e un insieme di uno o più diritti.
Supponiamo che, nella memoria di un processo utente, esistono le seguenti stringhe:
Anche se questo identifica un unico oggetto nel sistema, questo non specifica i diritti di accesso e quindi non si tratta di una capability. Supponiamo quindi che ci siano i seguenti due valori:
Questo identifica un oggetto e un insieme di permessi di accesso, ma non si tratta ancora una capability perché il possesso di questi valori per un processo utente non permette di capire se l'accesso e legittimo.
Ora ipotizziamo di far eseguire al processo questa riga di codice:
La variabile fd ora contiene un indice di un descrittore di file contenuto nella tabella dei descrittori di file del processo. Il descrittore di file è la capability. La sua esistenza della tabella all'interno del processo è una condizione sufficiente per dichiarare che per il processo in questione l'accesso all'oggetto è legittimo. Una funzionalità chiave di questa modalità è che la tabella dei descrittori si trova nella memoria kernel e quindi non può essere direttamente manipolata dal programma utente.

## Condivisione tra processi

Nei sistemi operativi tradizionali, i programmi spesso comunicano tra di loro e la memoria utilizzando riferimenti come nei primi due esempi sopra. I nomi dei percorsi sono spesso passati come parametri di linea di comando, inviati via socket e salvati su disco. Questi riferimenti non sono capabilities e vanno validati prima dell'uso.
Nei sistemi basati su capability, le capabilities stesse sono passate tra processi e memoria utilizzando un sistema conosciuto dal sistema operativo con lo scopo di mantenere l'integrità di queste capabilities.

## Implementazioni

* Tahoe-LAFS - filesystem basato su capability open source
* GNOSIS
** KeyKOS
*** EROS - The Extremely Reliable Operating System - successore di KeyKOS
**** CapROS
**** Coyotos
* Cambridge CAP computer
* Carnegie Mellon University C.mmp con Hydra (sistema operativo)
* Carnegie Mellon University CM* con StarOS
* IBM System/38 e AS/400
* Intel iAPX 432
* Plessey System 250
* Flex
* L4 microkernel
* Amoeba - sistema operativo distribuito
* FreeBSD - Capsicum framework
* Google Fuchsia
* chiamata di sistema pledge di OpenBSD