PamStealer hace que la recuperación de la carga útil en macOS dependa de su servidor de mando y control
Variante PamStealer suplanta cartera Wavel en macOS: usa JXA y zsh, exige servidor C2 para descifrar payload Swift y crea 4 persistencias.
Imagen ilustrativa generada con IA
Una falsa cartera Wavel distribuye la nueva cadena de infección
Jamf Threat Labs ha identificado una variante de PamStealer que modifica tanto el sistema de protección de la carga útil como la estrategia de persistencia en macOS. En lugar de incluir localmente todo lo necesario para descifrar el malware principal, la campaña requiere una comunicación activa con una infraestructura controlada por los atacantes.
La operación utiliza wavel[.]app, un sitio web fraudulento que promociona una cartera de criptomonedas ficticia llamada Wavel. El botón «Download for macOS» descarga Wavel.dmg, que contiene un archivo AppleScript compilado.
Al abrirlo, se inicia el Editor de Scripts de Apple y se muestran instrucciones para que el usuario ejecute un dropper de JavaScript for Automation (JXA). Este paso de ingeniería social depende de que la víctima ejecute código; no explota una vulnerabilidad conocida de macOS.
La campaña sucede a otras actividades de PamStealer detectadas en julio y agosto de 2026. En aquellas operaciones se utilizaron sitios falsos que imitaban las aplicaciones Maccy, Scoppr y Nancy Clipboard. El señuelo de Wavel también emplea JXA, pero le asigna un papel más limitado en el proceso de infección.
Según la información publicada sobre los hallazgos de Jamf Threat Labs, el malware final ahora está escrito en Swift. La versión anterior estaba desarrollada en Rust.
JXA transfiere la ejecución a un proceso zsh en segundo plano
Las primeras variantes de PamStealer utilizaban JXA para realizar varias funciones básicas. El script descifraba una carga útil integrada mediante RC4, interactuaba con frameworks de Objective-C a través del puente de JXA con Foundation y NSData, descargaba contenido adicional y preparaba el malware.
La versión de Wavel distribuye esas funciones entre varios componentes.
El AppleScript compilado inicia un programa portador de JXA que contiene una cadena codificada en Base64. JXA decodifica esos datos y envía el script resultante a:
/bin/zsh -s
A continuación, el proceso JXA termina y el proceso zsh que ha iniciado continúa ejecutándose en segundo plano. Así, JXA queda reducido a un portador inicial y las operaciones posteriores de red, descifrado y preparación se llevan a cabo dentro del script de shell.
La fase de zsh se conecta a wavel.apple03cloudstore[.]com y descarga una utilidad de descifrado llamada pkgunpack. Esta herramienta participa en un intercambio de claves X25519 con el servidor de los atacantes antes de descifrar y preparar el paquete de la carga útil.
Esta arquitectura dificulta el análisis sin conexión del malware. Tener la imagen de disco, el código JXA, el script de shell o la carga útil cifrada no basta necesariamente para reconstruir el ejecutable final.
El descifrado asistido por el servidor impide una recuperación estática sencilla
El servidor de mando y control conserva la clave privada necesaria para completar el intercambio X25519 y derivar la clave de cifrado de datos (DEK). Cada vez que se ejecuta la cadena de infección se genera un nuevo par de claves efímeras.
Por tanto, una DEK capturada durante una ejecución no se puede reutilizar sin más en otra. Para recuperar la segunda fase cifrada, los investigadores necesitan una sesión de C2 activa y la colaboración del servidor mientras siga accesible.
Este diseño ofrece varias ventajas defensivas a los operadores. Pueden limitar la distribución según criterios del servidor, impedir la recuperación de la carga útil desconectando la infraestructura y dificultar el análisis retrospectivo una vez recopilados los artefactos de un equipo.
Pero también genera una dependencia para los atacantes. Si los defensores bloquean wavel.apple03cloudstore[.]com o el servidor deja de estar disponible antes de que termine el descifrado, la cadena de infección no podrá derivar la clave necesaria mediante el proceso previsto.
El análisis disponible no revela si existen reglas específicas de filtrado en el servidor ni cuáles podrían ser. Tampoco se sabe si la infraestructura limita las solicitudes por ubicación, características del equipo, número de ejecuciones u otras condiciones.
Cuatro mecanismos de persistencia que se refuerzan entre sí
Una vez instalado, PamStealer intenta ocultar las notificaciones del sistema operativo que normalmente avisarían al usuario de que se ha registrado un nuevo elemento de inicio de sesión en segundo plano. Después establece cuatro mecanismos de persistencia interconectados.
El primero es un LaunchAgent que ejecuta el malware de forma periódica. No se han revelado los nombres exactos de los archivos LaunchAgent ni las rutas de las listas de propiedades.
El segundo componente es un script de reparación en zsh. Comprueba si el paquete de la carga útil y el LaunchAgent siguen presentes y los restaura si falta alguno. Por tanto, eliminar solo uno de los componentes visibles puede dejar el sistema expuesto a una reinfección a partir de los artefactos que aún queden en el disco.
PamStealer también añade un hook de shell a ~/.zshrc. Cada vez que se inicia una nueva sesión interactiva de zsh, se puede ejecutar el script de reparación, de modo que el uso habitual del terminal activa la recuperación del malware.
El cuarto mecanismo abusa de los hooks de Git. El script de reparación se copia en las ubicaciones post-checkout y pre-commit dentro de:
~/Library/Application Support/System/.githooks/
Después, el malware modifica la configuración global core.hooksPath de Git para que apunte a ese directorio. Así, cualquier operación de checkout o commit en un repositorio del Mac comprometido puede ejecutar la lógica de reparación.
Esto resulta especialmente relevante para los desarrolladores. Aunque se eliminen el LaunchAgent o el paquete de la carga útil, el uso habitual de Git o la apertura de un nuevo shell pueden restaurar los componentes borrados.
El stealer de Swift busca contraseñas, llaveros y datos del navegador
La carga útil final es un infostealer escrito en Swift. Recopila credenciales, archivos locales, datos del sistema e información útil para perfilar el equipo comprometido.
PamStealer muestra un cuadro de diálogo de error falso para solicitar la contraseña del sistema al usuario. Después valida las credenciales introducidas mediante PAM, lo que permite al malware distinguir una contraseña correcta de un intento fallido.
También enumera y recupera elementos del llavero de macOS. El robo de credenciales de navegador abarca una amplia variedad de aplicaciones populares, centradas en la privacidad, regionales y basadas en Chromium:
- Google Chrome
- Microsoft Edge
- Mozilla Firefox
- Brave
- Vivaldi
- Opera
- Opera GX
- Arc
- Zen
- Waterfox
- LibreWolf
- Yandex Browser
- Cốc Cốc
La compatibilidad con Arc, Zen y otros navegadores menos comunes amplía el posible grupo de víctimas más allá de las aplicaciones que suelen atacar los ladrones de credenciales para macOS.
El malware también recopila metadatos del sistema y la imagen de perfil del usuario. Además, recoge varios archivos relacionados con el shell y el desarrollo, entre ellos:
~/.zsh_history
~/.zshrc
~/.bash_history
~/.gitconfig
El historial de comandos puede revelar nombres internos de equipos, estructuras de directorios, comandos de desarrollo, tokens introducidos directamente en la línea de comandos o pistas sobre entornos de nube y de control de código fuente. El stealer también enumera los procesos en ejecución y las aplicaciones instaladas.
No se ha publicado una clasificación formal de gravedad ni una puntuación CVSS. Aunque CVSS suele aplicarse a vulnerabilidades de software y no a campañas de malware, la combinación de captura de contraseñas, acceso al llavero, robo de datos del navegador y persistencia resistente representa un riesgo considerable para los usuarios infectados.
Qué deben revisar los defensores en los sistemas macOS
A fecha de 26 de septiembre de 2026, no se ha publicado ninguna medida correctiva de un proveedor ni un procedimiento oficial de eliminación. No hay ningún parche porque, según lo informado, la campaña no depende de una vulnerabilidad de software concreta.
Los defensores deberían empezar por bloquear los dos dominios conocidos y buscar registros históricos de conexión con ellos:
wavel[.]app
wavel.apple03cloudstore[.]com
También conviene examinar los equipos en busca de Wavel.dmg, la utilidad pkgunpack, LaunchAgents inesperados y elementos de inicio de sesión en segundo plano desconocidos. Encontrar uno de estos elementos no demuestra por sí solo que se haya producido toda la secuencia de infección, pero justifica una investigación más exhaustiva.
Los cambios en ~/.zshrc requieren especial atención, sobre todo si añaden llamadas a scripts ubicados en rutas inusuales. Los investigadores también deberían comprobar la configuración global de los hooks de Git con un comando como el siguiente:
git config --global --get core.hooksPath
Se ha identificado como indicador una ruta que apunte al siguiente directorio:
~/Library/Application Support/System/.githooks/
Los analistas deberían revisar esa ubicación para detectar hooks post-checkout y pre-commit inesperados. Eliminar solo esos hooks no basta si el script de reparación, el LaunchAgent o el paquete de la carga útil siguen en otra ubicación.
Como el descifrado requiere un intercambio de claves activo, el análisis estático puede detectar los scripts iniciales sin revelar la carga útil final en Swift. Por ello, la telemetría de red, los registros de ejecución del shell, los eventos de creación de archivos y los cambios en la persistencia y la configuración de Git son elementos importantes de la investigación.
Si se confirma la infección, las credenciales introducidas en el cuadro de diálogo falso o almacenadas en los navegadores y llaveros atacados deben considerarse expuestas. Una vez contenido el Mac afectado y eliminada por completo la cadena de persistencia, se deben cambiar las contraseñas y revocar las sesiones desde un dispositivo de confianza.
Fuentes
Este artículo es una reelaboración original basada en las siguientes fuentes.
