Reguladores nucleares investigam dois incidentes recentes na usina de Peach Bottom
Mar 07, 2023Como manter o andar de cima fresco no verão: de acordo com os profissionais de HVAC
Mar 09, 2023Síntese de grafeno multicamada de área seletiva usando sonda nanoaquecedora resistiva
Mar 11, 2023Opinião
Mar 13, 2023Movimento Misfit do Fossil: Terminando o suporte e criando e
Mar 15, 2023Brincando de Esconder
21 de outubro de 2022
Na Parte 1, explicamos o que são enclaves Intel SGX e como eles beneficiam os autores de ransomware. Na Parte 2, exploramos uma implementação hipotética passo a passo e descrevemos as limitações desse método.
Assista a esta demonstração de ataque ao vivo para ver como a plataforma CrowdStrike Falcon® e a equipe gerenciada de detecção e resposta CrowdStrike Falcon Complete™ protegem contra ransomware.
Nesta seção, criamos um exemplo passo a passo de um ransomware que usa enclaves para criptografia assimétrica. O ransomware é dividido em duas partes:
Extratos de código apresentados aqui virão do núcleo regular do aplicativo (main.c) ou do enclave (enclave.c). O enclave irá gerar um par de chaves RSA, selar a chave privada e criptografar os dados da vítima dentro do enclave usando a API Intel SGX. Vamos dar uma olhada em como isso é feito e como o núcleo do aplicativo interage com o enclave.
Primeiro, o núcleo regular do aplicativo inicializa os recursos necessários para a execução do ransomware, incluindo a criação e configuração do enclave. Para carregar o enclave, usamos a função sgx_create_enclave(), de sgx_urts.lib.1 O protótipo da função é:
Os argumentos desta função representam alguns dos atributos do enclave, como o modo de compilação ou informações sobre carregamentos anteriores. Por exemplo, sgx_launch_token_t é uma estrutura opaca que representa o token de inicialização do enclave. As informações do token contêm informações sobre o enclave ao longo de sua execução e podem ser salvas para facilitar futuros carregamentos do enclave.
Figura 1. Extrato do código criando o enclave (Clique para ampliar)
Depois que o enclave é carregado, o núcleo regular do aplicativo pode executar uma ECALL para iniciar o processo de geração de chave.
Dentro do enclave, a geração de chaves é baseada no Intel SGX SDK chamado sgx_tcrypto.lib. Esta é uma API documentada que pode ser chamada diretamente do enclave. Nos bastidores, a API é baseada em outras bibliotecas criptográficas desenvolvidas pela Intel: Integrated Performance Primitives (Intel® IPP) e a biblioteca criptográfica Intel® Software Guard Extensions SSL (Intel® SGX SSL),2 ambas baseadas em OpenSSL .
A primeira etapa desse processo é gerar componentes RSA para as chaves privada e pública do enclave usando a função sgx_create_rsa_key_pair(). Esta é uma chamada preliminar, realizada antes das chamadas de funções que criam chaves, usadas para gerar componentes que atendam ao tamanho do módulo de chave RSA predefinido e ao expoente público.
Figura 2. Extrato do código gerando os componentes das chaves RSA (Clique para ampliar)
A partir desses componentes chave RSA, usamos a função sgx_create_rsa_pub1_key() para gerar a chave pública RSA que será usada para criptografar os arquivos da vítima.
Figura 3. Extrato do código criando a chave pública RSA (Clique para ampliar)
O próximo passo lógico normalmente seria gerar a chave privada, como fizemos com a chave pública. Neste caso, no entanto, ainda não precisamos da chave privada, pois a chave privada será usada apenas para fins de decifração, caso a vítima cumpra as exigências dos autores do ransomware. Neste momento, só precisamos armazenar e ocultar com segurança os componentes da chave privada para permitir a recuperação futura. Para isso, usamos o método de vedação de dados para garantir que a chave privada possa ser gravada e armazenada criptografada em disco, sem nunca aparecer como texto não criptografado na memória regular do sistema operacional.
Uma maneira de fazer isso é gerando a chave privada e selando-a diretamente no disco, mas não faremos isso. Considere o protótipo de função do Intel SGX SDK3 que gera a chave privada mostrada abaixo.
Observe que o valor da chave privada é gravado em um void**, mas sob o capô, a estrutura real usada é uma estrutura EVP_PKEY, uma estrutura complexa que se origina da biblioteca OpenSSL.
Figura 4. Extrato do código definindo a estrutura EVP_PKEY, da biblioteca openssl (Clique para ampliar)