Logo
WP Fix by Blimx

WP-VCD Trojan — Cómo Sobrevive y Cómo Vencerlo

Actualizado:
SecurityMalware

Qué es WP-VCD

WP-VCD es una familia de malware WordPress longeva que apareció por primera vez alrededor de 2017 y sigue activa en 2026. A diferencia de infecciones de un disparo, WP-VCD está ingeniada para persistencia — tiene múltiples backdoors redundantes, se replica entre plugins, y se re-despliega si removes solo parte.

El vector de infección original casi siempre fue un tema o plugin premium "nulled" (pirateado) descargado de sitios dudosos. El paquete de distribución del pirata contenía un payload bonus. Una vez activado, WP-VCD se propagó.

Este artículo documenta cómo WP-VCD sobrevive limpiezas estándar y el procedimiento que realmente remueve cada pieza.

Cómo WP-VCD se propaga dentro de tu sitio

La infección tiene 5-7 componentes, cada uno diseñado para restaurar a los otros si alguno es removido:

Componente 1 — class.theme-modules.php

Ubicado en el functions.php del tema activo o como theme-modules.php en la raíz del tema. Este es el loader del core. Removerlo solo es lo que la mayoría de "limpiezas" hacen — y los otros componentes lo reconstruyen.

Componente 2 — wp-vcd.php

Un archivo pequeño dropeado en wp-includes/ (donde vive el core de WordPress). En cada page load, el index.php de WordPress lo incluye. Removerlo significa que se re-dropea por el componente 3 en horas.

Componente 3 — wp-tmp.php

Oculto en wp-content/themes/<active>/ o wp-content/plugins/<random>/. Actúa como re-instalador — si ve el componente 1 o 2 faltante, descarga copias frescas del servidor C2.

Componente 4 — .htaccess modificado

Añade reglas de reescritura de URL que enrutan ciertas URLs spam a una página generada por script. Así es como el payload de search-spam llega a Google.

Componente 5 — Usuario backdoor

Un usuario admin oculto (a menudo nombrado 100010010, admin1, o con display_name como "100010010") que el malware usa para loguearse vía bypass de cookie.

Componente 6 — Opciones de base de datos

Entradas en wp_options como wp_vcd_settings, wp_seo_data, con configuración serializada. Remover el componente 1 sin remover estas deja al malware "sabiendo" que fue instalado.

Componente 7 — Replicación entre sitios

Si tu cuenta de hosting tiene múltiples sitios WordPress, WP-VCD se propaga a TODOS en horas de infección. Así que "el otro sitio se hackeó" usualmente es eso, no una infección nueva.

Por qué fallan las limpiezas estándar

El intento típico de arreglo:

  1. Nota theme-modules.php o código raro en functions.php
  2. Remuévelo
  3. El sitio se ve limpio
  4. La infección vuelve en 4 horas

Esto falla porque el paso 3 dejó intactos:

  • El re-instalador wp-tmp.php
  • El runtime wp-includes/wp-vcd.php
  • El usuario backdoor
  • La infraestructura de comunicación C2

Cualquiera de esos re-planta el loader.

El procedimiento de eliminación en 8 pasos

El procedimiento que realmente funciona:

Paso 1 — Tira el sitio offline

Mientras limpias, previene que visitantes disparen re-infección. Página HTML de mantenimiento:

<!-- /var/www/yoursite/maintenance.html -->
<!DOCTYPE html><html><body><h1>Site under maintenance</h1></body></html>

En .htaccess:

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^YOUR\.IP\.ADDRESS$
RewriteRule .* /maintenance.html [L]

Esto muestra a todos (excepto a ti) la página de mantenimiento durante la limpieza.

Paso 2 — Inventaría archivos infectados

cd /var/www/yoursite

# Archivos con firmas WP-VCD
grep -rl "wp-vcd\|class\.theme-modules\|wp_vcd_settings" --include="*.php" . > /tmp/wpvcd-files.txt

# PHP modificado recientemente
find . -name "*.php" -mtime -90 -type f >> /tmp/wpvcd-files.txt

sort -u /tmp/wpvcd-files.txt > /tmp/wpvcd-final.txt
wc -l /tmp/wpvcd-final.txt

Deberías ver 5-30 archivos típicamente.

Paso 3 — Borra todos los componentes

# Componente 1 & 2 — archivos WP-VCD directos
find . -name "wp-vcd.php" -delete
find . -name "wp-tmp.php" -delete
find . -name "class.theme-modules.php" -delete
find . -name "theme-modules.php" -delete

# Componente 3 — archivos de tema modificados
# Inspecciona manualmente cada archivo PHP en el tema activo; revierte desde copia limpia

Paso 4 — Limpia wp-includes/

El malware puede haber modificado wp-includes/post.php, wp-includes/template-loader.php u otros archivos del core. Restaura el core de WordPress completamente:

wp core download --skip-content --force

Esto reescribe cada archivo del core desde la fuente oficial. No toca wp-content/.

Paso 5 — Limpia .htaccess

Reemplaza .htaccess con reglas default de WordPress. No intentes identificar qué reglas son maliciosas — empieza fresco.

Paso 6 — Limpieza de base de datos

-- Remueve opciones maliciosas
DELETE FROM wp_options WHERE option_name LIKE '%wp_vcd%';
DELETE FROM wp_options WHERE option_name LIKE '%wp_seo_data%';
DELETE FROM wp_options WHERE LENGTH(option_value) > 65000 AND autoload = 'yes';

-- Encuentra y remueve usuarios backdoor
SELECT u.ID, u.user_login, u.user_email FROM wp_users u
JOIN wp_usermeta um ON u.ID = um.user_id
WHERE um.meta_key = 'wp_capabilities' AND um.meta_value LIKE '%administrator%';
-- Para cada admin no reconocido:
DELETE FROM wp_users WHERE ID = X;
DELETE FROM wp_usermeta WHERE user_id = X;

Paso 7 — Reinstala plugins y temas

Reinstala cada plugin y tema activo desde fuentes oficiales:

wp plugin list --field=name --status=active | xargs -I {} wp plugin install {} --force
wp theme install <theme-slug> --force

Si tu tema activo era un tema nulled/pirateado, reemplázalo con una versión legítima. Esto es no negociable — la infección original vino a través del tema nulled, y cualquier descarga "gratis" futura de la misma fuente re-infectará.

Paso 8 — Rota todas las credenciales

# Usuarios WordPress
wp user list --field=ID | xargs -I {} wp user reset-password {} --skip-email

# Salts WordPress
# Visita https://api.wordpress.org/secret-key/1.1/salt/ y reemplaza salts en wp-config.php

# Usuario base de datos
# Actualiza contraseña usuario mysql; actualiza DB_PASSWORD en wp-config.php

También rota contraseñas FTP, SSH y del panel del hosting.

Verificando la limpieza

48 horas tras la limpieza, verifica que no haya re-infección:

# Revisa archivos re-dropeados
find . -name "wp-vcd.php" -o -name "wp-tmp.php" -o -name "class.theme-modules.php"
# Debería estar vacío

# Revisa admins nuevos
wp user list --role=administrator

# Revisa cron por hooks desconocidos
wp cron event list

# Revisa opciones nuevas
wp option list --search="*wp_vcd*"
wp option list --search="*wp_seo_data*"

Todos estos deberían estar vacíos/contener solo lo que esperas.

Replicación entre sitios

Si tu cuenta de hosting tiene múltiples sitios WordPress, todos necesitan este mismo procedimiento. WP-VCD volverá al sitio limpiado si dejas uno infectado.

# Lista todas las instalaciones WordPress en la cuenta
find / -name "wp-config.php" 2>/dev/null | xargs -I {} dirname {}

Limpia cada uno.

Prevención

  • Nunca instales temas o plugins nulled/pirateados. Esta es la causa #1 de WP-VCD. Compra legítimo, usa alternativas GPL gratis, o contáctanos.
  • Monitoreo de integridad de archivos en wp-includes/, wp-content/themes/ y wp-content/mu-plugins/
  • WAF con reglas bloqueando URLs de callback WP-VCD conocidas
  • Log de auditoría de eventos de creación de usuarios admin
  • Backups diarios fuera del sitio con simulacros mensuales de restauración

Errores comunes durante eliminación WP-VCD

  • Remover solo el loader visible — re-plantado en horas por otro componente
  • Dejar el usuario backdoor — el atacante se loguea vía cookie y reinstala
  • No regenerar salts — el salt viejo permite restauración de sesión
  • Limpiar solo el sitio infectado, no la cuenta de hosting — sitios vecinos re-infectan el limpiado

Cuándo llamar a un especialista

Un sitio con WP-VCD activo que ha sido limpiado 2+ veces y sigue volviendo tiene vectores adicionales que necesitan investigación forense — posiblemente una cuenta admin comprometida, una clave SSH, o un compromiso del panel del hosting. Manejamos estos.

Eliminación WP-VCD — resolución típica 6-10 horas incluyendo verificación cross-site. Para recuperación de hack más amplia ve reparación de sitio hackeado.