# Capability-based security

Capability-based security (deutsch Berechtigungsbasierte Sicherheit[-srichtlinien]) ist ein Sicherheitskonzept aus dem Bereich der Computeradministration, das auf der Vergabe und Verwaltung von individuellen Berechtigungen und Zugriffsrechten basiert. Dieser Ansatz ermöglicht es, den Zugriff auf Ressourcen und Daten in Computersystemen präzise zu kontrollieren und Sicherheitsrisiken zu minimieren.

## Allgemeines

Eine Fähigkeit / eine Berechtigung (englisch capability), die auch in manchen Systemen als Schlüssel bekannt ist, ist ein kommunizierbarer und unveränderbarer Authentifizierungstoken. Dieser bezieht sich auf einen Wert, der ein Objekt und ein dazu passendes Set von Zugriffsrechten darstellt. Ein Computerprogramm des Benutzers, das auf einem Fähigkeiten-basierenden Betriebssystem läuft, muss dementsprechende Fähigkeiten/Rechte haben, um auf Objekte zugreifen zu können.
Berechtigungsbasierte Sicherheit bezieht sich auf das Prinzip, dass Computerprogramme nach dem Prinzip der „minimalen Rechte“ (engl. principle of least privilege) untereinander kommunizieren und sich dementsprechend Fähigkeiten bzw. Berechtigungen zuweisen und dass das Betriebssystem die passende Infrastruktur hat, um effektiv und sicher arbeiten zu können. Fähigkeitsbasierte Sicherheit steht im Gegensatz zu der Ring- bzw. Domain-Methode (engl. hierarchical protection domains).
Die meisten Betriebssysteme implementieren Hilfsmittel, die diesen Fähigkeiten ähneln. Diese bieten oft nicht genügend Support an, um Fähigkeiten bzw. Berechtigungen zwischen dem Betriebssystem und unbekannten Instanzen auszutauschen, um damit die primäre Stelle für Zugriffsrechte zu sein. Im Gegensatz dazu ist ein fähigkeitsbasiertes System darauf ausgerichtet.
Die Fähigkeiten bzw. Berechtigungen, um die es in diesem Artikel geht, sollten nicht mit POSIX verwechselt werden.

## Berechtigungen und berechtigungsbasierte Sicherheit

Berechtigungen verbessern die Systemsicherheit, indem sie anstelle von veränderbaren Referenzen verwendet werden. Eine veränderbare Referenz (z. B. ein Pfadname) identifiziert ein Objekt, gibt aber nicht an, welche Zugriffsrechte für dieses Objekt vorhanden sind, und das Anwenderprogramm, das diese Referenz enthält. Daher muss jeder Zugriff auf das referenzierte Objekt vom Betriebssystem auf der Grundlage der Berechtigungen des anfragenden Programms validiert werden, das typischerweise über die Verwendung einer Zugriffssteuerungsliste (ACL) passiert. Im Gegenteil dazu, ist in einem System mit Rechten der reine Besitz gewisser Berechtigungen ausreichend, um auf referenzierte Objekte zugreifen zu können. Theoretisch sind in einem solchen System keine Zugriffssteuerungslisten oder ähnlichen Technologien vonnöten, da alle Entitäten nur diejenigen Fähigkeiten besitzen, die sie tatsächlich benötigen.
Eine Berechtigung bzw. eine Fähigkeit wird typischerweise als eine privilegierte Datenstruktur implementiert, die aus zwei Teilen besteht, der eine spezifiziert Zugriffsrechte und der andere identifiziert das zuzuordnende Objekt eindeutig. Der Benutzer greift nicht direkt auf die Datenstruktur oder das Objekt zu, sondern über einen Handle. In der Praxis gleicht die Verwendung oftmals der eines Dateihandles in einem traditionellen Betriebssystem (ein traditioneller Handle) verwendet, betrifft aber den Zugriff auf jedes Objekt des Systems. Die Fähigkeiten werden typischerweise vom Betriebssystem in einer Liste gespeichert, wobei eine Sicherheit implementiert ist, um zu verhindern, dass das Programm den Inhalt der Fähigkeit direkt ändert. Einige Systeme basieren ebenfalls auf einer fähigkeitsorientierten Adressierung (in etwa gleichbedeutend mit einer Hardwareunterstützung für Fähigkeiten), wie das Plessey System 250.
Programme, die Fähigkeiten besitzen, können Funktionen auf diesen durchführen, wie z. B. diese an andere Programme weitergeben, sie in eine weniger privilegierte Version umwandeln oder sie löschen. Das Betriebssystem muss sicherstellen, dass nur bestimmte Operationen für die Fähigkeiten im System auftreten können, um die Integrität der Sicherheitspolitik aufrechtzuerhalten.

## Einführung in berechtigungsbasierte Sicherheit

Eine Fähigkeit bzw. eine Berechtigung ist definiert als eine geschützte Objektreferenz, die aufgrund ihrer Eigenschaft einem Prozess die Erlaubnis bzw. Fähigkeit gibt, mit einem Objekt zu interagieren. Dies könnten das Lesen von Daten, die mit einem Objekt verbunden sind, das Ändern des Objekts, das Ausführen der Daten und andere denkbare Zugriffsrechte betreffen. Die Fähigkeit besteht daher logischerweise aus einer Referenz, die ein bestimmtes Objekt eindeutig identifiziert und eine oder mehrerer dieser Berechtigungen besitzt.
Angenommen, in dem Speicherplatz eines Programmes existiert der folgende String:
Obwohl dies ein eindeutiges Objekt auf dem System identifiziert, gibt es keine Zugriffsrechte an und ist daher keine Fähigkeit. Angenommen, es gibt stattdessen die folgenden zwei Werte:
Dies identifiziert ein Objekt zusammen mit dessen Zugriffsrechten. Es ist jedoch noch keine Fähigkeit, weil ein Besitz dieser Werte nichts darüber sagt, ob dieser Zugang tatsächlich legitim wäre.
Nehmen wir nun an, dass das Anwenderprogramm die folgende Anweisung erfolgreich ausführt:
Die Variable fd enthält nun den Index eines Dateihandles in der Dateihandletabelle des Prozesses. Dieser Dateihandle ist eine Fähigkeit. Seine Existenz in der Dateihandletabelle des Prozesses reicht aus, um zu wissen, dass der Prozess tatsächlich einen legitimen Zugriff auf das Objekt hat. Ein wesentliches Merkmal dieser Anordnung ist, dass sich die Dateihandletabelle im Kernspeicher befindet und nicht direkt vom Anwenderprogramm manipuliert werden kann.

## Austausch von Fähigkeiten zwischen Prozessen

In traditionellen Betriebssystemen kommunizieren Programme oft miteinander, indem Pfadnamen als Befehlszeilenparameter übergeben oder über Sockets gesendet werden. Diese Referenzen sind keine Fähigkeiten und müssen validiert werden, bevor sie verwendet werden können. In diesen Systemen ist die zentrale Frage, nach welcher Autorität eine gegebene Referenz zu beurteilen ist. Dies wird ein kritisches Thema bei Prozessen, die von zwei unterschiedlichen Entitäten mit verschiedenen Rechten ausgeführt werden. Dies kann zu einem häufig auftretenden Programmierfehler führen, der als Confused deputy problem (deutsch Problem des verwirrten Stellvertreters) bezeichnet wird und zu Sicherheitslücken führen kann.
In einem fähigkeitsbasierten System werden die Fähigkeiten zwischen Prozessen und der Speicherung über einen Mechanismus übergeben, der vom Betriebssystem bekannt ist, um die Integrität dieser Fähigkeiten aufrechtzuerhalten.
Ein neuartiger Ansatz zur Lösung dieses Problems beinhaltet die Verwendung eines orthogonal persistierenden Betriebssystems. (Dies wurde in der Flex-Maschine realisiert.) In einem solchen System besteht keine Notwendigkeit, Entitäten zu verwerfen und ihre Fähigkeiten ungültig zu machen und benötigen daher einen ACL-ähnlichen Mechanismus, um diese Fähigkeiten zu einem späteren Zeitpunkt wiederherstellen zu können. Das Betriebssystem behält die Integrität und Sicherheit der Fähigkeiten, die im gesamten Speicher enthalten sind, sowohl flüchtige als auch nichtflüchtige; zum Teil durch die Durchführung aller Serialisierungsaufgaben, anstatt die Benutzerprogramme dies machen zu lassen, wie dies bei den meisten Betriebssystemen der Fall ist. Da die Anwenderprogramme von dieser Verantwortung entlastet werden, besteht keine Notwendigkeit ihre Rechte und Fähigkeiten noch ihre Zugangsanfragen zu validieren.

## POSIX vs. Capsicum Fähigkeiten

POSIX draft 1003.1e spezifiziert ein Konzept der Berechtigungen mit dem Namen „Fähigkeiten“. Allerdings unterscheiden sich POSIX-Fähigkeiten von den Fähigkeiten in diesem Artikel. Eine POSIX-Fähigkeit ist nicht mit einem Objekt verbunden, Ein Prozess mit CAP_NET_BIND_SERVICE-Fähigkeit kann auf den TCP-Port 1024 zugreifen. Im Gegensatz dazu verbinden Capsicum-Fähigkeiten auf FreeBSD und Linux ein echtes Fähigkeiten-System mit dem UNIX-Design und der POSIX API. Capsicum-Fähigkeiten sind eine verfeinerte Form des Dateihandles. Ein delegierbares Recht zwischen Prozessen und zusätzlichen Objekttypen, das über das klassische POSIX (z. B. Prozess) ragt, können über Fähigkeiten referenziert werden. Im Capsicum-Fähigkeitsmodus können Prozesse nicht globale Namensräume (wie z. B. den Dateinamen des Dateisystems) verwenden, um Objekte zu finden, und müssen stattdessen vererbt werden oder sie bekommen die Objekte von anderen Prozessen.

## Vergleich mit anderen Ansätzen und Sicherheitskonzepten
### Berechtigungsbasierte Sicherheit vs. Rollenbasierte Sicherheit (RBAC)

Berechtigungsbasierte Sicherheit verwendet individuelle Fähigkeiten oder Berechtigungen, die einem Benutzer oder Prozess explizit zugewiesen werden. Jeder Benutzer oder Prozess hat individuelle Zugriffsrechte.
Rollenbasierte Sicherheit hingegen gruppiert Benutzer und Prozesse in Rollen und weist diesen Rollen bestimmte Rechte zu. Benutzer in derselben Rolle haben ähnliche Zugriffsrechte. Es ist weniger granular als die berechtigungsbasierte Sicherheit.

### Berechtigungsbasierte Sicherheit vs. Mandatory Access Control (MAC)

Berechtigungsbasierte Sicherheit konzentriert sich auf die Vergabe von Berechtigungen basierend auf den Anforderungen eines Benutzers oder Prozesses. Sie ist flexibler und erlaubt eine individuellere Kontrolle über den Zugriff.
MAC hingegen basiert auf vordefinierten Regeln und Klassifikationen, die von einer zentralen Autorität festgelegt werden. Benutzer haben weniger Kontrolle über ihre Zugriffsrechte, da diese durch die Richtlinien des Systems festgelegt sind.

### Berechtigungsbasierte Sicherheit vs. Discretionary Access Control (DAC)

Berechtigungsbasierte Sicherheit ist ähnlich wie DAC, da sie Benutzern die Kontrolle über ihre eigenen Ressourcen gewährt. Der Hauptunterschied besteht darin, dass die Berechtigungen in der berechtigungsbasierten Sicherheit aufgrund von Fähigkeiten oder Tokens vergeben werden.
DAC ermöglicht Benutzern, Zugriffsrechte auf Ressourcen zu gewähren oder zu entziehen, wodurch sie die Flexibilität haben, die Sicherheit ihrer eigenen Ressourcen zu verwalten. Es ist jedoch weniger sicher, da Benutzer leicht ungewollten Zugriff gewähren können.

### Berechtigungsbasierte Sicherheit vs. Attribute-Based Access Control (ABAC)

Berechtigungsbasierte Sicherheit vergibt Berechtigungen basierend auf spezifischen Fähigkeiten oder Tokens, die ein Benutzer besitzt.
ABAC ermöglicht den Zugriff basierend auf verschiedenen attributbasierten Richtlinien. Diese Richtlinien können sehr granular sein und beispielsweise den Zugriff basierend auf Benutzerattributen, Ressourcenattributen und anderen Kontextinformationen steuern.

### Berechtigungsbasierte Sicherheit vs. Zero Trust Security

Berechtigungsbasierte Sicherheit konzentriert sich auf die Verwaltung von Zugriffsrechten auf Grundlage von Benutzerberechtigungen und -fähigkeiten. Sie setzt auf eine Vertrauensbasis, bei der Benutzer bestimmte Berechtigungen besitzen.
Zero Trust Security hingegen geht davon aus, dass kein Benutzer oder Gerät von Natur aus vertrauenswürdig ist. Es setzt auf eine "Vertrauens-nicht, überprüfe ständig"-Philosophie und erfordert eine kontinuierliche Authentifizierung und Überprüfung, unabhängig von Berechtigungen.

## Forschung und kommerzielle Systeme

* Tahoe-LAFS - Open-Source Fähigkeiten-basierende Filesystem
* GNOSIS
** KeyKOS
*** EROS - The Extremely Reliable Operating System - KeyKOS Nachfolger
**** CapROS - EROS Nachfolger, dass den EROS Code weiterentwickelt hat für kommerzielle Zwecke
**** Coyotos - EROS Nachfolger für Forschungszwecke
* Cambridge CAP computer
* Carnegie Mellon University C.mmp mit Hydra (Betriebssystem)
* Carnegie Mellon University CM* with StarOS
* IBM System/38 and AS/400
* Intel iAPX 432
* Plessey System 250
* Flex
* L4 microkernel family - Open Kernel Labs - OKL4 and NICTA - seL4, TU Dresden - Fiasco.OC
* Amoeba - verteiltes Betriebssystem
* CloudABI secure runtime environment
* Google Fuchsia