Pitfalls in VM Implementation on CHERI: Lessons from Porting CRuby

Dieser Beitrag analysiert anhand des Portings von CRuby auf CHERI spezifische Fallstricke bei der Implementierung von Virtual Machines, die durch die Kollision von C-Programmierungsideen mit dem strengen CHERI-Sicherheitsmodell entstehen, und stellt bewährte Lösungen vor.

Hanhaotian Liu (University of Tokyo, Japan), Tetsuro Yamazaki (University of Tokyo, Japan), Tomoharu Ugawa (University of Tokyo, Japan)

Veröffentlicht Mon, 09 Ma
📖 6 Min. Lesezeit🧠 Tiefgang

Each language version is independently generated for its own context, not a direct translation.

Hier ist eine einfache, bildhafte Erklärung der wissenschaftlichen Arbeit „Pitfalls in VM Implementation on CHERI" auf Deutsch.

Die große Idee: Ein unsichtbarer Sicherheitsgürtel

Stellen Sie sich vor, ein Computer ist wie ein riesiges, chaotisches Lagerhaus. In einem normalen Computer sind Zeiger (Pointer) wie einfache Zettel, auf denen nur eine Adresse steht: „Geh zu Regal 5, Fach 3". Das Problem ist: Jeder kann diesen Zettel lesen, ändern oder fälschen. Wenn ein Programm einen Zettel falsch hält, greift es vielleicht auf einen Bereich zu, in dem es nichts zu suchen hat – das führt zu Sicherheitslücken und Abstürzen.

CHERI ist wie ein revolutionäres neues System für dieses Lagerhaus. Statt eines einfachen Zettels gibt es jetzt einen Sicherheitsausweis (eine „Capability"). Dieser Ausweis enthält nicht nur die Adresse, sondern auch:

  • Erlaubnisse: Darf ich hier nur lesen oder auch schreiben?
  • Grenzen: Darf ich nur in Fach 3 schauen oder auch in Fach 4?
  • Echtheitsprüfung: Ist dieser Ausweis echt oder gefälscht?

Wenn jemand versucht, ohne Erlaubnis in ein Fach zu greifen oder über die Grenzen hinaus zu schauen, schreit das System sofort „Stopp!" und blockiert den Zugriff. Das ist super sicher!

Das Problem: Der alte Schlüssel passt nicht ins neue Schloss

Die Autoren dieser Arbeit haben versucht, CRuby (die Standard-Software, die die Programmiersprache Ruby antreibt) auf dieses neue CHERI-System zu übertragen. CRuby ist wie ein riesiger, komplexer Maschinenpark, der in der Sprache C gebaut wurde.

Das Problem war: Die Entwickler von CRuby haben über Jahrzehnte viele „Tricks" benutzt, die auf dem alten System (dem normalen Lagerhaus) super funktionierten, aber auf dem neuen CHERI-System katastrophal scheitern.

Man kann sich das so vorstellen:

  • Der alte Trick: Ein Mechaniker nimmt einen Schraubenschlüssel (einen Zeiger), dreht ihn um, nutzt ihn als Hammer und dann wieder als Schraubenschlüssel. Auf dem alten System ging das, weil alles aus Metall war.
  • Das neue System: Auf CHERI ist der Schraubenschlüssel ein hochpräzises, elektronisches Werkzeug. Wenn man ihn als Hammer benutzt, löst er einen Alarm aus, weil er nicht für Hammerschläge „autorisiert" ist.

Die Forscher haben herausgefunden, wo genau diese „Alarmschreie" in CRuby passiert sind, und haben Lösungen gefunden. Hier sind die wichtigsten Fallen (Pitfalls) und ihre Lösungen, erklärt mit Analogien:

1. Die „Schatzsuche" auf dem falschen Weg (Grenzen verletzen)

  • Das Szenario: Der Garbage Collector (ein Aufräumroboter) muss den ganzen Stapel (Stack) durchsuchen, um zu sehen, welche Dinge noch wichtig sind. Er nimmt einen Zeiger vom obersten Punkt und sagt: „Ich gehe jetzt Schritt für Schritt nach unten."
  • Der Fehler: Auf dem alten System war das kein Problem. Auf CHERI hat dieser Zeiger aber eine „Sichtweite" (Bounds), die nur dieses eine Fach umfasst. Wenn der Roboter einen Schritt macht, ist er außerhalb seiner Sichtweite und wird gestoppt.
  • Die Lösung: Man braucht einen „Meister-Schlüssel", der den gesamten Stapel abdeckt. Vom Meister-Schlüssel aus darf man dann kleinere Schlüssel ableiten, die immer noch sicher sind.

2. Die „Verwechslung" von Zahlen und Adressen

  • Das Szenario: Der Aufräumroboter schaut sich Zahlen an und denkt: „Das sieht aus wie eine Adresse, also gehe ich da hin." Manchmal sind das aber nur zufällige Zahlen, die wie Adressen aussehen.
  • Der Fehler: Auf dem alten System hat der Roboter einfach hingeschaut. Auf CHERI hat jede echte Adresse einen unsichtbaren „Sicherheitsstempel". Wenn der Roboter eine zufällige Zahl nimmt und versucht, sie als Adresse zu nutzen, fehlt der Stempel. Der Computer sagt: „Das ist kein echter Ausweis!" und blockiert.
  • Die Lösung: Statt nur zu raten („Sieht das aus wie ein Ausweis?"), prüft der Roboter jetzt direkt den unsichtbaren Stempel. Ist er da? Gut. Ist er nicht da? Ignorieren. Das ist sogar schneller und sicherer!

3. Der „Erweiterungs-Trick" (Speicher neu verteilen)

  • Das Szenario: Ein Programm braucht mehr Platz für Daten. Es sagt zum Speicher: „Vergrößere diesen Bereich, aber behalte die alte Adresse bei."
  • Der Fehler: Auf CHERI kann es sein, dass der Speicher zwar an derselben Stelle bleibt, aber die „Grenzen" (Bounds) des Ausweises sich ändern. Wenn das Programm aber noch den alten Ausweis mit den alten Grenzen benutzt, um in den neuen, größeren Bereich zu schreiben, wird es blockiert.
  • Die Lösung: Man muss sofort den neuen Ausweis nehmen, sobald der Speicher erweitert wurde. Man darf sich nicht auf den alten verlassen.

4. Die „geheime Bits"-Falle

  • Das Szenario: Programmierer packen oft kleine Informationen (wie Status-Flags) in die „leeren" Bits einer großen Zahl, um Platz zu sparen.
  • Der Fehler: Auf CHERI sind die oberen Bits einer Zahl nicht leer, sondern enthalten wichtige Metadaten (wie die Grenzen). Wenn das Programm diese Bits manipuliert, zerstört es versehentlich die Sicherheitsdaten des Ausweises.
  • Die Lösung: Verwende für solche Tricks nur Zahlen, die genau so groß sind, wie sie sein müssen (z. B. 64-Bit-Zahlen), damit keine „Sicherheits-Bits" mitgemischt werden.

5. Der „versteckte" Alarm (Versiegelte Schlüssel)

  • Das Szenario: Manche Schlüssel (z. B. für Rückkehradressen in Funktionen) sind „versiegelt". Sie dürfen nicht verändert werden, um Manipulationen zu verhindern.
  • Der Fehler: Der Compiler von CHERI macht manchmal automatisch aus Zahlen wieder Ausweise. Wenn das Programm versucht, eine Zahl zu berechnen, die eigentlich ein versiegelter Ausweis ist, versucht der Compiler, diesen Ausweis zu „reparieren" oder zu ändern. Das löst einen Alarm aus, weil versiegelte Ausweise unveränderlich sein müssen.
  • Die Lösung: Man muss dem Computer explizit sagen: „Behandle das hier nur als reine Zahl, nicht als Ausweis", bevor man rechnet.

Das Ergebnis: Ein sicherer, aber etwas schwererer Rucksack

Die Forscher haben CRuby so umgebaut, dass es auf CHERI läuft.

  • Ergebnis: Das Programm läuft fast genauso schnell wie das Original (etwa 98 % der Geschwindigkeit).
  • Der Preis: Es ist etwas mehr Arbeit für die Entwickler, diese „Sicherheitsregeln" einzuhalten. Aber im Gegenzug ist das System viel robuster gegen Hacker und Abstürze.

Fazit:
Die Arbeit zeigt uns, dass Sicherheit oft bedeutet, alte Gewohnheiten aufzugeben. Wir müssen aufhören, mit „Zetteln" zu arbeiten, die wir nach Belieben ändern können, und stattdessen lernen, mit „Sicherheitsausweisen" umzugehen, die uns genau sagen, was wir dürfen und was nicht. Es ist wie der Übergang von einem offenen Lagerhaus, in dem jeder alles anfassen darf, zu einem hochgesicherten Banktresor, in dem jeder Schritt überwacht wird – und das ist genau das, was wir für sichere Software brauchen.