Los investigadores de ESET descubrieron una vulnerabilidad de ejecución de código en WPS Office para Windows (CVE-2024-7262), que estaba siendo explotada por APT-C-60, un grupo de ciberespionaje alineado con Corea del Sur. Tras analizar la causa raíz, descubrimos posteriormente otra forma de explotar el código defectuoso (CVE-2924-7263). Tras un proceso de divulgación coordinado, ambas vulnerabilidades están ahora parcheadas; en este blogpost ofrecemos detalles técnicos.

Puntos clave del blogpost:
  • APT-C-60 aprovechó una vulnerabilidad de ejecución de código en WPS Office para Windows (CVE-2024-7262) para atacar a países de Asia oriental.
  • Se proporciona un análisis de la causa raíz de esta vulnerabilidad junto con una descripción de su utilización.
  • El estudio del exploit llevó a los investigadores de ESET al descubrimiento de una ruta alternativa para explotar la vulnerabilidad (CVE-2024-7263).

Resumen

Mientras investigábamos las actividades de APT-C-60, encontramos un extraño documento de hoja de cálculo que hacía referencia a uno de los muchos componentes descargadores del grupo. Nuestro análisis nos condujo al descubrimiento de una vulnerabilidad de ejecución de código en WPS Office para Windows que APT-C-60 está explotando para atacar a países del este asiático. La carga útil final es una puerta trasera personalizada que hemos denominado internamente SpyGlace, documentada públicamente por ThreatBook como TaskControler.dll.

Según el sitio web de WPS, este software tiene más de 500 millones de usuarios activos en todo el mundo, lo que lo convierte en un buen objetivo para llegar a un número considerable de personas. Durante nuestro proceso coordinado de divulgación de vulnerabilidades, DBAPPSecurity publicó de forma independiente un análisis de la vulnerabilidad armada y confirmó que APT-C-60 ha explotado la vulnerabilidad para distribuir malware a usuarios de China.

El documento malicioso (SHA-1: 7509B4C506C01627C1A4C396161D07277F044AC6) se presenta como una exportación MHTML del formato de hoja de cálculo XLS de uso común. Sin embargo, contiene un hipervínculo oculto especialmente diseñado para desencadenar la ejecución de una biblioteca arbitraria si se hace clic en él al utilizar la aplicación WPS Spreadsheet. El formato de archivo MHTML , poco convencional, permite descargar un archivo en cuanto se abre el documento; por lo tanto, aprovechar esta técnica al explotar la vulnerabilidad permite la ejecución remota de código. La Figura 1 muestra cómo se muestra el documento en WPS Spreadsheet: una imagen de filas y columnas que hace referencia a la solución de correo electrónico Coremail , utilizada como señuelo. La imagen oculta el hipervínculo malicioso.

Figure 1. The exploit document embeds a picture hiding the malicious hyperlink
Figura 1. El documento del exploit incrusta una imagen que oculta el hipervínculo malicioso

Siguiendo nuestra política coordinada de divulgación de vulnerabilidades, desde el momento en que el documento con el arma fue subido a VirusTotal hasta la publicación de este blogpost, se observó la siguiente cronología:

  • 2024-02-29: El documento de explotación para CVE-2024-7262 fue subido a VirusTotal.
  • 2024-03-??: Kingsoft publicó una actualización que parcheaba silenciosamente la vulnerabilidad CVE-2024-7672, de modo que el exploit del 2024-02-29 ya no funcionaba. Esto se determinó retrospectivamente, analizando todas las versiones accesibles de WPS Office entre 2024-03 y 2024-04, ya que Kingsoft no fue especialmente comunicativo a la hora de proporcionar detalles precisos de sus acciones al intentar reparar esta vulnerabilidad.
  • 2024-04-30: Analizamos el documento malicioso de VirusTotal y descubrimos que explotaba activamente CVE-2024-7262, que era una vulnerabilidad de día cero en el momento del uso inicial del documento. También descubrimos que el parche silencioso de Kingsoft sólo abordaba una parte del código defectuoso, y que el código defectuoso restante seguía siendo explotable.
  • 2024-05-25: Nos pusimos en contacto con Kingsoft para informar de nuestros hallazgos. Aunque la primera vulnerabilidad ya estaba parcheada, les preguntamos si podían crear una entrada CVE y/o una declaración pública como habían hecho para CVE-2022-24934.
  • 2024-05-30: Kingsoft reconoció las vulnerabilidades y nos dijo que nos mantendría informados.
  • 2024-06-17: Pedimos una actualización.
  • 2024-06-22: Kingsoft nos dijo que el equipo de desarrollo seguía trabajando en ello y que pretendía solucionarlo en la próxima versión.
  • 2024-07-31: Basándonos en pruebas posteriores, descubrimos que CVE-2024-7263 había sido parcheado silenciosamente. Informamos a Kingsoft de que habíamos reservado y estábamos preparando CVE-2024-7262 y CVE-2024-7263.
  • 2024-08-11: El equipo de DBAPPSecurity publicó de forma independiente sus hallazgos.
  • 2024-08-15: CVE-2024-7262 y CVE-2024-7263 fueron publicados.
  • 2024-08-16: Pedimos a Kingsoft otra actualización.
  • 2024-08-22: Kingsoft reconoce haber corregido la CVE-2024-7263 a finales de mayo, lo que contradice la afirmación de la empresa del 2024-06-22 de que su equipo de desarrollo "sigue trabajando en ello".
  • 2024-08-28: Kingsoft ha reconocido ambas vulnerabilidades y que las ha parcheado. Sin embargo, no ha expresado ningún interés en hacer pública la explotación in the wild de CVE-2024-7262, por lo que ahora publicamos este blogpost para advertir a los clientes de Kingsoft que deben actualizar urgentemente WPS Office debido a la explotación in-the-wild y la divulgación por parte de terceros de la vulnerabilidad CVE-2024-7262 y el exploit, que aumentan las posibilidades de una mayor explotación.

La vulnerabilidad CVE-2024-7262 se derivaba de la falta de desinfección de una ruta de archivo proporcionada por un atacante y de la falta de validación del complemento que se estaba cargando. Tras analizar su parche, descubrimos otra forma de explotar la vulnerabilidad aprovechando otro error lógico.

CVE-2024-7262

Esta sección describe el fallo explotado por APT-C-60 que permite la ejecución de código a través del secuestro del flujo de control del componente del plugin WPS Office promecefpluginhost.exe. También explicamos cómo se activó la vulnerabilidad y se convirtió en un arma en forma de documento de hoja de cálculo de aspecto legítimo.

Análisis de la causa raíz

Al instalar WPS Office para Windows, el paquete de software registra un controlador de protocolo personalizado llamado ksoqing que permite la ejecución de una aplicación externa cada vez que un usuario hace clic en una URL que comienza con el esquema URI ksoqing://. En el sistema operativo Windows, el registro de un manejador de protocolo personalizado se realiza en el registro. En este caso, el valor por defecto bajo la clave HKCR\ksoqing\shell\open\command dirige a Windows a ejecutar C:\Users\<USER>\AppData\Local\Kingsoft\WPS Office\<VERSION>\office6\wps.exe con el argumento /qingbangong "%1" donde %1 se sustituye por la URL completa. Para ilustrar esto, la Figura 2 muestra lo que sucede cuando un usuario hace clic en un hipervínculo utilizando el protocolo personalizado ksoqing dentro de la aplicación WPS Spreadsheet(et.exe).

Figura 2 La aplicación WPS Spreadsheet inicia wps.exe para gestionar el protocolo personalizado ksoqing

La figura 3 muestra un resumen del flujo de control del exploit para CVE-2024-7262.

Figura 3. Visión general del flujo de control del exploit

Una vez lanzado, wps.exe carga qingbangong.dll, el componente responsable de analizar y validar ciertos parámetros del hipervínculo. El enlace malicioso del archivo del exploit que hemos encontrado tiene el siguiente formato ksoqing://type=ksolaunch&cmd=<base64-encoded string>&token=<MD5 hash>&launchname=promecefpluginhost.exe. Según nuestros análisis y pruebas, esto resulta en el lanzamiento de una aplicación ya presente en el sistema (en este caso, promecefpluginhost.exe), con la línea de comandos codificada en base64 proporcionada por el atacante.

El parámetro token es el hash MD5 del valor codificado del parámetro cmd concatenado con la cadena _qingLaunchKey_ seguido del valor codificado del parámetro launchname. Este último debe ser un ejecutable ubicado en C:\Users\<USER>\AppData\Local\Kingsoft\WPS Office\<VERSION>\office6\ y firmado con un certificado válido de Kingsoft.

Tras descifrar el parámetro cmd, descubrimos que la línea de comando /qingbangong -CefParentID=1 -JSCefServicePath=<ruta de archivo codificada en base64> se pasa a promecefpluginhost.exe. Tras una inicialización, se carga la biblioteca ksojscore.dll y descodifica el parámetro JSCefServicePath. El resultado es una cadena que se pasa como parámetro al método QLibrary::load de Qt. Esta ruta de archivo está definida por el atacante, lo que significa que un atacante podría lograr la ejecución de código cargando una DLL arbitraria. La Figura 4 ilustra cómo el parámetro JSCefServicePath controlado por el atacante es procesado por ksojscore.dll.

Figura 4. El parámetro JSCefServicePath es decodificado (izquierda) y utilizado como argumento para el método QLibrary::load (derecha)

Básicamente, es posible abusar del protocolo de esquema ksoqing y crear un hipervínculo que, al hacer clic, cargue una biblioteca desde una ruta de archivo remota determinada. APT-C-60 aprovechó la vulnerabilidad para ejecutar su componente descargador de troyanos de primera etapa (SHA-1: 08906644B0EF1EE6478C45A6E0DD28533A9EFC29).

Explotación de la vulnerabilidad

Para explotar esta vulnerabilidad, un atacante necesitaría almacenar una biblioteca maliciosa en algún lugar accesible por el ordenador objetivo, ya sea en el sistema o en un recurso compartido remoto, y conocer de antemano su ruta de archivo. Los desarrolladores del exploit de esta vulnerabilidad conocían un par de trucos que les ayudaban a conseguirlo.

Aprovechamiento del formato MHTML para descargar archivos remotos

Los autores del exploit optaron por aprovechar una característica específica del formato de archivo MHTML soportado para que su componente malicioso se descargara y almacenara en el sistema de forma predecible. Este tipo concreto de archivo es un formato de exportación que ofrecen las aplicaciones Microsoft Word y Excel para permitir a los usuarios visualizar documentos en su navegador. Se trata de un archivo de varias partes que contiene archivos HTML, CSS y JavaScript que facilitan la visualización del documento. Insertando una etiqueta img dentro de uno de los archivos HTML, es posible hacer que la aplicación Hoja de Cálculo descargue un archivo remoto cuando se está cargando el documento. Por ejemplo, la Figura 5 muestra uno de nuestros archivos de prueba con la etiqueta img y su elemento src apuntando a una biblioteca almacenada localmente.

Figura 5. Inserción de la etiquetaimg

Cuando se abre el documento de hoja de cálculo con la aplicación WPS Spreadsheet et.exe, la biblioteca remota se descarga automáticamente y se almacena en el disco, como se observa utilizando ProcMon mostrado en la Figura 6.s

Figura 6. La aplicación WPS Spreadsheet descarga y almacena nuestra biblioteca en el sistema

Encontrar una ruta de archivo predecible

En cuanto al problema de la ruta de archivo predecible, encontramos que los archivos descargados se almacenan en %localappdata%\Temp\wps\INetCache\ y el nombre del archivo es el hash MD5 de la URL codificada en UTF-16LE. Por ejemplo, nuestra URL era http://localhost/Dll1.dll cuyo hash MD5 es 914CBE6372D5B7C93ADDC4FEB5E964CD. Sin embargo, al intentar establecer la variable JSCefServicePath para que apunte a dicha ruta de archivo, se concatena con el directorio raíz de la aplicación WPS Office ubicada en %localappdata%\Kingsoft\WPS Office\<VERSION>\office6\. Si no se encuentra el archivo, promecefpluginhost.exe intentará recuperar la biblioteca desde otras rutas, como se muestra en la Figura 7.

Figura 7. La ruta del archivo apuntada por JSCefServicePath se anexa al directorio raíz de WPS Office

Sin embargo, es posible utilizar una ruta relativa desde el directorio raíz de la aplicación WPS Office, como ..\.\.\.\Temp\wps\INetCache\914cbe6372d5b7c93addc4feb5e964cd.

El problema de la extensión de archivo

Hay un último obstáculo que superar. Un lector avispado probablemente se habrá dado cuenta de que la extensión .dll se añade al nombre del archivo cuando el proceso promecefpluginhost.exe intenta cargar la biblioteca. Como se ve en la Figura 6, la extensión no se añade cuando se crea el archivo descargado. Los autores del exploit, una vez más, utilizaron sus conocimientos de la API de Windows para saltarse esta restricción. Como se ha mencionado anteriormente, el método QLibrary::Load es el responsable de cargar la librería, que a su vez llama a LoadLibraryW. La documentación del parámetro lpLibFileName que se pasa a esta función indica que añadir un punto (.) impide que la función añada la extensión .dll. Por lo tanto, añadir este carácter a la ruta relativa permitiría cargar nuestra biblioteca.

Reproduciendo el exploit

Al ponerlo todo junto, para reproducir el exploit, seguimos estos pasos:

  • Alojar una librería personalizada en un servidor web.
  • Calcular el hash MD5 de la URL.
  • Construir el hipervínculo correspondiente.
  • Crear un documento de hoja de cálculo, insertar el hipervínculo y exportarlo como archivo MHTML.
  • Inserte una etiqueta img dentro del archivo exportado para que apunte a la URL.

La figura 8 ilustra cómo construir el hipervínculo.

Figura 8. Creación del hipervínculo

Tras abrir el documento, un solo clic en el hipervínculo activó la vulnerabilidad y se cargó nuestra biblioteca personalizada, como se muestra en la Figura 9 y, con más detalle, en la Figura 10.

Figura 9. Nuestra biblioteca personalizada se escribe en el disco y se carga
Figura 10. Detalle de la pila de llamadas de nuestra librería siendo cargada

Cuando se carga, nuestra biblioteca personalizada escribe el PID, la presencia de privilegios de administrador y la ruta de archivo del proceso de alojamiento en un archivo de registro. Reprodujimos el exploit para diferentes versiones de WPS Office para Windows como se ilustra en la Figura 11.

Figura 11. Listado de archivos de registro para versiones vulnerables de WPS Office

Dado que se trata de una vulnerabilidad de un solo clic, los desarrolladores del exploit incrustaron una imagen de las filas y columnas de la hoja de cálculo dentro de la misma para engañar y convencer al usuario de que el documento es una hoja de cálculo normal. El hipervínculo malicioso estaba vinculado a la imagen, de modo que al hacer clic en una celda de la imagen se activaba el exploit, tal y como se muestra en la Figura 12.

Figura 12. Hoja de cálculo engañosa que incrusta una imagen de filas y columnas normales

Otro dato interesante sobre esta vulnerabilidad es que también puede activarse mediante un solo clic en el panel de vista previa del Explorador de Windows, lo que la hace aún más peligrosa.

Versiones afectadas

Las versiones afectadas de WPS Office para Windows van desde la 12.2.0.13110, liberada alrededor de agosto de 2023 hasta la liberación del parche en marzo de 2024 con la versión 12.1.0.16412. El documento armado se subió por primera vez a VirusTotal en febrero; algunos componentes maliciosos, dada su marca de tiempo PE, se crearon en febrero.

CVE-2024-7263

Esta sección proporciona un análisis del parche para CVE-2024-7262 y el descubrimiento resultante de otra vulnerabilidad de ejecución de código a través del secuestro del flujo de control del mismo componente del plugin WPS Office: promecefpluginhost.exe.

Análisis de la causa raíz

Durante el proceso de averiguar qué versiones estaban afectadas por la primera vulnerabilidad, analizamos el parche que se introdujo silenciosamente en la versión 12.1.0.16412 (publicada alrededor de marzo de 2024) para mitigar CVE-2024-7262. Esencialmente, se pusieron comprobaciones adicionales dentro de los componentes promecefpluginhost.exe y ksojscore.dll para verificar la variable JSCefServicePath controlada por el atacante. Sin embargo, una variable similar no estaba cubierta por el parche: CefPluginPathU8.

La primera comprobación tiene lugar cuando promecefpluginhost.exe itera sobre sus diferentes argumentos de línea de comandos. Si un parámetro tiene el mismo nombre (comparacion sensible a mayúsculas y minúsculas), que una de las variables mencionadas, el parámetro se descarta como se muestra en la Figura 13.

Figura 13. Código comprobando y descartando parámetros pasados

Después de eso, recupera la ruta de archivo esperada para JSCefServicePath donde se supone que está almacenado jscefservice.dll. La ruta real debería ser %LOCALAPPDATA%\Kingsoft\WPS Office\<VERSION>\office6\addons\kcef\, como se ve en la Figura 14. Lo mismo se hace para CefPluginPathU8 para el que la ruta real debería apuntar a %LOCALAPPDATA%\Kingsoft\WPS Office\<VERSION>\office6\addons\cef\.

Figura 14. Código recuperando la librería correcta a cargar

A continuación, promecefpluginhost.exe carga la biblioteca ksojscore.dll y se llama a su exportación CefRenderEntryPoint con la línea de comandos reconstruida. Se comprueban ambas variables de nombre, pero esta vez la comparación no tiene en cuenta mayúsculas y minúsculas (véase la línea 2 de la Figura 15).

Figura 15. Se toma la primera ocurrencia insensible a mayúsculas/minúsculas de la variable

Aquí radica el primer fallo lógico. Si al menos una letra de las variables nombradas se cambia por su homóloga en mayúsculas o minúsculas, la primera comprobación (insensible a mayúsculas y minúsculas) no dará como resultado el rechazo del parámetro especificado por el atacante, y la línea de comandos tendrá el siguiente aspecto (por ejemplo):

-JSCEfServicePath=<ATTACKER_CONTROLLED><OTHER_PARAMETERS> -JSCefServicePath=<REAL_PATH> (observe el cambio de mayúsculas y minúsculas en el primer nombre de variable para la primera letra E).

Cuando tal línea de comando se pasa a ksojscore.dll, sólo tomará la primera ocurrencia de la variable y la variable controlada por el atacante siempre se coloca antes de las válidas.

Sin embargo, antes de cargar la biblioteca dada por la ruta de archivo JSCefServicePath, se introdujo una segunda comprobación. Se llama a la función krt::ksafe::KProcess::verifyZhuHaiKingsoftCertSigner para comprobar el certificado de la biblioteca y asegurarse de que se trata de una biblioteca perteneciente a Kingsoft, como se muestra en la figura 16. Así, un atacante no puede cargar ninguna biblioteca arbitraria.

Figura 16. Comprobación de la firma de la biblioteca que se está cargando.

Sin embargo, la variable CefPluginPathU8 no se comprueba correctamente. Aquí radica el segundo fallo. Tras verificar la ruta de archivo JSCefServicePath, se carga la biblioteca jscefservice.dll y se llama a LoadLibraryExW con la ruta de archivo proporcionada por CefPluginPathU8 concatenada con la cadena \libcef .dll sin comprobar su firma.

Si se cambia al menos una letra de la variable CefPluginPathU8, jscefservice.dll intentará cargar la librería libcef.dll almacenada bajo la ruta de archivo controlada por el atacante dada por la variable, como se observa en la Figura 17.

Figura 17. La librería jscefservice.dll carga la librería apuntada por la ruta definida por el atacante sin comprobar su firma

Explotación de la vulnerabilidad

La principal limitación de esta vulnerabilidad es la cadena libcef.dll que se añade a la ruta del archivo. En el momento de escribir este blogpost, no hemos encontrado una forma de descargar un archivo y elegir su nombre. Sin embargo, en una red local, alojar una biblioteca en un recurso compartido y hacer que la variable CefPluginPathU8 apunte a ella funciona porque LoadLibraryExW permite especificar rutas de red. La captura de pantalla mostrada en la Figura 18 ilustra cómo el flujo de control de promecefpluginhost.exe (versión 12.2.0.16909 publicada a finales de abril de 2024) fue secuestrado utilizando una ruta de red.

Figura 18. Vista de la pila de Procmon mostrando la carga de nuestra biblioteca personalizada

Versiones afectadas

Las versiones afectadas de WPS Office para Windows van desde la 12.2.0.13110, lanzada alrededor de agosto de 2023, hasta el lanzamiento del parche a finales de mayo de 2024 con la versión 12.2.0.17119.

Conclusión

Dado que WPS Office es una suite de software distribuida principalmente en Asia, APT-C-60 demostró hasta qué punto está decidida a comprometer objetivos en países del este asiático. Independientemente de si el grupo desarrolló o compró el exploit para CVE-2024-7262, no cabe duda de que requirió cierta investigación sobre el funcionamiento interno de la aplicación, así como conocimientos sobre cómo se comporta el proceso de carga de Windows. El exploit es astuto, ya que es lo suficientemente engañoso como para engañar a cualquier usuario para que haga clic en una hoja de cálculo de aspecto legítimo, a la vez que muy eficaz y fiable. La elección del formato de archivo MHTML permitió a los atacantes convertir una vulnerabilidad de ejecución de código en una remota.

Además, nuestro descubrimiento de CVE-2024-7263 subraya la importancia de un cuidadoso proceso de verificación de parches y de asegurarse de que el problema principal se ha abordado en su totalidad.

Recomendamos encarecidamente a los usuarios de WPS Office para Windows que actualicen su software a la última versión.

Para cualquier consulta sobre nuestra investigación publicada en WeLiveSecurity, por favor contáctenos en threatintel@eset.com.
ESET Research ofrece informes privados de inteligencia APT y fuentes de datos. Para cualquier consulta sobre este servicio, visite la página de ESET Threat Intelligence.

IoCs

Puede encontrar una lista completa de indicadores de compromiso (IoCs) en nuestro repositorio GitHub.

Archivos

SHA-1

Filename

Detection

Description

7509B4C506C01627C1A4
C396161D07277F044AC6

input.htm

HTML/Agent.HQ

MHTML-formatted WPS Spreadsheet exploit – CVE‑2024‑7262.

08906644B0EF1EE6478C
45A6E0DD28533A9EFC29

WPS_TEST_DLL.dll

Win32/TrojanDownloader.
Agent.HRP

Downloader component.

Red

IP

Domain

Hosting provider

First seen

Details

162.222.214[.]48

131.153.206[.]231

rammenale[.]com

PhoenixNAP

2024⁠-⁠03⁠-⁠08

C&C server hosting next stages.

TÉCNICAS MITRE ATT&CK

Esta tabla se ha elaborado utilizando la versión 15 del marco MITRE ATT&CK.

Tactic

ID

Name

Description

Resource Development

T1583.001

Domains

APT-C-60 acquired a domain name for its C&C server.

T1583.004

Server

APT-C-60 acquired a server for its C&C.

T1608.001

Upload Malware

APT-C-60’s next stages were uploaded to its C&C server.

T1587.004

Exploits

APT-C-60 developed or purchased an exploit for CVE-2024-7262.

Execution

T1203

Exploitation for Client Execution

APT-C-60 exploited CVE-2024-7262 to achieve execution.

T1204.001

Malicious Link

The exploit used by APT-C-60 requires a click on a hyperlink.