
Análise técnica da CVE-2017-0037, uma vulnerabilidade de corrupção de memória do navegador Microsoft que permite execução remota de código por meio de confusão de tipo no tratamento de CSS/JS, com detalhes de exploração PoC e estratégias de mitigação.
CVE-2017-0037 (Vulnerabilidade de Corrupção de Memória do Navegador Microsoft)
Este documento é sobre CVE-2017-0037 - Vulnerabilidade de Corrupção de Memória do Navegador Microsoft. Primeiro, será introduzido o que é uma Execução Remota de Código (RCE) e, em seguida, serão abordados alguns detalhes técnicos.
O que é Execução Remota de Código?
Um ciberataque no qual um atacante pode executar comandos remotamente em outro computador é conhecido como execução remota de código. As execuções remotas de código (RCEs) são mais comumente causadas por software malicioso baixado pelo hospedeiro e podem ocorrer independentemente da localização do sistema.
Para alcançar RCE, os seguintes métodos podem ser utilizados:
Ataques de Injeção: Aqui, o atacante fornece uma entrada errada com a intenção de que uma parte dela seja processada como parte do comando.
Ataques de Desserialização: O programa de desserialização pode ler uma entrada de usuário cuidadosamente formulada dentro dos dados serializados como código executável.
Escrita Fora dos Limites: Um atacante pode ser capaz de construir uma entrada que ultrapasse o buffer alocado se a alocação de memória for mal feita. Como o código executável também é armazenado na memória, o programa pode ser capaz de executar dados fornecidos pelo usuário se estes forem escritos no local correto.
Ataque de Confusão de Tipo: Existe uma ameaça de confusão de tipo quando um código-fonte não toma nenhuma ação para verificar a autenticidade de uma entidade que lhe é fornecida. Como a confusão de tipo permite que um hacker introduza código que pode executar instruções aleatórias apenas causando uma discrepância nos tipos de objeto, isso é arriscado.
Execução de um Ataque RCE
Uma sequência de ataque RCE é simples de executar. Primeiro, o ator da ameaça procura na internet por vulnerabilidades comuns que possam ser exploradas num ataque eficaz. Após identificar uma vulnerabilidade específica, o hacker usa o exploit para obter acesso. Agora que ganhou acesso, pode usar o script malicioso para atingir seus objetivos, que incluem exfiltração de dados, lavagem de dinheiro, vigilância abrangente e interrupção de serviço.
A linguagem da aplicação alvo é frequentemente usada para injetar código. A linguagem é então executada pelo processador do lado do servidor. Python, Java, Perl, Ruby e PHP são linguagens de programação comuns. A injeção de código é comum em plataformas que analisam imediatamente entradas não verificadas. Aplicações web públicas são, de fato, um grande foco para hackers.
Scripts maliciosos são tipicamente executados por scripts bash. Um script bash é um documento de texto que contém comandos que normalmente seriam digitados no prompt de comando. Scripts bash permitem que os comandos incluídos funcionem corretamente. É costume anexar um ".sh" a eles, embora não seja necessário. Após o empacotamento, o hacker coloca o código numa aplicação vulnerável, que então o executa. A aplicação também pode dar uma decisão ao kernel para executá-lo.
Métricas do Ataque
A imagem a seguir foca nas métricas de pontuação base do CVE-2017-0037.

A pontuação de classificação CVSS aqui é 8.1 (alta).
Vetor de Ataque - O componente vulnerável aqui está ligado à pilha de rede, e o alcance de potenciais hackers inclui desde as outras alternativas declaradas até toda a Internet.
A Complexidade do Ataque desta vulnerabilidade é alta, ou seja, o sucesso de um ataque depende de circunstâncias fora do controle do atacante. Portanto, um ataque não pode ser concluído à vontade, mas requer que o atacante dispenda um nível significativo de trabalho no planejamento ou implementação contra o elemento suscetível antes que possa ser esperado que seja eficaz.
O valor de Confidencialidade aqui é alto, o que significa uma perda completa de confidencialidade, resultando no atacante tendo acesso a todos os recursos dentro do componente danificado.
Integridade é alta, o que significa uma perda severa de integridade e proteção.
Disponibilidade é alta, o que significa uma perda completa de disponibilidade, permitindo ao atacante proibir completamente o acesso aos recursos do componente afetado.
Detalhes do Ataque
A vulnerabilidade CVE-2017-0037 era uma falha de confusão de tipo que residia no Microsoft Edge e no Internet Explorer 10 e 11. Ela permitia que atacantes executassem código remotamente na máquina alvo quando o usuário visitava um site malicioso.
A falha foi apontada pelo pesquisador do Google Ivan Frantic e os detalhes da vulnerabilidade foram divulgados pelo Google, pois a Microsoft não conseguiu corrigi-la dentro do seu período de divulgação de 90 dias.

O prova de conceito (PoC) do exploit publicado pelo pesquisador revela que ele pode travar o Edge e o IE, permitindo que um atacante execute código remotamente e obtenha privilégios de administrador do sistema comprometido. Ele também confirmou que o ataque funcionou na versão de 64 bits do Internet Explorer no Windows Server 2012 R2 e afetou o IE 11 de 32 bits, bem como o Microsoft Edge.
A confusão de tipo está na função
Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement em mshtml.dll. Ao executar código arbitrário remotamente, através de vetores que envolvem uma sequência de tokens Cascading Style Sheets (CSS) e código JavaScript manipulado que opera num elemento TH, o ataque pode ocorrer.
O PoC por Ivan Fratric do Google Project Zero

Conforme declarado pelo pesquisador Ivan Frantic, o PoC trava em
MSHTML!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement ao ler do endereço 0000007800000070.


Ao analisar o código ao redor do ponto da falha, pode-se observar que no endereço de memória 00007ffe`8f330a51, o conteúdo do registrador rbp é lido no registrador rcx. Em seguida, a chamada para
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable atribui valor a rax (é um registrador designado para armazenar valores de retorno de funções).
Embora rcx devesse apontar para outro tipo de objeto, no PoC mostrado acima, ele aponta para um array de inteiros de 32 bits alocado em Array<Math::SLayoutMeasure>::Create. Os deslocamentos das colunas da tabela são armazenados nesse array e um atacante pode obter controle sobre ele. A falha ocorre em 00007ffe`8f330a59 porque rax aponta para memória não inicializada. rax armazena o valor de retorno da função
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable que não é um endereço de memória inicializado. O atacante pode apontar rax para algum local de memória que possa controlar. O atacante pode modificar propriedades da tabela, como espaçamento de borda e a largura do primeiro elemento TH, para obter controle sobre rax.

Se o atacante conseguir obter controle sobre rax na linha 00007ffe`8f330a59, a função
MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable é chamada novamente na linha 00007ffe`8f330a5d 743d com os mesmos argumentos e um salto para um endereço mais alto. Depois disso, através de uma série de diferenças que começam a partir de rax, um ponteiro de função poderia ser obtido e armazenado em rdi. Se o atacante conseguisse passar uma verificação CFG nesse ponteiro de função, o ponteiro de função controlado pelo atacante seria chamado na linha 00007ffe`8f330a80.
Possível Correção do Bug
Conforme sugerido por Ivan Fratric, primeiro, a razão por trás da ocorrência da confusão de tipo deve ser detectada. De acordo com sua hipótese, dois tipos de colunas existem no DOM: colunas de tabela HTML e colunas CSS, e o IE/Edge estava se confundindo entre as duas. Então, se uma verificação de tipo fosse adicionada em algum lugar na função vulnerável, poderia ter resolvido.
Links Úteis
Impactos de um Ataque RCE
Acesso Inicial: Atacantes podem usar isso para obter controle sobre um dispositivo e instalar malware ou realizar outros objetivos.
Divulgação de Informações: Ataques RCE ajudam a instalar malware de roubo de informações ou executar comandos que coletam e roubam dados do dispositivo afetado.
Negação de Serviço: Uma falha de RCE permite que hackers executem código na máquina que hospeda a aplicação afetada e, assim, interrompam sua operação e de outros programas no sistema.
Criptomineração: Malware de criptomineração é frequentemente implantado e executado em dispositivos suscetíveis.
Ransomware: Ransomware é um tipo de software que impede um usuário de acessar seus arquivos a menos que pague dinheiro.
Formas de Mitigar Ataques RCE
O controle de estouro de buffer pode ser usado para mitigar ataques RCE.
Listas de controle de acesso são úteis para limitar privilégios de usuário e, portanto, limitar as capacidades de um atacante se ele conseguir controlar a conta de um usuário.
O tráfego de rede deve ser monitorado quanto a conteúdo potencialmente malicioso, além de monitorar endpoints.
Usar sanitização de entrada, que é o processo de limpar e higienizar a entrada do usuário para protegê-la de ser usada para explorar falhas de segurança.
Referências