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: Partizionamento delle Applicazioni Java per Minimizzare la TCB in Intel SGX
La popolarità del linguaggio di programmazione Java ha portato alla sua ampia adozione nelle infrastrutture di cloud computing. Tuttavia, le applicazioni Java eseguite in ambienti cloud non affidabili sono vulnerabili a vari attacchi privilegiati. L'emergere di ambienti di esecuzione affidabili (TEE) come Intel SGX mitiga questo problema. I TEE proteggono il codice e i dati all'interno di enclave sicuri, rendendoli inaccessibili ai software non affidabili, inclusi kernel e hypervisor. Per utilizzare efficacemente i TEE, gli sviluppatori devono partizionare manualmente le applicazioni in componenti affidabili e non affidabili, al fine di ridurre la dimensione della base di calcolo affidabile (TCB) e minimizzare il rischio di vulnerabilità di sicurezza. Questo articolo presenta lo strumento Montsalvat, che fornisce un metodo di partizionamento basato su annotazioni pratico e intuitivo per applicazioni Java orientate agli enclave sicuri. Montsalvat fornisce un meccanismo simile a RMI per garantire la comunicazione tra oggetti e la raccolta coerente della memoria tra componenti partizionati.
Minacce di Sicurezza: Le applicazioni Java in ambienti cloud non affidabili affrontano minacce di attacchi privilegiati, inclusi attacchi a livello di kernel e hypervisor
Requisito di Minimizzazione della TCB: Quando si utilizzano TEE come Intel SGX, è necessario minimizzare la base di calcolo affidabile per ridurre la superficie di attacco
Complessità del Partizionamento: Il partizionamento manuale delle applicazioni Java richiede la gestione di problemi complessi come la comunicazione tra oggetti e la coerenza della raccolta della memoria
Soluzioni di Applicazione Completa: SCONE, Graphene-SGX e altri inseriscono l'intera applicazione (inclusa la JVM) nell'enclave, con una TCB eccessivamente grande (milioni di righe di codice)
Soluzioni Specifiche del Framework: VC3, SecureKeeper e altri sono rivolti solo a framework specifici, mancando di generalità
Soluzioni Esistenti di Partizionamento Java:
Civet richiede un LibOS completo, la TCB rimane comunque grande
Uranus richiede strumenti di terze parti per dedurre le partizioni affidabili, con maggiore intervento dello sviluppatore
Metodo di Partizionamento Basato su Annotazioni: Propone un modo di annotazione pratico e intuitivo a livello di classe (@Trusted, @Untrusted, @Neutral) per partizionare le applicazioni Java
Meccanismo RMI: Progetta un meccanismo di comunicazione tra oggetti attraverso enclave simile a RMI, implementando invocazioni di metodi remoti trasparenti tramite oggetti proxy
Raccolta della Memoria Distribuita: Implementa un'estensione GC basata su riferimenti deboli, garantendo la coerenza della distruzione degli oggetti tra heap affidabili e non affidabili
Integrazione GraalVM: Integrazione profonda con GraalVM native-image, sfruttando la compilazione AOT per ottimizzare le prestazioni
Miglioramento delle Prestazioni: Realizza miglioramenti significativi delle prestazioni nelle applicazioni reali (PalDB 6.6×, GraphChi 2.2×)
Input: Codice sorgente dell'applicazione Java con annotazioni di sicurezza
Output: Native image partizionato affidabile e non affidabile, distribuibile nell'ambiente Intel SGX
Vincoli: Mantenere la semantica originale dell'applicazione, garantire la comunicazione tra oggetti e la coerenza GC
Utilizza il framework Javassist per la trasformazione del bytecode:
Generazione di Classi Proxy:
Genera classi proxy per ogni classe affidabile nel runtime non affidabile
Genera classi proxy per ogni classe non affidabile nel runtime affidabile
Le classi proxy mantengono le firme dei metodi originali, ma il corpo del metodo viene sostituito con chiamate attraverso enclave
Iniezione di Metodi di Inoltro:
// Il metodo originale viene trasformato in metodo di inoltro
@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);
}
Meccanismo di Mappatura degli Oggetti:
Ogni oggetto proxy riceve un valore hash univoco
Mantiene registri di mappatura proxy-mirror
Implementa riferimenti agli oggetti attraverso enclave tramite valori hash
@Trusted class DBReader // Protezione delle operazioni di lettura sensibili
@Untrusted class DBWriter // Spostamento delle operazioni di scrittura I/O al di fuori dell'enclave
Lo schema RTWU ha prestazioni migliori perché evita costose conversioni di scrittura dell'enclave.
@Trusted class GraphChiEngine // Protezione della logica di calcolo principale
@Untrusted class FastSharder // Operazioni I/O di partizionamento del grafo
Dopo aver spostato le operazioni di partizionamento al di fuori dell'enclave, le prestazioni si avvicinano a quelle native.
L'articolo cita 60 lavori correlati, coprendo tecnologie SGX, applicazioni TEE, sicurezza Java, ottimizzazione della compilazione e altri campi importanti, fornendo una base teorica solida per questa ricerca.
Valutazione Complessiva: Questo è un articolo di ricerca di alta qualità che affronta il problema pratico della distribuzione delle applicazioni Java in ambienti TEE. Il design del metodo è ragionevole, l'implementazione è completa, gli esperimenti sono sufficienti e ha buon valore accademico e pratico. Sebbene ci sia ancora spazio per miglioramenti nell'overhead RMI e nell'applicabilità, fornisce importanti riferimenti per la ricerca in campi correlati.