A fines de marzo de 2018, investigadores de ESET identificaron una interesante muestra maliciosa en formato PDF que, al ser analizada, reveló que explotaba dos vulnerabilidades inéditas: una que permitía la ejecución remota de código en Adobe Reader y otra que permitía escalar privilegios en Microsoft Windows.

El uso de las vulnerabilidades de forma combinada es extremadamente poderoso, ya que permite a un atacante ejecutar código de manera arbitraria con los máximos privilegios en el dispositivo vulnerado, y con la mínima necesidad de interacción por parte del usuario. Grupos de APT utilizan frecuentemente este tipo de combinaciones para realizar sus ataques, como fue, por ejemplo, la campaña de Sednit el año pasado.

Una vez que la muestra del PDF fue descubierta, ESET contactó y trabajó de manera conjunta con el Centro de Respuesta de Seguridad de Microsoft, el equipo de investigación de APT de Windows Defender y con el equipo de Respuesta a Incidentes de Seguridad de Producto de Adobe (PSIRT) mientras solucionaban estos errores.

Los parches y advertencias tanto del equipo de Adobe como de Microsoft están disponibles aquí:

Las siguientes versiones de producto fueron las afectadas:

  • Acrobat DC (2018.011.20038 y versiones tempranas)
  • Acrobat Reader DC (2018.011.20038 y versiones tempranas)
  • Acrobat 2017 (011.30079 y versiones tempranas)
  • Acrobat Reader DC 2017 (2017.011.30079 y versiones tempranas)
  • Acrobat DC (Classic 2015) (2015.006.30417 y versiones tempranas
  • Acrobat Reader DC (Classic 2015) (2015.006.30417 y versiones tempranas)
  • 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

A continuación, en este post profundizamos en aspectos técnicos de la muestra maliciosa y de las vulnerabilidades que explota.

Introducción

PDF (Formato de Documento Portable en inglés) es un formato de archivo para documentos electrónicos que, como sucede con otros formatos de documentos populares, puede ser utilizado por atacantes para enviar un malware a la computadora de una víctima. Con el fin de ejecutar su propio código malicioso, los atacantes necesitan descubrir y explotar vulnerabilidades en programas de lectura de archivos PDF, y uno de los lectores de PDF más populares es justamente Adobe Reader.

Dicho programa implementa una función de seguridad que se conoce como sandbox, también conocida como “Protected Mode” o en español “Modo de Protección”. La descripción técnica y detallada de la implementación del sandbox fue publicada en el blog de Adobe en cuatro partes (Parte 1, Parte 2, Parte 3 y Parte 4). El sandbox hace que el proceso de aprovechamiento de una vulnerabilidad sea más difícil: incluso si se lleva a cabo la ejecución del código, para lograr comprometer la computadora que ejecuta Adobe Reader el atacante aún tendrá que anular la protección del sandbox. Generalmente, para lograr anular el sandbox es necesario aprovecharse de una vulnerabilidad en el propio sistema operativo.

Este es un caso extraño donde los atacantes fueron capaces de identificar vulnerabilidades y escribir exploits tanto para Adobe Reader como para el sistema operativo.

CVE-2018-4990 – RCE in Adobe Reader

La muestra de PDF maliciosa tiene incrustado un código en JavaScript que controla todo el proceso de explotación. Una vez que el archivo PDF es abierto, el código en JavaScript es ejecutado.

Al comienzo de la explotación, el código JavaScript comienza a manipular el objeto “Button1”. Este objeto contiene una imagen JPEG2000 especialmente diseñada que activa una vulnerabilidad del tipo double-free en Adobe Reader.

Figura 1. Código JavaScript que manipula el objeto Button1

Ese JavaScript utiliza técnicas heap-spray con el fin de corromper estructuras de datos internas. Luego de toda esta manipulación, los atacantes obtienen su principal objetivo: acceso de lectura y escritura en la memoria desde el código JavaScript.

Figura 2. Código JavaScript usado para lectura y escritura en la memoria

Mediante estas dos primitivas, el atacante localiza la dirección de memoria del plugin EScript.api, el cual funciona como el motor de Adobe JavaScript. Utilizando instrucciones en lenguaje ensamblador (ROP gadgets) de ese módulo, el JavaScript malicioso configura una cadena ROP que llevará la ejecución de la shellcode nativa.

Figura 3. JavaScript malicioso configura una cadena ROP

Como paso final, la shellcode activa un archivo PE embebido en el PDF y le pasa la ejecución a él.

CVE-2018-8120 – Escalada de privilegios en Microsoft Windows

Luego de explotar la vulnerabilidad de Adobe Reader, el atacante debe sortear el sandbox; y este será el propósito del segundo exploit del que estamos hablando en este post.

La causa principal de esta previamente desconocida vulnerabilidad se ubica en la función NtUserSetImeInfoEx del componente win32k del kernel de Windows. Específicamente, la subrutina SetImeInfoEx del NtUserSetImeInfoEx no valida un puntero de datos, permitiendo una referencia de puntero NULL.

Figura 4. Rutina SetImeInfoEx desmontada

Como se evidencia en la figura 4, la función SetImeInfoEx espera como primer argumento un puntero de un objeto WINDOWSTATION inicializado. El spklList podría ser igual a cero si el atacante crea un nuevo objeto Window Station y lo asigna al proceso actual en modo usuario. Así, al mapear la página NULL y configurar un puntero a offset 0x2C, el atacante puede aprovechar esta vulnerabilidad para escribir a una dirección arbitraria en el espacio del kernel. Es importante mencionar que, desde Windows 8, los procesos de usuario no tienen permitido mapear una página NULL.

Dado que el atacante tiene primitivas de escritura arbitraria, podría utilizar diferentes técnicas, pero en este caso utilizó una descrita por Ivanlef0u, Mateusz “j00ru” Jurczyk y Gynvael Coldwin. El atacante configura una Puerta de Llamada a Ring 0 al reescribir la Global Descriptor Table (GDT). Para lograrlo, un atacante toma la dirección de la GDT original utilizando la instrucción SGDT de lenguaje ensamblador, construye su propia tabla y luego reescribe la original utilizando la vulnerabilidad anteriormente mencionada

Luego, el exploit utiliza la instrucción CALL FAR para realizar una llamada a nivel inter-privilege.

Figura 5. Instrucciones CALL FAR

Una vez que el código es ejecutado en modo kernel, el exploit reemplaza el token del actual proceso con el token del sistema.

Conclusión

Inicialmente, los investigadores de ESET descubrieron la muestra del PDF cuando fue subida a un repositorio público de muestras maliciosas. Dicha muestra no contiene el payload final, lo que nos lleva a creer que fue descubierto durante una etapa temprana de su desarrollo. Pero incluso aunque la muestra no contenga el payload malicioso completo, los autor(es) demostraron tener un alto nivel de habilidades en el descubrimiento de vulnerabilidades y escritura de 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