SGX Malvar: como os vilões exploram a nova tecnologia da Intel para propósitos errados

Como você sabe, o código executado no enclave é seriamente limitado em sua funcionalidade. Ele não pode fazer chamadas do sistema. Não pode executar operações de E / S. Ele não sabe o endereço base do segmento de código do host. Ele não pode jmp e chamar o código do host. Ele não tem idéia da estrutura do espaço de endereço que guia o aplicativo host (por exemplo, quais páginas são promovidas ou que tipo de dados são colocados nessas páginas). Ele não pode pedir ao sistema operacional para anexar um pedaço de memória ao aplicativo host (por exemplo, via / proc / pid / maps). Tentativas ingênuas de ler uma área de memória arbitrária cega do aplicativo host - para não mencionar tentativas de gravação - mais cedo ou mais tarde (antes a primeira) levarão à conclusão forçada do programa de enclave. Isso acontece sempre que a área do espaço de endereço virtual solicitada pelo enclave estiver inacessível ao aplicativo host.


Com realidades tão duras, o criador de vírus poderá usar os enclaves da SGX para realizar seus objetivos maliciosos?


- Hackear endereços de sondagem para a possibilidade de lê-los
- Hackear endereços de sondagem para gravabilidade
- Corte para redirecionar o fluxo de controle
- O que dá ao vilão os três hacks listados acima
- Como o vilão usa esses hacks para criar ranzomvari



Com base no que foi dito acima, é geralmente aceito que o enclave é capaz apenas de atender ao aplicativo host e que o enclave não pode tomar sua própria iniciativa, inclusive maliciosa. Isso significa que os enclaves não representam um valor prático para os criadores de vírus. Essa suposição precipitada é uma das razões pelas quais a proteção SGX é assimétrica: o código do aplicativo host não pode acessar a memória do enclave, enquanto o código do enclave pode ler e gravar em qualquer endereço de memória do aplicativo host.


Portanto, se o código malicioso do enclave conseguir fazer chamadas arbitrárias do sistema em nome do aplicativo host, executar código arbitrário em seu nome, varrer a memória do aplicativo host e encontrar as cadeias de ROP adequadas para abuso, ele poderá assumir o controle completo sobre aplicativo host no modo furtivo. Ele pode não apenas roubar e criptografar arquivos do usuário, mas também agir em nome do usuário. Por exemplo, envie e-mails de phishing em seu nome ou realize ataques de negação de serviço. Ao mesmo tempo, você não tem medo nem dos mecanismos de proteção mais modernos, como canários de pilha e higienização de endereços.


Mostraremos alguns hacks pelos quais os vilões superam as limitações descritas acima, na tentativa de tirar proveito dos benefícios do SGX para seus propósitos maliciosos: conduzir ataques ROP. Executar código arbitrário disfarçado de processo de serragem de host (semelhante ao processo oco, que é freqüentemente usado por malware) ou mascarar um malware já preparado (para salvá-lo da perseguição por antivírus e outros mecanismos de proteção).



Hackear endereços de sondagem para a possibilidade de lê-los


Como o enclave não sabe quais intervalos do espaço de endereço virtual estão disponíveis para o aplicativo host, e porque quando você tenta ler um endereço inacessível, o enclave é encerrado à força, o vilão é confrontado com a tarefa de encontrar uma maneira de verificar o espaço de endereço com segurança. Encontre uma maneira de mapear os endereços virtuais disponíveis. O vilão resolve esse problema usando mal a tecnologia TSX da Intel. Ele usa um dos efeitos colaterais do TSX: se a função de acesso à memória for colocada em uma transação TSX, as exceções decorrentes do acesso a endereços inválidos serão suprimidas pelo TSX antes de chegar ao sistema operacional. Quando você tenta acessar um endereço de memória inválido, apenas a transação atual é interrompida, e não o programa inteiro do enclave. T.O. O TSX permite que o enclave acesse com segurança qualquer endereço da transação - sem o risco de colapso.


Se o endereço especificado estiver disponível para o aplicativo host, a transação TSX geralmente será bem-sucedida. Em casos raros, pode falhar devido a influências externas, como interrupções (por exemplo, interrupções do planejador), exclusão do cache ou alterações simultâneas das células da memória por vários processos. Nesses casos raros, o TSX retorna um código de erro indicando que a falha ocorreu é temporária. Nesses casos, você só precisa reiniciar a transação.


Se o endereço especificado não estiver disponível para o aplicativo host, o TSX suprime a exceção (o sistema operacional não é notificado) e cancela a transação. Um código de erro é retornado ao código do enclave para que ele possa responder ao fato de que a transação foi cancelada. Esses códigos de erro indicam que o endereço em questão não está disponível para o aplicativo host.




Essa manipulação do TSX a partir do interior do enclave tem um bom recurso para o vilão: como no momento da execução do código do enclave, a maioria dos contadores de desempenho de hardware não é atualizada, é impossível rastrear as transações TSX realizadas dentro do enclave usando-os. Assim, as fraudes maliciosas com o TSX'om permanecem completamente invisíveis para o sistema operacional.


Além disso, como o hack descrito acima não depende de nenhuma chamada do sistema, não pode ser detectado ou impedido simplesmente bloqueando as chamadas do sistema; o que geralmente dá um resultado positivo na luta contra a "caça aos ovos".


O vilão usa o hack descrito acima para procurar por gadgets no código do aplicativo host que são adequados para formar uma cadeia ROP. No entanto, ele não precisa investigar cada endereço. Basta examinar um endereço de cada página do espaço de endereço virtual. A detecção de todos os 16 gigabytes de memória leva cerca de 45 minutos (no Intel i7-6700K). Como resultado, o vilão obtém uma lista de páginas executáveis ​​adequadas para a construção de uma cadeia ROP.



Hackear endereços de sondagem para gravabilidade


Para implementar uma versão em enclave de um ataque ROP, o vilão precisa da capacidade de procurar por partes não utilizadas graváveis ​​da memória do aplicativo host. O vilão usa essas seções da memória para injetar um quadro de pilha falso e injetar uma carga útil (código de shell). A conclusão é que um enclave mal-intencionado não pode exigir que o aplicativo host aloque memória para si mesmo, mas pode usar para outros fins a memória alocada pelo aplicativo host. A menos, é claro, que ele consiga encontrar esses sites sem desmoronar o enclave.


O vilão realiza essa busca explorando outro efeito colateral do TSX. Primeiro, ele, como no caso anterior, investiga o endereço quanto à sua existência e depois verifica se a página correspondente a esse endereço está acessível para gravação. Para fazer isso, o vilão usa o seguinte hack: coloca a função de gravação na transação TSX e, após ser concluída, mas antes de ser concluída, interrompe forçosamente a transação (abortamento explícito).


Olhando para o código de retorno de uma transação TSX, o vilão percebe se é gravável. Se for "abortamento explícito", o vilão percebe que a gravação seria bem-sucedida se a trouxesse ao fim. Se a página for somente leitura, a transação falhará com um erro diferente de "abortamento explícito".



Essa manipulação do TSX tem outro recurso agradável para o vilão (além da incapacidade de rastrear os contadores de desempenho de hardware): como todos os comandos de gravação na memória são gravados apenas se a transação for bem-sucedida, forçar a conclusão da transação garante que a célula de memória sondada permaneça inalterada.



Corte de redirecionamento de fluxo de controle


Ao realizar um ataque ROP de um enclave - diferentemente dos ataques ROP tradicionais - o vilão pode obter o controle do registro RIP sem explorar nenhum bug no programa atacado (excesso de buffer ou algo parecido). O vilão pode substituir diretamente o valor do registro RIP armazenado na pilha. Em particular, ele pode substituir o valor desse registro por sua cadeia ROP.


No entanto, se a cadeia ROP for longa, a reescrita de uma grande parte da pilha de aplicativos host pode causar corrupção de dados e comportamento inesperado do programa. Um vilão que procura conduzir seu ataque furtivamente, esse estado de coisas não se adequa. Portanto, ele cria um quadro de pilha temporário falso para si e armazena sua cadeia ROP nele. Um quadro de pilha falso é colocado em um local arbitrário na memória gravável, para que a pilha verdadeira permaneça intocada.




O que dá ao vilão os três hacks listados acima


(1) Primeiro, um enclave malicioso, através de um hack para investigar endereços quanto à possibilidade de lê-los , pesquisa no aplicativo host por gadgets ROP que podem ser abusados.



(2) Em seguida, usando um hack para investigar os endereços quanto à capacidade de gravação , o enclave malicioso identifica nas áreas de memória do aplicativo host adequadas para injetar a carga útil.



(3) Em seguida, o enclave cria uma cadeia ROP a partir dos dispositivos encontrados na etapa (1) e injeta essa cadeia na pilha de aplicativos host.



(4) Finalmente, quando o aplicativo host encontra a cadeia ROP criada na etapa anterior, a carga maliciosa começa a ser executada, com os privilégios do aplicativo host e a capacidade de fazer chamadas do sistema.



Como o vilão usa esses hacks para criar ranzomvari


Depois que o aplicativo host transfere o controle para o enclave através de qualquer um dos ECALLs (sem suspeitar que esse enclave seja malicioso), o enclave mal-intencionado procura espaço livre na memória do aplicativo host para injeção de código (nesses locais, são necessárias as seqüências de células que preenchido com zeros). Em seguida, usando um hack para verificar a legibilidade dos endereços , o enclave pesquisa as páginas executáveis ​​no aplicativo host e gera uma cadeia ROP que cria um novo arquivo chamado "RANSOM" no diretório atual (em um ataque real, o enclave criptografa os arquivos de usuário existentes) e exibe uma mensagem de solicitação de resgate. Ao mesmo tempo, o aplicativo host acredita ingenuamente que o enclave simplesmente adiciona dois números. Como ele aparece no código?


Para facilitar a percepção, apresentamos alguns mnemônicos através de define:



Preservamos os valores iniciais dos registros RSP e RBP para restaurar a operação normal do aplicativo host após executar a carga útil:



Estamos procurando por um quadro de pilha adequado (consulte o código na seção "hack para redirecionar o fluxo de controle").


Encontre gadgets ROP adequados:



Encontre um local para injetar a carga útil:



Construindo uma cadeia ROP:



É assim que a tecnologia SGX da Intel, projetada para suportar programas maliciosos, é explorada por vilões para atingir objetivos opostos.

Source: https://habr.com/ru/post/pt462547/


All Articles