banner
Lar / Notícias / Brincando de Esconder
Notícias

Brincando de Esconder

Nov 03, 2023Nov 03, 2023

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)