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 : Partitionnement des Applications Java pour Minimiser la TCB dans Intel SGX
La popularité du langage de programmation Java a conduit à son adoption généralisée dans les infrastructures informatiques en nuage. Cependant, les applications Java exécutées dans des environnements nuagiques non fiables sont vulnérables à diverses attaques privilégiées. L'émergence d'environnements d'exécution de confiance (TEE) tels qu'Intel SGX atténue ce problème. Les TEE protègent le code et les données dans des enclaves sécurisées, les rendant inaccessibles aux logiciels non fiables, y compris le noyau et l'hyperviseur. Pour utiliser efficacement les TEE, les développeurs doivent partitionner manuellement les applications en parties fiables et non fiables afin de réduire la taille de la base de calcul de confiance (TCB) et de minimiser les risques de vulnérabilité de sécurité. Cet article propose l'outil Montsalvat, qui fournit une méthode de partitionnement pratique et intuitive basée sur les annotations pour les applications Java orientées vers les enclaves sécurisées. Montsalvat fournit un mécanisme similaire à RMI pour assurer la communication entre objets, ainsi qu'une collecte des ordures cohérente entre les composants partitionnés.
Menaces de sécurité : Les applications Java dans les environnements nuagiques non fiables font face à des menaces d'attaques privilégiées, y compris les attaques au niveau du noyau et de l'hyperviseur
Exigence de minimisation de la TCB : Lors de l'utilisation de TEE tels qu'Intel SGX, il est nécessaire de minimiser la base de calcul de confiance pour réduire la surface d'attaque
Complexité du partitionnement : Le partitionnement manuel des applications Java nécessite de traiter des problèmes complexes tels que la communication entre objets et la cohérence de la collecte des ordures
Solutions d'application complète : SCONE, Graphene-SGX, etc. placent l'application entière (y compris la JVM) dans l'enclave, avec une TCB trop importante (millions de lignes de code)
Solutions spécifiques aux frameworks : VC3, SecureKeeper, etc. ne ciblent que des frameworks spécifiques, manquant de généralité
Solutions de partitionnement Java existantes :
Civet nécessite un LibOS complet, la TCB reste importante
Uranus nécessite des outils tiers pour déduire les partitions fiables, avec une intervention importante des développeurs
Méthode de partitionnement basée sur les annotations : Propose une approche pratique et intuitive d'annotation au niveau des classes (@Trusted, @Untrusted, @Neutral) pour partitionner les applications Java
Mécanisme RMI : Conçoit un mécanisme de communication d'objets entre enclaves similaire à RMI, implémentant des appels de méthodes distantes transparents via des objets proxy
Collecte des ordures distribuée : Implémente une extension GC basée sur les références faibles, assurant la cohérence de destruction d'objets entre les tas fiables et non fiables
Intégration GraalVM : Intégration profonde avec GraalVM native-image, exploitant la compilation AOT pour optimiser les performances
Amélioration des performances : Réalise des améliorations significatives des performances dans les applications réelles (PalDB 6.6×, GraphChi 2.2×)
Entrée : Code source d'application Java annoté avec des annotations de sécurité
Sortie : Native images partitionnées fiables et non fiables, déployables dans l'environnement Intel SGX
Contraintes : Préserver la sémantique d'application d'origine, assurer la cohérence de la communication d'objets et de la GC
Utilise le framework Javassist pour la transformation du bytecode :
Génération de classes proxy :
Génère des classes proxy pour chaque classe fiable dans l'exécution non fiable
Génère des classes proxy pour chaque classe non fiable dans l'exécution fiable
Les classes proxy conservent les signatures de méthode d'origine, mais les corps de méthode sont remplacés par des appels entre enclaves
Injection de méthodes relais :
// Transformation de la méthode d'origine en méthode relais
@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);
}
Mécanisme de mappage d'objets :
Chaque objet proxy se voit attribuer une valeur de hachage unique
Maintient des registres de paires proxy-miroir
Implémente les références d'objets entre enclaves via les valeurs de hachage
@Trusted class DBReader // Protège les opérations de lecture sensibles
@Untrusted class DBWriter // Déplace les opérations d'écriture I/O en dehors de l'enclave
Le schéma RTWU offre de meilleures performances car il évite les conversions d'enclave coûteuses pour les écritures.
@Trusted class GraphChiEngine // Protège la logique de calcul principal
@Untrusted class FastSharder // Déplace les opérations I/O de partitionnement de graphe
Après le déplacement des opérations de partitionnement en dehors de l'enclave, les performances se rapprochent de celles natives.
Vérification de la faisabilité : L'approche de partitionnement au niveau des classes basée sur les annotations est faisable et intuitive
Avantages de performance : Les applications partitionnées offrent des améliorations significatives de performance par rapport aux solutions d'enclave complète
Réduction de la TCB : Réduit considérablement la base de code fiable via une bibliothèque shim plutôt qu'un LibOS
Convivialité pour les développeurs : L'approche par annotations est plus intuitive pour les développeurs
L'article cite 60 articles connexes, couvrant plusieurs domaines tels que la technologie SGX, les applications TEE, la sécurité Java et l'optimisation de compilation, fournissant une base théorique solide pour cette recherche.
Évaluation globale : Cet article est une recherche système de haute qualité qui résout les problèmes pratiques du déploiement d'applications Java dans les environnements TEE. La conception de la méthode est raisonnable, l'implémentation est complète, les expériences sont suffisantes, et elle possède une excellente valeur académique et pratique. Bien qu'il y ait encore de la place pour l'amélioration en termes de frais généraux RMI et d'applicabilité, elle fournit une référence importante pour la recherche connexe.