Indietro

ⓘ Capability




                                     

ⓘ Capability

Il termine capability è un concetto utilizzato nella sicurezza informatica ed è uno dei modelli di sicurezza esistenti. Una capability è 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 allinfrastruttura 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 questultimo è 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 lomonima parola associata a POSIX 1e/2c. Questultimo è un sistema che prevede privilegi meno raffinati e non trasferibili tra processi.

                                     

1. Introduzione

Le capabilities hanno lobiettivo 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 alloggetto in riferimento tramite access control list ACL. In un sistema con capability, invece, il semplice possesso di una capability permette al programma di utilizzare loggetto 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 loggetto da raggiungere. Lutente non accede direttamente alla struttura dati o alloggetto, 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 loggetto 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 lintegrità della sicurezza.

                                     

2. 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 loggetto in determinati modi. Questi includono leggere il dato associato alloggetto, modificare loggetto, eseguire il dato delloggetto 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:

etc/passwd

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:

/etc/passwd O_RDWR

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 laccesso e legittimo.

Ora ipotizziamo di far eseguire al processo questa riga di codice:

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

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 allinterno del processo è una condizione sufficiente per dichiarare che per il processo in questione laccesso alloggetto è legittimo. Una funzionalità chiave di questa modalità è che il la tabella dei descrittori si trova nella memoria kernel e quindi non può essere direttamente manipolata dal programma utente.

                                     

3. 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 spessi passati come parametri di linea di comando, inviati via socket e salvati su disco. Questi riferimenti non sono capabilities e vanno validati prima delluso.

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 lintegrità di queste capabilities.

                                     

4. Implementazioni

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