PamStealer ata el descifrado de su payload al C2 y añade cuatro vías de persistencia
La segunda etapa del infostealer para macOS solo se descifra con el intercambio de claves contra el servidor, y el robo se sostiene con cuatro mecanismos, uno de ellos vía hooks de git.

Jamf Threat Labs ha documentado una versión nueva de PamStealer, un infostealer para macOS que cambia la forma de entregar y de desenvolver el payload. El código JXA que lanza la infección ya no lleva dentro el material de la clave: ahora descarga una utilidad de descifrado y completa un intercambio de claves con el servidor antes de poder abrir la segunda etapa. Si el C2 no colabora, el payload no se recupera de forma estática.
Del falso Maccy al falso monedero
Las variantes de julio y agosto se disfrazaban de Maccy, Scoppr y Nancy Clipboard, con sitios clónicos. La de ahora usa wavel[.]app, la web de un monedero de criptomonedas que no existe. El botón de descarga para macOS entrega Wavel.dmg, dentro del cual hay un AppleScript compilado. Al abrirlo, Script Editor pide ejecutarlo y de ahí sale el dropper en JXA.
En las variantes anteriores, ese JXA hacía el descifrado RC4 de un payload embebido y llamaba a Foundation y NSData a través del puente con Objective-C. En Wavel, esa capa ya no hace nada de eso: decodifica una cadena base64 y la mete por tubería en /bin/zsh -s. El proceso JXA muere al instante y el script zsh sigue en segundo plano.
El script descarga y ejecuta la utilidad de descifrado pkgunpack desde wavel.apple03cloudstore[.]com, hace el intercambio de claves X25519, descifra y prepara el bundle, silencia las notificaciones con las que macOS avisa de que se ha añadido un elemento de inicio y monta cuatro métodos de persistencia. Un LaunchAgent, un script zsh de reparación que restaura tanto el bundle como el LaunchAgent si desaparecen, y un hook de shell añadido a ~/.zshrc que lanza ese script de reparación en cada sesión interactiva nueva. Después hace polling y sube el directorio de staging comprimido en ZIP.
Como la clave privada vive en el servidor, la clave de cifrado de datos no se puede reconstruir sin él. Y como cada ejecución genera un par de claves efímero, una clave capturada tampoco sirve para reinyectarla. El resultado es un payload inservible para análisis estático si no hay sesión de C2 en vivo.
Persistencia que se dispara con git
El script de reparación se copia a las carpetas post-checkout y pre-commit dentro de ~/Library/Application Support/System/.githooks/, y se configura git config --global core.hooksPath apuntando a ese directorio. Cualquier git checkout o git commit en cualquier repositorio de la máquina comprometida activa el script sin que el usuario note nada.
La fase final del robo está escrita en Swift, un cambio respecto a la versión anterior, que iba en Rust. El objetivo es el mismo: capturar la contraseña del sistema con un diálogo de crash falso y validarla contra PAM, enumerar y extraer elementos del llavero, robar credenciales de navegadores basados en Chromium y en Firefox —Google Chrome, Edge, Firefox, Brave, Vivaldi, Opera, Opera GX, Arc, Zen, Waterfox, LibreWolf, Yandex y Cốc Cốc—, hacer fingerprint del equipo, recoger ~/.zsh_history, ~/.zshrc, ~/.bash_history y ~/.gitconfig, y listar procesos y aplicaciones instaladas.
Thijs Xhaflaire, autor del análisis, señala que "la inclusión de Arc, Zen y los navegadores regionales y centrados en privacidad menos habituales amplía la lista de objetivos bastante más allá de lo típico en los stealers de macOS de gama baja". La parte interesante para quien administra parques de Mac es el diseño del reparto: parte del control operativo se traslada al operador del servidor, y la decodificación depende de que ese servidor esté disponible. Bloquear el dominio del C2 no solo corta la exfiltración, también deja el binario sin nada que ejecutar en estático, lo que complica el trabajo forense de quien tenga que analizar una muestra.


