No final de março de 2018, pesquisadores da ESET identificaram uma interessante amostra maliciosa em formato PDF que, ao ser analisada, revelou a exploração de duas novas vulnerabilidades: uma que permitia a execução remota de código no Adobe Reader e outra que possibilitava escalar privilégios no Microsoft Windows.

O uso de vulnerabilidades de forma combinada é extremamente potente, pois permite que um cibercriminoso possa executar um código arbitrário com privilégios máximos no dispositivo vulnerado, e com a mínima interação por parte do usuário. Grupos de APT costumam usar tais combinações para realizar seus ataques, como foi, por exemplo, a campanha do Sednit no ano passado.

Ao descobrir a amostra do PDF maliciosa, a ESET entrou em contato e trabalhou em conjunto com o Centro de Resposta de Segurança da Microsoft, a equipe de pesquisa de Ameaça Persistente Avançada (APT) do Windows Defender e com a equipe de Resposta a Incidentes de Segurança de Produto da Adobe (PSIRT) enquanto resolviam esses erros.

Os patches e avisos da equipe da Adobe e da Microsoft estão disponíveis aqui:

As seguintes versões do produto foram afetadas:

  • Acrobat DC (2018.011.20038 e versões anteriores)
  • Acrobat Reader DC (2018.011.20038 e versões anteriores)
  • Acrobat 2017 (011.30079 e versões anteriores)
  • Acrobat Reader DC 2017 (2017.011.30079 e versões anteriores)
  • Acrobat DC (Classic 2015) (2015.006.30417 e versões anteriores)
  • Acrobat Reader DC (Classic 2015) (2015.006.30417 e versões anteriores)
  • Windows 7 para sistemas Service Pack 1 de 32 bits
  • Windows 7 para sistemas 32-bit Service Pack 1
  • Windows 7 para sistemas x64 Service Pack 1
  • Windows Server 2008 para sistemas 32-bit Service Pack 2
  • Windows Server 2008 para sistemas Itanium Service Pack 2
  • Windows Server 2008 para sistemas x64 Service Pack 2
  • Windows Server 2008 R2 para sistemas Itanium Service Pack 1
  • Windows Server 2008 R2 para sistemas x64 Service Pack 1

Em seguida, neste post, nos aprofundaremos nos aspectos técnicos da amostra maliciosa e nas vulnerabilidades exploradas.

Introdução

PDF (Portable Document Format, em inglês) é um formato de arquivo para documentos eletrônicos que, como com outros formatos populares de documentos, pode ser usado por cibercriminosos para enviar malware ao computador da vítima. Para executar seu próprio código malicioso, os cibercriminosos precisam descobrir e explorar vulnerabilidades em programas de leitura de PDF, e um dos leitores mais populares é exatamente o Adobe Reader.

Esse programa implementa uma função de segurança que é conhecida como sandbox, também chamada de “Protected Mode”. A descrição técnica e detalhada da implementação do sandbox foi publicada no blog da Adobe em quatro partes (Parte 1, Parte 2, Parte 3 e Parte 4). O sandbox dificulta o processo de exploração de uma vulnerabilidade: mesmo que a execução do código seja realizada, para conseguir comprometer o computador que executa o Adobe Reader, o cibercriminoso precisa cancelar a proteção do sandbox. Geralmente, para anular o sandbox, é necessário explorar uma vulnerabilidade no próprio sistema operacional.

Este é um caso estranho em que os cibercriminosos conseguiram identificar vulnerabilidades e escrever exploits tanto para o Adobe Reader como para o sistema operacional.

CVE-2018-4990 – RCE no Adobe Reader

A amostra maliciosa do PDF incorporou um código em JavaScript que controla todo o processo de exploração. Depois que o arquivo PDF é aberto, o código JavaScript é executado.

No início da exploração, o código JavaScript começa a manipular o objeto "Button1". Este objeto contém uma imagem JPEG2000 especialmente projetada para ativar uma dupla vulnerabilidade no Adobe Reader.

Imagem 1. Código JavaScript que manipula o objeto Button1

Esse JavaScript usa técnicas heap-spray para corromper estruturas de dados internas. Depois de toda essa manipulação, os cibercriminosos conseguem obter seu objetivo principal: acesso a leitura e gravação na memória a partir do código JavaScript.

Imagem 2. Código JavaScript usado para leitura e escritura na memória

Usando essas duas vulnerabilidades, o cibercriminoso localiza o endereço de memória do plug-in EScript.api, que funciona como o mecanismo da Adobe JavaScript. Usando instruções em linguagem assembly (gadgets ROP) desse módulo, o JavaScript malicioso configura uma cadeia ROP que leva à execução do shellcode nativo.

Imagem 3. JavaScript malicioso configura uma cadeia ROP

Como etapa final, o shellcode ativa um arquivo PE incorporado no PDF e passa a execução para ele.

CVE-2018-8120 - Escalada de privilégios no Microsoft Windows

Depois de explorar a vulnerabilidade do Adobe Reader, o cibercriminoso tenta evitar o sandbox - este será o propósito do segundo exploit de que estamos falando neste post.

A principal causa dessa vulnerabilidade anteriormente desconhecida está localizada na função NtUserSetImeInfoEx do componente win32k do kernel do Windows. Especificamente, a sub-rotina SetImeInfoEx do NtUserSetImeInfoEx não valida um ponteiro de dados, permitindo uma referência de ponteiro NULL.

Imagem 4. Rotina SetImeInfoEx

Conforme mostrado na Imagem 4, a função SetImeInfoEx aguarda como primeiro argumento um ponteiro para um objeto WINDOWSTATION inicializado. O spklList pode ser igual a zero se o cibercriminoso criar um novo objeto Window Station e atribuí-lo ao processo atual no modo usuário. Assim, mapeando a página NULL e definindo um ponteiro para compensar 0x2C, o cibercriminoso pode explorar essa vulnerabilidade para gravar em um endereço arbitrário no espaço do kernel. É importante mencionar que no Windows 8 os processos do usuário não têm permissão para mapear uma página NULL.

Como o cibercriminoso tem um primitivo de escrita arbitrária, ele pode usar técnicas diferentes, mas neste caso ele usou uma descrita por Ivanlef0u, Mateusz “j00ru” Jurczyk y Gynvael Coldwin. O cibercriminoso configura uma porta de chamada para o Ring 0, ao reescrever a Global Descriptor Table (GDT). Para conseguir isso, um cibercriminoso obtém o endereço da GDT original usando a instrução SGDT para linguagem assembly, constrói sua própria tabela e, em seguida, reescreve a original usando a vulnerabilidade mencionada anteriormente.

Em seguida, o exploit usa a instrução CALL FAR para fazer uma chamada entre privilégios.

Imagem 5. Instruções CALL FAR

Depois que o código é executado no modo kernel, o exploit substitui o token do processo atual pelo token do sistema.

Conclusão

Inicialmente, os pesquisadores da ESET descobriram a amostra do PDF ao ser carregada em um repositório público de amostras maliciosas. Essa amostra não contém a payload final, o que nos leva a acreditar que ela foi descoberta durante um estágio inicial de seu desenvolvimento. Mas mesmo que a amostra não contenha a payload maliciosa completa, o (s)  criador (es) demonstraram um alto nível de habilidades ao descobrir vulnerabilidades e executar exploits.

Indicators of Compromise (IoC)

ESET detection names
JS/Exploit.Pdfka.QNV trojan
Win32/Exploit.CVE-2018-8120.A trojan
SHA-1 hashes
C82CFEAD292EECA601D3CF82C8C5340CB579D1C6
0D3F335CCCA4575593054446F5F219EBA6CD93FE