
El malware colado en algunas copias de Rank Math SEO PRO 3.0.123 ha obligado a muchos administradores a revisar sus webs a contrarreloj. Hemos seguido una revisión real de una red de una treintena de sitios WordPress para contar qué conviene tener preparado antes de que pase algo así, qué comprobar con WP-CLI y qué hacer cuando no hay acceso por terminal. El resultado de ese caso fue limpio para este incidente, pero sacó a la luz otros problemas que llevaban meses ahí.
Las claves de cómo auditar WordPress tras un ataque a la cadena de suministro en 20 segundos
Los ataques a la cadena de suministro tienen una particularidad incómoda: el código malicioso llega por el canal en el que más se confía, la actualización oficial de un plugin. Ya ocurrió en junio con el ataque a la CDN de Awesome Motive y ahora con Rank Math. Cuando sale el aviso, la pregunta es siempre la misma: ¿cuáles de mis webs tienen esa versión y cómo compruebo si están comprometidas? Responderla rápido depende mucho de lo que se haya preparado antes.
Si hay acceso por terminal, WP-CLI es la forma más rápida. Estos comandos, ejecutados desde el directorio de WordPress, cubren los indicadores publicados por Rank Math y Wordfence para este caso, y sirven como plantilla para incidentes similares cambiando los nombres concretos.
Primero, la versión instalada y si el plugin está activo:
wp plugin list --fields=name,status,version | grep -i rank
wp plugin get seo-by-rank-math-pro --field=versionLenguaje del código: JavaScript (javascript)
Después, la base de datos y los usuarios. Las tres opciones son las que crea este malware; un resultado vacío es buena señal. La lista de administradores con fecha de alta ayuda a detectar cuentas creadas en los últimos días:
wp option get _uf6qdn2hmm
wp option get t8krdk990phb
wp option get _np5pvf754c
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
wp cron event listLenguaje del código: JavaScript (javascript)
Luego, los archivos. La verificación del núcleo detecta ficheros añadidos o modificados, como el falso wp-includes/class-wp-cache-util.php. La de plugins solo funciona con los del directorio oficial, así que los premium hay que compararlos con una copia limpia descargada de su web:
wp core verify-checksums
wp plugin verify-checksums --all
ls -la wp-includes/class-wp-cache-util.php
ls -la wp-content/mu-plugins/
find wp-content/uploads -name "*.php" -size +0
find wp-content -name "*.php" -newermt "2026-10-15 20:00"
grep -RIl --include="*.php" "xmmqhn" wp-content/
grep -RIl "rank1cdn" wp-content/ .htaccess
Por último, fuera de WordPress. El crontab del usuario del servidor web, las claves SSH autorizadas y los procesos en ejecución no aparecen en ninguna herramienta de WordPress y son justo donde una puerta trasera persistente puede esconderse:
crontab -l -u www-data | grep ms6v46
cat ~/.ssh/authorized_keys
ps aux | grep -i phpLenguaje del código: JavaScript (javascript)
Conviene sustituir www-data por el usuario real del servidor web, que cambia según el hosting. Para el resto de tareas con plugins, en WP Directo explicamos cómo gestionar plugins con WP-CLI como un profesional.
Muchos alojamientos compartidos no dan terminal. En ese caso, phpMyAdmin o cualquier cliente de base de datos permite hacer las mismas comprobaciones. Hay que sustituir wp_ por el prefijo real de las tablas:
SELECT option_name FROM wp_options
WHERE option_name IN ('_uf6qdn2hmm','t8krdk990phb','_np5pvf754c','rank_math_pro_version');
SELECT user_login, user_email, user_registered FROM wp_users
WHERE user_login LIKE 'wpsupport%' OR user_email LIKE '%wp-mail.net'
OR user_registered >= '2026-10-15';Lenguaje del código: JavaScript (javascript)
Un detalle que encontramos en la revisión: la opción rank_math_pro_version de la base de datos no siempre coincide con la versión real de los archivos, porque solo se actualiza cuando el plugin ejecuta su rutina de actualización. Para confirmar la versión hay que mirar la cabecera Version: del archivo rank-math-pro.php o la pantalla de Plugins.
Para los archivos, el gestor del panel de hosting sirve para revisar mu-plugins y uploads, y los escáneres de plugins de seguridad como Wordfence o Sucuri automatizan la búsqueda de patrones. Cuando hay muchas webs, lo práctico es una herramienta de gestión centralizada. En el caso que contamos se usó el hub de MCP Content Manager, que permite lanzar consultas SQL de solo lectura, listar directorios, escanear wp-content y verificar el núcleo en cada sitio desde un único punto. MainWP o ManageWP cubren parte de estas tareas.
La red revisada, cuyos nombres omitimos, suma una treintena de sitios WordPress de distintos tamaños: medios, tiendas y webs corporativas. El proceso siguió este orden:
La revisión dejó también claras sus limitaciones. No fue posible saber a qué hora exacta se instaló la 3.0.123 en cada web, porque no había un registro de actualizaciones con fecha. Tampoco se podía comprobar desde el panel el crontab del sistema ni las claves SSH. Y los escáneres por firmas generaron decenas de falsos positivos por web, casi siempre bibliotecas legítimas que usan proc_open o exec, lo que obliga a filtrar a mano.
Lo más útil fue lo que apareció sin buscarlo: un volcado completo de la base de datos de 254 MB en la raíz pública de una web, un instalador de Duplicator olvidado de una migración, varios archivos PHP sueltos en la raíz de 2025 que nadie recordaba y 45 imágenes guardadas con extensión .php en uploads por un proceso de importación. La que se abrió para comprobarla era una imagen JPEG, no código, pero 31 de ellas se usaban como imagen destacada, así que borrarlas sin más rompía esas entradas. Todo se corrigió ese mismo día.
Aunque el resultado sea limpio, el ejercicio sirve para cerrar huecos. Si queda cualquier duda sobre una web que tuvo la versión afectada activa, Rank Math pide cambiar todas las credenciales: contraseñas, base de datos, claves y salts de wp-config.php y claves de API. Las copias de seguridad y los instaladores de migración deben salir de la raíz web, el PHP en uploads debe quedar bloqueado y conviene programar revisiones periódicas en lugar de esperar al siguiente aviso. Para webs que sí resulten infectadas, la hoja de AyudaWP con 77 pasos y herramientas como WP Beacon ayudan a ordenar el trabajo.
Las actualizaciones automáticas merecen una reflexión aparte. En este incidente fueron un arma de doble filo: instalaron la versión comprometida durante la ventana de once horas, pero también llevaron la 3.0.124 a todas las webs en cuanto estuvo disponible. Desactivarlas no elimina el riesgo; lo que sí ayuda es saber cuándo se aplicó cada una.
En la pantalla de Plugins o con wp plugin get seo-by-rank-math-pro –field=version. La opción rank_math_pro_version de la base de datos puede no estar al día.
Sí. Las comprobaciones de base de datos se hacen con consultas SQL desde phpMyAdmin, y los archivos con el gestor del hosting o un plugin de seguridad. Lo que no se puede ver sin acceso al servidor son el crontab del sistema y las claves SSH.
No siempre. Solo funciona con plugins del directorio de WordPress.org. Los premium hay que compararlos con una copia limpia descargada desde la web del fabricante.
No necesariamente. También son las que distribuyen la versión corregida. Lo recomendable es tener copias de seguridad con suficiente retención y un registro de cuándo se actualiza cada plugin.
Fuentes:
