Segurando Aplicações Java na Nuvem com TEEs
Uma nova ferramenta melhora a segurança dos apps Java em ambientes de nuvem não confiáveis.
― 9 min ler
Índice
- Desafios na Partição de Aplicativos
- Uma Nova Ferramenta para Aplicativos Java
- Visão Geral dos Ambientes de Execução Confiáveis
- Programação em Ambientes Confiáveis
- Comparação com Abordagens Existentes
- Abordagem Proposta
- Avaliação de Desempenho
- Considerações de Segurança de Enclave
- Visão Geral do Fluxo de Trabalho
- Coleta de Lixo em Aplicativos Particionados
- Rodando Imagens Nativas Não Particionadas
- Implementação do Protótipo
- Configuração de Avaliação Experimental
- Métricas de Desempenho
- Conclusão
- Direções Futuras
- Fonte original
- Ligações de referência
Java é uma linguagem de programação bem popular, especialmente em computação na nuvem. Mas quando os aplicativos Java rodam em ambientes de nuvem não confiáveis, eles podem ser atacados. Ambientes de execução confiáveis (TEEs) como o Intel SGX ajudam a proteger códigos e dados sensíveis guardando eles em áreas seguras da memória que softwares não confiáveis não conseguem acessar. Pra usar TEEs de boa, os desenvolvedores precisam separar seus aplicativos em partes confiáveis, que são seguras, e partes não confiáveis, que não são. Essa separação pode reduzir os riscos de segurança, mas também traz desafios.
Desafios na Partição de Aplicativos
- Comunicação Entre Partes: Quando um aplicativo é dividido em partes confiáveis e não confiáveis, elas precisam se comunicar. Isso pode ser complicado porque operam em áreas diferentes da memória.
- Consistência da Coleta de Lixo: Em linguagens como Java, que gerenciam memória, é importante garantir que quando algo é removido da memória em uma parte, não deixe referências pendentes na outra parte.
Uma Nova Ferramenta para Aplicativos Java
Pra resolver esses desafios, uma nova ferramenta foi criada. Essa ferramenta ajuda os desenvolvedores a anotar seus aplicativos Java pra separar facilmente as partes confiáveis das não confiáveis. Também permite que essas partes se comuniquem e cuida do gerenciamento de memória entre os dois ambientes.
Como a Ferramenta Funciona
- Anotações: Os desenvolvedores podem marcar classes como confiáveis ou não confiáveis. Isso deixa claro quais partes precisam ser seguras.
- Comunicação de Objetos: A ferramenta oferece um jeito de objetos no ambiente confiável chamarem métodos em objetos no ambiente não confiável e vice-versa.
- Coleta de Lixo: Introduz um método pra garantir que quando um objeto é removido da memória em um ambiente, o objeto correspondente no outro ambiente também é tratado direitinho.
Detalhes da Implementação
A ferramenta foi construída usando o GraalVM, que permite que aplicativos Java sejam compilados em executáveis nativos independentes. Isso significa que esses aplicativos podem rodar sem precisar de uma Máquina Virtual Java (JVM), resultando em tempos de inicialização mais rápidos e uso de memória mais eficiente.
Avaliação de Desempenho
A ferramenta foi testada usando vários benchmarks, incluindo aplicativos do mundo real como PalDB e GraphChi. Os resultados mostram melhorias significativas no desempenho quando os aplicativos são devidamente particionados. Ao mover partes não confiáveis para fora do ambiente seguro, os aplicativos rodam mais eficientemente na nuvem.
Visão Geral dos Ambientes de Execução Confiáveis
O Intel SGX é um conjunto de instruções que permite que aplicativos criem áreas seguras na memória chamadas enclaves. Dentro dessas enclaves, códigos e dados podem ser protegidos de acessos não confiáveis.
Como Funciona o Intel SGX
- Cache de Páginas de Enclave (EPC): Essa é a área de memória onde códigos e dados do enclave são armazenados. Ela é criptografada e só pode ser descriptografada quando necessário.
- Gerenciamento de Memória: O kernel Linux SGX pode trocar páginas entre o EPC e a memória regular, permitindo mais processamento de dados, mas com um custo de desempenho.
Programação em Ambientes Confiáveis
Trabalhar com Intel SGX pode ser complicado porque requer habilidades de programação de baixo nível e um planejamento cuidadoso pra minimizar o código que precisa ser confiável.
Soluções Atuais
Algumas soluções existentes permitem que os desenvolvedores executem aplicativos inteiros, junto com a JVM, dentro de enclaves. No entanto, isso traz muita complexidade e pode aumentar os riscos de segurança devido ao grande volume de código que deve ser confiável.
Limitações das Soluções Atuais
- Grandes Bases de Código Confiáveis: Rodar aplicativos completos em enclaves significa incluir muitas linhas de código, o que vai contra as melhores práticas de segurança e deixa vulnerabilidades mais prováveis.
- Esforços Manuais: Os desenvolvedores muitas vezes precisam gastar um tempo considerável e esforço pra particionar corretamente os aplicativos, tornando isso um processo trabalhoso.
Comparação com Abordagens Existentes
Existem diferentes métodos pra particionar aplicativos para enclaves:
- Executando Aplicativos Completos: Alguns sistemas rodam aplicativos legados inteiros em enclaves, mas essa abordagem tende a ser complexa e pesadona.
- Soluções Específicas de Framework: Outros sistemas focam em frameworks específicos e exigem particionamento personalizado, o que limita a flexibilidade.
- Particionamento de Código Nativo: Existem técnicas pra particionar automaticamente aplicativos escritos em C ou C++, mas essas não funcionam bem com linguagens gerenciadas como Java.
Abordagem Proposta
A nova ferramenta simplifica o processo, permitindo que os desenvolvedores annotem classes inteiras como confiáveis ou não confiáveis, facilitando a identificação do que precisa de proteção. Ao focar nas fronteiras das classes, ela reduz a necessidade de análises complexas de fluxo de dados.
Mecanismo de Comunicação de Objetos
A ferramenta cria classes proxy pra cada classe confiável e não confiável, permitindo que os dois ambientes se comuniquem sem problemas. Quando um método em uma classe proxy é chamado, ele cuida da transição pro ambiente correto.
Gerenciamento da Coleta de Lixo
Pra gerenciar a coleta de lixo entre ambientes, a ferramenta usa referências fracas. Isso garante que quando um objeto é removido em um ambiente, o objeto correspondente no outro ambiente também seja tratado corretamente.
Avaliação de Desempenho
Foram feitos testes pra medir o desempenho dos aplicativos usando a nova ferramenta comparado com métodos tradicionais. Os resultados indicam que aplicativos particionados se saem melhor do que aqueles rodando completamente dentro de enclaves.
Resultados de Benchmarking
- Aplicativos Sintéticos: Vários aplicativos Java foram testados sob diferentes configurações de particionamento. Foi descoberto que aumentar o número de classes não confiáveis fora do enclave melhorou o tempo de execução geral.
- Aplicativos do Mundo Real: Aplicativos como PalDB e GraphChi mostraram ganhos consideráveis de desempenho quando devidamente particionados, graças à redução da sobrecarga de transições de enclave.
Considerações de Segurança de Enclave
A ferramenta parte do princípio que o código do enclave e o pacote da CPU são confiáveis. O código fonte deve ser limpo, pois qualquer código malicioso introduzido em tempo de execução pode comprometer a segurança.
Modelo de Ameaça
A ferramenta proposta protege contra vários ataques assegurando que só códigos seguros sejam permitidos dentro do enclave. Isso ajuda a proteger dados sensíveis e manter a integridade do aplicativo.
Visão Geral do Fluxo de Trabalho
O fluxo de trabalho pra usar a ferramenta envolve várias etapas chave:
- Anotação do Código: Os desenvolvedores anotam seu código pra especificar quais classes são confiáveis ou não confiáveis.
- Transformação de Bytecode: A ferramenta processa o código anotado pra criar classes separadas pros ambientes confiáveis e não confiáveis.
- Geração de Imagem Nativa: Ela compila as classes em imagens nativas separadas que podem ser vinculadas com as bibliotecas de runtime do SGX, criando o executável final.
- Execução do Aplicativo: O aplicativo roda com componentes confiáveis e não confiáveis, permitindo que eles se comuniquem conforme necessário.
Coleta de Lixo em Aplicativos Particionados
A coleta de lixo em aplicativos particionados requer um manejo cuidadoso. Quando um objeto é removido da memória, é crucial que o objeto correspondente no outro ambiente também seja gerido corretamente.
Mecanismo de Ajudante de Coleta de Lixo
Um ajudante de coleta de lixo é usado pra rastrear as relações entre objetos proxy e espelho. Quando um proxy é coletado, o objeto espelho correspondente também é marcado pra coleta.
Rodando Imagens Nativas Não Particionadas
Em alguns casos, os desenvolvedores podem preferir rodar o aplicativo inteiro como uma única imagem nativa. Essa opção permite configurações mais simples, mas pode sacrificar alguns benefícios de segurança.
Implementação do Protótipo
O protótipo da ferramenta foi implementado e inclui vários componentes, como o transformador de bytecode e o módulo SGX. Esses elementos se juntam pra criar um sistema abrangente que melhora a segurança e o desempenho dos aplicativos Java.
Configuração de Avaliação Experimental
A avaliação foi conduzida em um servidor poderoso equipado com hardware avançado, rodando uma versão do Linux otimizada pro SGX. As especificações do servidor permitiram testes extensivos em vários aplicativos Java.
Métricas de Desempenho
Diferentes métricas de desempenho foram consideradas durante a avaliação, incluindo tempos de criação de proxy, invocações de objetos e tempos de coleta de lixo. Cada métrica forneceu insights sobre as eficiências ganhas com o uso da nova ferramenta.
Conclusão
A nova ferramenta pra particionar aplicativos Java em partes confiáveis e não confiáveis oferece uma solução prática pra proteger aplicativos rodando em ambientes de nuvem. Ela simplifica o processo pros desenvolvedores e melhora a segurança enquanto aumenta o desempenho. Trabalhos futuros vão focar em otimizar a comunicação entre os dois ambientes e expandir as capacidades do sistema.
Direções Futuras
Planos pra futuras melhorias incluem aprimorar os mecanismos de comunicação entre objetos confiáveis e não confiáveis pra reduzir o tempo de transição e expandir o suporte pra aplicativos mais sofisticados dentro da estrutura de enclave.
Título: Montsalvat: Intel SGX Shielding for GraalVM Native Images
Resumo: 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
Autores: Peterson Yuhala, Jämes Ménétrey, Pascal Felber, Valerio Schiavoni, Alain Tchana, Gaël Thomas, Hugo Guiroux, Jean-Pierre Lozi
Última atualização: 2023-12-20 00:00:00
Idioma: English
Fonte URL: https://arxiv.org/abs/2305.00766
Fonte PDF: https://arxiv.org/pdf/2305.00766
Licença: https://creativecommons.org/licenses/by/4.0/
Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.
Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.