Vulnerabilidade zero day no Windows explorada em ataques dirigidos

Investigadores da ESET descobriram um exploit zero day (CVE-2019-1132) que se aproveita de uma vulnerabilidade de elevação de privilégios localmente no Windows

Em junho de 2019, investigadores da ESET identificaram um exploit de uma vulnerabilidade zero-day que estava a ser utilizado em ataques altamente direcionados na Europa de Leste.

O exploit abusa de uma vulnerabilidade de elevação de privilégios localmente no Microsoft Windows, mais especificamente algo relacionado com o indicador NULL no componente win32.sys. Uma vez descoberto e analisado o exploit, foi reportada a descoberta ao Microsoft Security Response Center, que rapidamente reparou a vulnerabilidade e lançou um patch.

A vulnerabilidade afeta as seguintes versões do Windows:

  • Windows 7 for 32-bit Systems Service Pack 1
  • Windows 7 for x64-based Systems Service Pack 1
  • Windows Server 2008 for 32-bit Systems Service Pack 2
  • Windows Server 2008 for Itanium-Based Systems Service Pack 2
  • Windows Server 2008 for x64-based Systems Service Pack 2
  • Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1
  • Windows Server 2008 R2 for x64-based Systems Service Pack 1

Este artigo foca-se nos detalhes técnicos da vulnerabilidade e sua exploração. Noutro artigo que será publicado nos próximos dias, iremos destacar o malware e suas implicações.

Exploração

À semelhança do que acontece com outras vulnerabilidades no Microsoft Windows win32k.sys reveladas nos últimos anos, este exploit utiliza objetos do menu pop-up. Por exemplo, os exploit de elevação de privilégios localmente do grupo Sednit que analisámos em 2017 utilizaram objetos do tipo menu e técnicas muito similares a este exploit.

Este exploit cria duas janelas: uma para a primeira etapa e outra para a segunda etapa da exploração. Para a primeira janela, cria objetos de menu pop-up e adiciona elementos de menu utilizando as funções CreatePopMenu e AppendMenu. Adicionalmente, o exploit configura os hooks WH_CALLWNDPROC e EVENT_SYSTEM_MENUPOPUPSTART.

Asism, o exploit exibe um menu utilizando a função TrackPopupMenu. Neste ponto o código associado a EVENT_SYSTEM_MENUPOPUPSTART é executado. Este código tenta abrir como o primeiro item disponível no menu através do envio da sequência de mensagens MN_SELECTITEM, MN_SELECTFIRSTVALIDITEM e MN_OPENHIERARCHY para o menu.

O passo seguinte é muito importante para desencadear esta vulnerabilidade. O exploit deverá capturar o momento em que o menu inicial é criado e que o submenu está prestes a ser criado. Para tal, o exploit conta com código que manipula a mensagem WM_NCCREATE no hook WH_CALLWNDPROC. Quando o código do exploit deteta que o sistema está neste estado, envia a mensagem MN_CANCELMENUS (0x1E6) ao primeiro menu, o qual cancela esse menu. No entanto, o seu sub-menu ainda deve ser criado.

Agora, se verificarmos o objeto sub-menu no modo kernel veremos que tagPOPUPMENU‑>ppopupmenuRoot é igual a 0. Este estado permite a um hacker utilizar este elemento nesta estrutura kernel como uma referência do indicador NULL. O exploit atribui uma nova página no endereço 0x0 e este endereço será tratado como um objeto tagPOPUPMENU (ver Figura 1) pelo kernel.

Figura 1. Estrutura kernel do tagPOPUPMENU

Neste ponto, os hackers utilizam a segunda janela. O objetivo principal do exploit é dar a volta ao bit bServerSideWindowProc na estrutura tagWND da segunda janela. Isto está na origem da execução de um procedimento WndProc em modo kernel.

Para levar adiante esta ação, os hackers filtram o endereço de memória do kernel da estrutura tagWND da segunda janela ao chamar a função HMValidateHandle não exportada na biblioteca user32.dll. Assim, o exploit cria um falso objeto tagPOPUPMENU na página NULL e envia uma mensagem MN_BUTTONDOWN a um sub-menu.

Depois disso, o kernel eventualmente executará a função win32k!xxxMNOpenHierarchy.

Figura 2. Código da função win32k!xxxMNOpenHierarchy

Esta função passa um objeto criado da página NULL para win32k!HMAssignmentLock. O bit bServerSideWindowProc está configurado no interior da função win32k!HMDestroyUnlockedObject, a qual está localizada a poucas chamadas mais profundas no interior do win32k!HMAssignmentLock.

Figura 3. Código da função win32k!HMDestroyUnlockedObject

Está tudo feito! Agora o exploit pode enviar uma mensagem específica à segunda janela com o objetivo de executar WndProc em modo kernel.

Na etapa final, o exploit substitui o token do processo atual pelo token do sistema.

O patch publicado, entre outras coisas, acrescenta a revisão de um indicador NULL na função win32k!xxxMNOpenHierarchy.

Figura 4. Diferença de código entre as duas versões do win32k.sys – original (esquerda) e já reparada com patch (direita)

Conclusão

O exploit funciona apenas em antigas versões do Windows, já que desde que foi lançado o Windows 8 um processo de utilizador não tem permissões para mapear a página NULL. A Microsoft implementou esta mitigação no Windows 7 para sistemas baseados em x64.

Todos aqueles que continuam a utilizar o Windows 7 Service Pack 1 em sistemas de 32 bit deveriam considerar a atualização para um sistema operativo mais recente, dado que a extensão do suporte para o Service Pack 1 do Windows 7 vai terminar a 14 de janeiro de 2020. Isto quer dizer que os utilizadores do Windows 7 passarão a não receber atualizações de segurança críticas, pelo que vulnerabilidades como estas permanecerão sem patch para sempre.

Indicadores de Compromisso (IoCs)

1 COMENTÁRIO

DEIXE UMA RESPOSTA

Please enter your comment!
Please enter your name here

six − 1 =