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:
- Nota
theme-modules.phpo código raro enfunctions.php - Remuévelo
- El sitio se ve limpio
- 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.txtDeberí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 limpiaPaso 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 --forceEsto 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> --forceSi 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.phpTambié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/ywp-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.

