The popularity of the Java programming language has led to its wide adoption in cloud computing infrastructures. However, Java applications running in untrusted clouds are vulnerable to various forms of privileged attacks. The emergence of trusted execution environments (TEEs) such as Intel SGX mitigates this problem. TEEs protect code and data in secure enclaves inaccessible to untrusted software, including the kernel and hypervisors. To efficiently use TEEs, developers must manually partition their applications into trusted and untrusted parts, in order to reduce the size of the trusted computing base (TCB) and minimise the risks of security vulnerabilities. However, partitioning applications poses two important challenges: (i) ensuring efficient object communication between the partitioned components, and (ii) ensuring the consistency of garbage collection between the parts, especially with memory-managed languages such as Java. We present Montsalvat, a tool which provides a practical and intuitive annotation-based partitioning approach for Java applications destined for secure enclaves. Montsalvat provides an RMI-like mechanism to ensure inter-object communication, as well as consistent garbage collection across the partitioned components. We implement Montsalvat with GraalVM native-image, a tool for compiling Java applications ahead-of-time into standalone native executables that do not require a JVM at runtime. Our extensive evaluation with micro- and macro-benchmarks shows our partitioning approach to boost performance in real-world applications
academic
Montsalvat: Partitionierung von Java-Anwendungen zur Minimierung der TCB in Intel SGX
Die Popularität der Java-Programmiersprache führt zu ihrer weit verbreiteten Verwendung in Cloud-Computing-Infrastrukturen. Java-Anwendungen, die in nicht vertrauenswürdigen Cloud-Umgebungen ausgeführt werden, sind jedoch anfällig für verschiedene privilegierte Angriffe. Das Aufkommen von Trusted Execution Environments (TEE) wie Intel SGX mindert dieses Problem. TEE schützt Code und Daten in sicheren Enklaven vor dem Zugriff durch nicht vertrauenswürdige Software, einschließlich des Kernels und des Hypervisors. Um TEE effizient zu nutzen, müssen Entwickler Anwendungen manuell in vertrauenswürdige und nicht vertrauenswürdige Teile aufteilen, um die Größe der Trusted Computing Base (TCB) zu reduzieren und das Sicherheitsrisiko zu minimieren. Dieses Paper stellt das Montsalvat-Tool vor, das eine praktische und intuitive annotationsbasierte Partitionierungsmethode für auf Sicherheitsenklaven ausgerichtete Java-Anwendungen bietet. Montsalvat bietet einen RMI-ähnlichen Mechanismus zur Gewährleistung der Kommunikation zwischen Objekten sowie konsistente Garbage Collection über partitionierte Komponenten hinweg.
Sicherheitsbedrohungen: Java-Anwendungen in nicht vertrauenswürdigen Cloud-Umgebungen sind Bedrohungen durch privilegierte Angriffe ausgesetzt, einschließlich Kernel- und Hypervisor-Ebenen-Angriffen
TCB-Minimierungsanforderung: Bei der Verwendung von TEE wie Intel SGX muss die Trusted Computing Base minimiert werden, um die Angriffsfläche zu reduzieren
Partitionierungskomplexität: Die manuelle Aufteilung von Java-Anwendungen erfordert die Behandlung komplexer Probleme wie Objektkommunikation und Garbage-Collection-Konsistenz
Vollständige Anwendungslösungen: SCONE, Graphene-SGX und ähnliche Systeme platzieren die gesamte Anwendung (einschließlich JVM) in der Enklave, was zu einer großen TCB führt (Millionen von Codezeilen)
Framework-spezifische Lösungen: VC3, SecureKeeper und ähnliche sind nur auf spezifische Frameworks ausgerichtet und mangelt es an Allgemeingültigkeit
Bestehende Java-Partitionierungslösungen:
Civet erfordert ein vollständiges LibOS, TCB bleibt groß
Uranus erfordert Werkzeuge von Drittanbietern zur Inferenz vertrauenswürdiger Partitionen mit erheblicher Entwicklereinmischung
Annotationsbasierte Partitionierungsmethode: Vorschlag einer praktischen und intuitiven Annotation auf Klassenebene (@Trusted, @Untrusted, @Neutral) zur Partitionierung von Java-Anwendungen
RMI-Mechanismus: Entwurf eines RMI-ähnlichen Mechanismus für Objektkommunikation über Enklaven hinweg, der transparente Remote-Methodenaufrufe durch Proxy-Objekte ermöglicht
Verteilte Garbage Collection: Implementierung einer auf schwachen Referenzen basierenden GC-Erweiterung, die Objektvernichtungskonsistenz zwischen vertrauenswürdigen und nicht vertrauenswürdigen Heaps gewährleistet
GraalVM-Integration: Tiefe Integration mit GraalVM native-image, Nutzung von AOT-Kompilierung zur Leistungsoptimierung
Eingabe: Java-Anwendungsquellcode mit Sicherheitsannotationen
Ausgabe: Partitionierte vertrauenswürdige und nicht vertrauenswürdige native Images, die in Intel SGX-Umgebungen bereitgestellt werden können
Einschränkungen: Beibehaltung der ursprünglichen Anwendungssemantik, Gewährleistung von Objektkommunikation und GC-Konsistenz
Verwendung des Javassist-Frameworks für Bytecode-Transformation:
Proxy-Klassengenerierung:
Generierung von Proxy-Klassen für jede vertrauenswürdige Klasse in der nicht vertrauenswürdigen Laufzeit
Generierung von Proxy-Klassen für jede nicht vertrauenswürdige Klasse in der vertrauenswürdigen Laufzeit
Proxy-Klassen behalten ursprüngliche Methodensignaturen bei, aber Methodenkörper werden durch Aufrufe über Enklaven hinweg ersetzt
Relay-Methodeninjizierung:
// Ursprüngliche Methode in Relay-Methode umgewandelt
@CEntryPoint
public static void relayAccount(Isolate ctx, int hash,
CCharPointer buf, int b) {
String s = deserialize(buf);
Account mirror = new Account(s, b);
mirrorProxyRegistry.add(hash, mirror);
}
Objektmappingmechanismus:
Zuweisung eines eindeutigen Hash-Werts für jedes Proxy-Objekt
Verwaltung von Proxy-Mirror-Objektregistern
Realisierung von Objektreferenzen über Enklaven hinweg durch Hash-Werte
// GC-Synchronisierung basierend auf schwachen Referenzen
WeakReference<ProxyObject> weakRef = new WeakReference<>(proxy);
proxyWeakRefs.add(new ProxyWeakRefEntry(weakRef, proxy.getHash()));
// GC Helper überprüft regelmäßig
if (weakRef.get() == null) {
// Proxy-Objekt wurde GC, benachrichtige die andere Seite
// über die Zerstörung des Mirror-Objekts
notifyMirrorDestruction(hash);
}
Das Paper zitiert 60 verwandte Arbeiten, die SGX-Technologie, TEE-Anwendungen, Java-Sicherheit, Kompilierungsoptimierung und andere wichtige Arbeiten in mehreren Bereichen abdecken und eine solide theoretische Grundlage für diese Forschung bieten.
Gesamtbewertung: Dies ist ein hochqualitatives Systemforschungspapier, das praktische Bereitstellungsprobleme von Java-Anwendungen in TEE-Umgebungen löst. Die Methodologie ist vernünftig gestaltet, die Implementierung ist vollständig, die Experimente sind umfassend und es hat großen akademischen Wert und praktische Bedeutung. Obwohl es noch Verbesserungspotenzial bei RMI-Overhead und Anwendbarkeit gibt, bietet es wichtige Referenzen für verwandte Forschung.