Un análisis de un malware para macOS previamente desconocido que utiliza el almacenamiento en la nube para exfiltrar documentos, pulsaciones del teclado y capturas de pantalla de Mac realizadas en los equipos comprometidos.

En abril de 2022, investigadores de ESET descubrieron un backdoor para macOS previamente desconocido que espía a los usuarios de los equipos Mac comprometidos y que utiliza servicios públicos de almacenamiento en la nube para comunicarse con sus operadores. Tras el análisis, lo llamamos CloudMensis. Sus capacidades muestran claramente que la intención de sus operadores es recopilar información del equipo víctima extrayendo documentos, registrando pulsaciones del teclado y realizando capturas de pantalla.

Apple ha reconocido recientemente la presencia de software espía dirigido a los usuarios de sus productos y recientemente anunció el lanzamiento del modo Lockdown para iOS, iPadOS y macOS, una herramienta que desactiva aquellas funciones comúnmente explotadas para obtener la ejecución de código y desplegar malware. Y si bien no es el malware más avanzado, CloudMensis puede ser una de las razones por las que algunos usuarios querrían habilitar este mecanismo de defensa adicional. Deshabilitar los principales puntos de entrada, a expensas de una experiencia de usuario menos fluida, parece una forma razonable de reducir la superficie de ataque.

Esta publicación describimos los diferentes componentes del spyware CloudMensis y su funcionamiento interno.

CloudMensis: descripción general

CloudMensis es un malware para macOS desarrollado en Objective-C. Las muestras que analizamos están compiladas para las arquitecturas de Intel y Apple. Todavía no sabemos cómo las víctimas logran ser comprometidas con este malware. Sin embargo, entendemos que cuando se obtienen privilegios administrativos y de ejecución de código, lo que sigue es un proceso de dos etapas (ver Figura 1), donde la primera etapa descarga y ejecuta la segunda etapa con más funciones. Curiosamente, el malware de la primera etapa recupera el de la siguiente etapa de un proveedor de almacenamiento en la nube. No utiliza un enlace de acceso público; incluye un token de acceso para descargar el archivo MyExecute de la unidad. En la muestra que analizamos, se utilizó pCloud para almacenar y entregar la segunda etapa.

Figura 1. Esquema de cómo CloudMensis utiliza los servicios de almacenamiento en la nube

Los artefactos que quedan en ambos componentes sugieren que sus autores los denominan execute y Client, siendo el primero el downloader y el segundo el agente espía. Esos nombres se encuentran tanto en las rutas absolutas de los objetos como en las firmas ad hoc.

Figura 2. Strings parciales y firma de código del componente downloader, execute

Figura 3. Strings parciales y firma de código del componente agente espía, Client

Las Figuras 2 y 3 también muestran lo que parecen ser nombres internos de los componentes de este malware: el proyecto parece llamarse BaD y curiosamente reside en un subdirectorio llamado LeonWork. Además, v29 sugiere que esta muestra es la versión 29, o quizás 2.9. Este número de versión también se encuentra en el nombre del archivo de configuración.

El componente downloader

El malware de primera etapa descarga e instala el malware de segunda etapa como un daemon del sistema. Como se ve en la Figura 4, se escriben dos archivos en el disco:

  1. /Library/WebServer/share/httpd/manual/WindowServer: el ejecutable de segunda etapa Mach-O, obtenido de la unidad pCloud
  2. /Library/LaunchDaemons/.com.apple.WindowServer.plist: un archivo de lista de propiedades para hacer que el malware persista como un daemon de todo el sistema

En esta etapa, los atacantes ya deben tener privilegios administrativos porque ambos directorios solo pueden ser modificados por el usuario root.

Figura  4. Downloader de CloudMensis instalando la segunda etapa

Limpieza de la escena después del uso de un exploit de Safari

El componente de la primera etapa incluye un método interesante llamado removeRegistration que parece estar presente para hacer la limpieza después la explotación de una vulnerabilidad en Safari. Un primer vistazo a este método es un poco desconcertante si se tiene en cuenta que las cosas que hace parecen no estar relacionadas: elimina un archivo llamado root de la partición del sistema EFI (Figura 5), ​​envía un mensaje XPC a speechsíntesisd (Figura 6) y elimina archivos del directorio de caché de Safari. Inicialmente pensamos que el propósito de removeRegistration fue desinstalar versiones anteriores de CloudMensis, pero investigaciones posteriores demostraron que estos archivos se utilizan para iniciar exploits de sandbox y de esalación de privilegios desde Safari mientras abusa de cuatro vulnerabilidades. Estas vulnerabilidades fueron descubiertas y bien documentadas por Niklas Baumstark y Samuel Groß en 2017. Las cuatro fueron parcheadas por Apple el mismo año, por lo que esta técnica de distribución probablemente ya no se utilice para instalar CloudMensis. Esto sugiere que CloudMensis puede haber existido durante muchos años.

Figura 5. Código descompilado que muestra CloudMensis montando la partición EFI

Figura 6. Envío de un mensaje de XPC a speechsynthesisd

El componente espía

La segunda etapa de CloudMensis es un componente mucho más grande, empaquetado con múltiples funciones para recopilar información de la Mac comprometida. La intención de los atacantes aquí es claramente exfiltrar documentos, capturas de pantalla, archivos adjuntos de correo electrónico y otros datos confidenciales.

CloudMensis utiliza el almacenamiento en la nube tanto para recibir comandos de sus operadores como para exfiltrar archivos. Admite tres proveedores diferentes: pCloud, Yandex Disk y Dropbox. La configuración incluida en la muestra analizada contiene tokens de autenticación para pCloud y Yandex Disk.

Configuración

Una de las primeras cosas que hace el agente espía CloudMensis es cargar su configuración. Esta es una estructura binaria que tiene una longitud de 14.972 bytes. Se almacena en el disco en ~/Library/Preferences/com.apple.iTunesInfo29.plist, cifrada mediante un XOR simple con una clave generada (consulte la sección Cifrado personalizado).

Si este archivo aún no existe, la configuración se completa con valores predeterminados hardcodeados en la muestra de malware. Además, también intenta importar valores de lo que parecen ser versiones anteriores de la configuración de CloudMensis en:

  • ~/Library/Preferences/com.apple.iTunesInfo28.plist
  • ~/Library/Preferences/com.apple.iTunesInfo.plist

La configuración contiene lo siguiente:

  • Qué proveedores de almacenamiento en la nube usar y los tokens de autenticación
  • Un identificador de bot generado aleatoriamente
  • Información sobre la Mac
  • Rutas a varios directorios utilizados por CloudMensis
  • Extensiones de archivos que son de interés para los operadores

La lista predeterminada de extensiones de archivo encontradas en la muestra analizada, ilustrada en la Figura 7, muestra que los operadores están interesados ​​en documentos, hojas de cálculo, grabaciones de audio, imágenes y mensajes de correo electrónico de los equipos Mac víctimas. El formato menos común es quizás el de las grabaciones de audio que usan el códec Adaptive Multi-Rate (usando las extensiones .amr y .3ga), que está diseñado específicamente para la compresión de voz. Otras extensiones de archivo interesantes en esta lista son los archivos .hwp y .hwpx , que son documentos para Hangul Office (ahora Hancom Office), un procesador de textos popular entre los hablantes de coreano.

Figura 7. Extensiones de archivo encontradas en la configuración predeterminada de CloudMensis

Cifrado personalizado

CloudMensis implementa su propia función de cifrado que sus autores llaman FlowEncrypt. La Figura 8 muestra la función desensamblada. Toma un solo byte como semilla y genera el resto de la clave realizando una serie de operaciones en el byte generado más recientemente. La entrada es XOReada con esta cadena de claves. En última instancia, el valor del byte actual será el mismo que uno de sus valores anteriores, por lo que la cadena de claves se repetirá. Esto significa que, aunque el cifrado parezca complejo, se puede simplificar a un XOR con una clave estática (excepto por los primeros bytes de la cadena de claves, antes de que comience a repetirse).

Figura 8. Método FlowEncrypt desensamblado

“Bypasseando” TCC

Desde el lanzamiento de macOS Mojave (10.14) en 2018, el acceso a algunas entradas confidenciales, como capturas de pantalla, cámaras, micrófonos y eventos de teclado, están protegidos por un sistema llamado TCC, que significa Transparencia, Consentimiento y Control. Cuando una aplicación intenta acceder a ciertas funciones, macOS pregunta al usuario si la solicitud de la aplicación es legítima, quién puede conceder o denegar el acceso. En última instancia, las reglas de TCC se guardan en una base de datos en la Mac. Esta base de datos está protegida por la Protección de Integridad del Sistema (SIP) para garantizar que solo el daemon TCC pueda realizar cambios.

CloudMensis utiliza dos técnicas para “bypassear” TCC (evitando así solicitar autorización al usuario), obteniendo de esta manera acceso a la pantalla, pudiendo escanear la unidad de almacenamiento extraíble en busca de documentos de interés y pudiendo registrar eventos del teclado. Si SIP está deshabilitado, la base de datos de TCC (TCC.db) ya no está protegida contra la manipulación. Por lo tanto, en este caso, CloudMensis agrega entradas para otorgarse permisos antes de usar entradas confidenciales. Si SIP está habilitado pero la Mac ejecuta cualquier versión de macOS Catalina anterior a la 10.15.6, CloudMensis explotará una vulnerabilidad para hacer que el daemon TCC (tccd) cargue una base de datos en la que CloudMensis pueda escribir. Esta vulnerabilidad se conoce como CVE-2020–9934 y fue reportada y descrita por Matt Shockley en 2020.

El exploit primero crea una nueva base de datos en ~/Library/Application Support/com.apple.spotlight/Library/Application Support/com.apple.TCC/ a menos que ya haya sido creada, como se muestra en la Figura 9.

Figura 9. Verificando si el archivo de base de datos TCC legítimo ya existe

Luego, establece la variable de entorno HOME en ~/Library/Application Support/com.apple.spotlight usando launchctl setenv, para que el daemon TCC cargue la base de datos alternativa en lugar de la legítima. La Figura 10 muestra cómo se hace utilizando NSTask.

Figura 10. Alterando la variable de entorno HOME utilizada por launched  con launchctl y reiniciando tccd

Comunicación con el servidor de C&C

Para comunicarse de un lado a otro con sus operadores, la configuración del malware CloudMensis contiene tokens de autenticación para múltiples proveedores de servicios en la nube. Cada entrada en la configuración se utiliza para un propósito diferente. Todos ellos pueden utilizar cualquier proveedor compatible con CloudMensis. En la muestra analizada, se admiten Dropbox, pCloud y Yandex Disk.

El primer almacenamiento, llamado CloudCmd por los autores del malware según el nombre de la variable global, se utiliza para almacenar los comandos transmitidos a los bots y sus resultados. Otro, al que llaman CloudData, se usa para exfiltrar información de la Mac comprometida. Un tercero, al que llaman CloudShell, se usa para almacenar la salida del comando de shell. Sin embargo, este último usa la misma configuración que CloudCmd.

Antes de intentar obtener archivos remotos, CloudMensis primero carga un informe cifrado con RSA sobre la Mac comprometida en /January/ en CloudCmd. Este informe incluye secretos compartidos, como un identificador de bot y una contraseña para descifrar los datos que se extraerán.

Luego, para recibir comandos, CloudMensis trae archivos bajo el siguiente directorio en el almacenamiento de CloudCmd: /Febrary/<bot_id>/May/. Cada archivo se descarga, descifra y envía al método AnalizeCMDFileName. Observe cómo los autores del malware escriben incorrectamente tanto February como Analyze.

El almacenamiento de CloudData se utiliza para cargar archivos más grandes solicitados por los operadores. Antes de la carga, la mayoría de los archivos son añadidos a un archivo ZIP protegido con contraseña. Generada cuando CloudMensis se inicia por primera vez, la contraseña se mantiene en la configuración y se transfiere a los operadores en el primer reporte.

Comandos

En la muestra de CloudMensis analizada hay 39 comandos implementados. Se identifican con un número entre 49 y 93 inclusive, excluyendo 57, 78, 87 y de 90 a 92. Algunos comandos requieren argumentos adicionales.

Algunas de las acciones que estos comandos permiten realizar a los operadores son:

  • Cambiar los valores en la configuración de CloudMensis: proveedores de almacenamiento en la nube y tokens de autenticación, extensiones de archivo que se consideren interesantes, frecuencia de sondeo del almacenamiento en la nube, etc.
  • Crear lista procesos en ejecución
  • Iniciar una captura de pantalla
  • Crear lista de mensajes de correo electrónico y archivos adjuntos
  • Enumerar archivos de la unidad almacenamiento extraíble
  • Ejecutar comandos de shell y cargar la salida al almacenamiento en la nube
  • Descargar y ejecutar archivos arbitrarios

La Figura 11 muestra el comando con el identificador 84, que enumera todos los trabajos cargados por launchd y carga los resultados ahora o más tarde, según el valor de su argumento.

Figura 11. Comando 84 ejecuta launchctl list para trabajos de launchd

La Figura 12 muestra un ejemplo más complejo. El comando con el identificador 60 se usa para iniciar una captura de pantalla. Si el primer argumento es 1, el segundo argumento es una URL que lleva a un archivo que será descargado, almacenado y ejecutado por startScreenCapture. Este archivo ejecutable externo se guardará como windowserver en la carpeta Library del contenedor del sandbox de FaceTime. Si el primer argumento es cero, lanzará el archivo existente previamente droppeado. No pudimos encontrar muestras de este agente de captura de pantalla.

Figura 12. Comando 60: Comienza una captura de pantalla

Es interesante notar que los archivos de lista de propiedades para hacer que launchd inicie nuevos procesos, como com.apple.windowServer.plist, no son persistentes: se eliminan del disco después de que launchd los carga.

Metadatos del almacenamiento en la nube

Los metadatos de los servicios de almacenamientos en la nube utilizados por CloudMensis revelan detalles interesantes sobre la operación. La Figura 13 muestra la vista de árbol del almacenamiento utilizado por CloudMensis para enviar el informe inicial y transmitir comandos a los bots a partir del 22 de abril de 2022.

Figura 13. Vista de árbol con la lista de directorios obtenida del almacenamiento CloudCmd

Estos metadatos dieron un panorama parcial de la operación y ayudaron a trazar una línea de tiempo. Primero, las cuentas de pCloud fueron creadas el 19 de enero de 2022. La lista de directorios del 22 de abril muestra que 51 identificadores de bot únicos crearon subdirectorios en el almacenamiento en la nube para recibir comandos. Debido a que estos directorios se crean cuando el malware se lanza por primera vez, podemos usar su fecha de creación para determinar la fecha del compromiso inicial, como se ve en la Figura 14.

Figura 14. Fechas de creación del subdirectorio bajo /Febrary (sic)

Este gráfico muestra un pico de compromisos a principios de marzo de 2022, siendo el primero el 4 de febrero . El último pico puede explicarse por los sandboxes ejecutando CloudMensis, una vez que se subió a VirusTotal.

Conclusión

CloudMensis es un malware dirigido a usuarios de Mac, pero su distribución muy limitada sugiere que se usa como parte de una operación dirigida a blancos específicos. Por lo que hemos visto, los operadores detrás de esta familia de malware implementan CloudMensis en objetivos puntuales que son de su interés. El uso de vulnerabilidades para evitar las mitigaciones de macOS muestra que los operadores de este malware intentan activamente maximizar el éxito de sus operaciones de espionaje. Al mismo tiempo, durante nuestra investigación no se descubrió el uso de vulnerabilidades zero-day por parte de este grupo. Por lo tanto, se recomienda tener actualizada la Mac.

Todavía no sabemos cómo los actores maliciosos están distribuyendo inicialmente CloudMensis y quiénes son los objetivos. La calidad general del código y la falta de ofuscación muestran que los autores pueden no estar muy familiarizados con el desarrollo de Mac y no son tan avanzados. No obstante, se invirtieron muchos recursos para hacer de CloudMensis una poderosa herramienta de espionaje y una amenaza para los objetivos potenciales.

Indicadores de Compromiso

Archivos

SHA-1 Filename Description ESET detection name
D7BF702F56CA53140F4F03B590E9AFCBC83809DB mdworker3 Downloader (execute) OSX/CloudMensis.A
0AA94D8DF1840D734F25426926E529588502BC08 WindowServer, myexe Spy agent (Client) OSX/CloudMensis.A
C3E48C2A2D43C752121E55B909FC705FE4FDAEF6 WindowServer, MyExecute Spy agent (Client) OSX/CloudMensis.A

Claves públicas

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsGRYSEVvwmfBFNBjOz+Q
pax5rzWf/LT/yFUQA1zrA1njjyIHrzphgc9tgGHs/7tsWp8e5dLkAYsVGhWAPsjy
1gx0drbdMjlTbBYTyEg5Pgy/5MsENDdnsCRWr23ZaOELvHHVV8CMC8Fu4Wbaz80L
Ghg8isVPEHC8H/yGtjHPYFVe6lwVr/MXoKcpx13S1K8nmDQNAhMpT1aLaG/6Qijh
W4P/RFQq+Fdia3fFehPg5DtYD90rS3sdFKmj9N6MO0/WAVdZzGuEXD53LHz9eZwR
9Y8786nVDrlma5YCKpqUZ5c46wW3gYWi3sY+VS3b2FdAKCJhTfCy82AUGqPSVfLa
mQIDAQAB
-----END PUBLIC KEY-----

Rutas usadas

  • /Library/WebServer/share/httpd/manual/WindowServer
  • /Library/LaunchDaemons/.com.apple.WindowServer.plist
  • ~/Library/Containers/com.apple.FaceTime/Data/Library/windowserver
  • ~/Library/Containers/com.apple.Notes/Data/Library/.CFUserTextDecoding
  • ~/Library/Containers/com.apple.languageassetd/loginwindow
  • ~/Library/Application Support/com.apple.spotlight/Resources_V3/.CrashRep

Técnicas de MITRE ATT&CK

Esta tabla fue creada utilizando la versión 11 del framework MITRE ATT&CK.

Tactic ID Name Description
Persistence T1543.004 Create or Modify System Process: Launch Daemon The CloudMensis downloader installs the second stage as a system-wide daemon.
Defense Evasion T1553 Subvert Trust Controls CloudMensis tries to bypass TCC if possible.
Collection T1560.002 Archive Collected Data: Archive via Library Archive Collected Data: Archive via Library CloudMensis uses SSZipArchive to create a password-protected ZIP archive of data to exfiltrate.
T1056.001 Input Capture: Keylogging CloudMensis can capture and exfiltrate keystrokes.
T1113 Screen Capture CloudMensis can take screen captures and exfiltrate them.
T1005 Data from Local System CloudMensis looks for files with specific extensions.
T1025 Data from Removable Media CloudMensis can search removable media for interesting files upon their connection.
T1114.001 Email Collection: Local Email Collection CloudMensis searches for interesting email messages and attachments from Mail.
Command and Control T1573.002 Encrypted Channel: Asymmetric Cryptography The CloudMensis initial report is encrypted with a public RSA-2048 key.
T1573.001 Encrypted Channel: Symmetric Cryptography CloudMensis encrypts exfiltrated files using password-protected ZIP archives.
T1102.002 Web Service: Bidirectional Communication CloudMensis uses Dropbox, pCloud, or Yandex Drive for C&C communication.
Exfiltration T1567.002 Exfiltration Over Web Service: Exfiltration to Cloud Storage CloudMensis exfiltrates files to Dropbox, pCloud, or Yandex Drive.

Fuente info
Autor: Marc-Etienne M.Léveillé