elfsightSari la conținut
Atac WordPress MU-Plugins 2026

Atac WordPress MU-Plugins 2026, cum funcționează și cum vă protejați

Cuprins ascunde

Atac WordPress MU-Plugins 2026, cum funcționează și cum vă protejați. În martie 2026, o campanie avansată de malware a lovit mii de site-uri WordPress la nivel global, exploatând folderul mu-plugins pentru a instala backdoor-uri aproape invizibile.

Am identificat și curățat acest atac pe mai multe servere administrate de noi. În acest articol vă explicăm exact cum funcționează atacul, cum îl detectați și cum vă protejați site-ul.

Atac WordPress MU-Plugins 2026, cum funcționează și cum vă protejați

Campania a fost documentată de Monarx Security pe 9 martie 2026 sub numele „Advanced WordPress Backdoor Campaign: Multi-Stage MU-Plugin Malware with Full-Site Compromise”. Atacul folosește 7 niveluri de persistență, ceea ce îl face extrem de dificil de eliminat complet.

Spre deosebire de malware-ul clasic care infectează un singur fișier, acest atac se răspândește în mai multe locații din instalarea WordPress și se regenerează automat dacă nu sunt curățate toate componentele simultan.

Cum funcționează atacul în 7 etape

Etapa 1: Dropper-ul în functions.php

Atacatorul înlocuiește conținutul fișierului functions.php din tema activă cu un dropper marcat cu comentariul /* __mu_deployer__ */. La prima încărcare a paginii, dropper-ul decodifică un payload base64 și îl scrie în folderul mu-plugins.

După ce payload-ul e instalat, dropper-ul se auto-șterge, lăsând functions.php complet gol (0 bytes). Acesta este primul semn vizibil al atacului, site-ul nu mai funcționează corect deoarece tema rămâne fără funcții.

Etapa 2: Instalarea în MU-Plugins

Folderul wp-content/mu-plugins/ este special în WordPress. Fișierele PHP din acest folder se încarcă automat la fiecare request, fără activare din panoul de administrare. Atacatorul creează aici mai multe fișiere cu nume care par legitime:

  • session-manager.php, backdoor-ul principal
  • wp-user-query.php, fură cookie-urile administratorilor
  • health-check.php, placeholder pregătit pentru cod viitor

Etapa 3: Furtul cookie-urilor și credențialelor

Fișierul wp-user-query.php monitorizează fiecare administrator care se loghează. Când detectează un admin, colectează toate cookie-urile WordPress și le trimite către serverele atacatorului:

# Domenii C2 (Command & Control) ale atacatorului:
webanalytics-cdn.sbs
webanalytics-cdn.cyou
webanalytics-cdn.cfd
webanalytics-cdn.icu

Cu aceste cookie-uri, atacatorul poate prelua controlul complet al site-ului fără să cunoască parola administratorului.

Etapa 4: Crearea unui admin ascuns

Malware-ul creează un cont de administrator WordPress și îl ascunde din lista de utilizatori. Userul nu apare în pagina Users din admin, nici în REST API și nici în XML sitemap. ID-ul userului ascuns este salvat în tabelul wp_options sub cheia _pre_user_id.

Etapa 5: Fișiere de persistență răspândite

Pentru a supraviețui unei curățări parțiale, malware-ul creează copii de backup în locații neobișnuite:

  • wp-content/languages/wp-locale-handler.php
  • wp-content/upgrade/wp-update-verify.php
  • wp-includes/fonts/font-metrics.php
  • wp-content/uploads/wp-cache-stats.php, backdoor cu execuție cod remote
  • .wp-config-cache.php în root, cookie stealer

Etapa 6: Modificarea .user.ini

Pe serverele cu PHP-FPM, atacatorul modifică fișierul .user.ini din root-ul site-ului pentru a forța PHP să execute malware-ul la fiecare request:

auto_prepend_file = /home/user/public_html/.wp-config-cache.php

Aceasta înseamnă că malware-ul se execută înainte de orice altceva, chiar dacă WordPress nu e complet încărcat.

Etapa 7: Auto-regenerare prin WP-Cron

Malware-ul înregistrează un task cron WordPress custom (_tds_15min) care verifică la fiecare 15 minute dacă toate componentele sunt în loc. Dacă un fișier a fost șters, îl recreează din backup-ul salvat în baza de date (opțiunea _wp_session_tokens_config din wp_options).

Cronologia reală a unui atac, minut cu minut

Am analizat logurile de acces de pe unul din serverele atacate si am reconstituit cronologia exactă a atacului. Toate acțiunile au fost executate de la IP-ul 96.168.242.42 pe data de 20 martie 2026.

05:26 , tentativă de acces prin XML-RPC

Un POST request pe /xmlrpc.php de pe IP-ul 62.60.130.227. XML-RPC permite autentificare prin brute force fără limitări, deoarece poate testa sute de combinații utilizator/parola intr-un singur request. Aceasta a fost cel mai probabil metoda prin care atacatorul a obținut credențialele admin.

62.60.130.227 - [20/Mar/2026:05:26:54] "POST //xmlrpc.php HTTP/1.1" 200

06:49:48, acces in panoul WordPress

Atacatorul accesează pagina de upload plugin din WordPress admin, folosind credențialele obținute anterior:

96.168.242.42 - [06:49:48] GET /wp-admin/plugin-install.php?tab=upload

06:49:56, upload plugin malware

Uploadează un plugin cu nume generat aleatoriu (wp-session-helper-mmyf6zu3) care conține backdoor-ul principal:

96.168.242.42 - [06:49:56] POST /wp-admin/update.php?action=upload-plugin
96.168.242.42 - [06:50:01] GET /wp-admin/plugins.php?action=activate&plugin=wp-session-helper-mmyf6zu3

06:50:14, execuție comenzi remote

Imediat după activarea pluginului, atacatorul executa comenzi PHP prin backdoor-ul instalat. Parametrul wp_debug_session este folosit ca cheie de autentificare:

96.168.242.42 - [06:50:14] POST /?wp_debug_session=a3f8b2c1d4e5f607...&mode=php
96.168.242.42 - [06:50:18] POST /?wp_debug_session=a3f8b2c1d4e5f607...&mode=php
96.168.242.42 - [06:50:23] POST /?wp_debug_session=a3f8b2c1d4e5f607...&mode=php

Aceste comenzi răspândesc malware-ul in mu-plugins, languages, upgrade si alte locații.

06:50:42, instalare WP File Manager

Atacatorul instalează pluginul WP File Manager direct din repository-ul WordPress.org, ca să poată naviga si edita fișierele de pe server prin interfață web:

96.168.242.42 - [06:50:42] GET /wp-admin/plugin-install.php?s=wp-file-manager&tab=search
96.168.242.42 - [06:50:45] GET /wp-admin/update.php?action=install-plugin&plugin=wp-file-manager
96.168.242.42 - [06:50:58] GET /wp-admin/plugins.php?action=activate&plugin=wp-file-manager

06:51:02, navigare si editare fișiere

Prin WP File Manager, atacatorul navighează direct la folderul wp-content/mu-plugins/ și editează session-manager.php, inserând codul malware complet:

96.168.242.42 - [06:51:10] GET admin-ajax.php?cmd=open&target=l1_Lw (root)
96.168.242.42 - [06:51:12] GET admin-ajax.php?cmd=open&target=l1_d3AtY29udGVudA (wp-content)
96.168.242.42 - [06:51:13] GET admin-ajax.php?cmd=open&target=...mu-plugins
96.168.242.42 - [06:51:15] GET admin-ajax.php?cmd=get&target=...session-manager.php
96.168.242.42 - [06:51:16] POST admin-ajax.php (salvare fișier editat)

06:51:22, raspandire pe alte IP-uri

După instalarea completa a malware-ului, backdoor-ul începe să primească comenzi de pe multiple IP-uri diferite (96.168.x.x, 23.26.130.x), indicând o rețea de proxy-uri sau VPN-uri:

96.168.242.42  - [06:51:22] POST /?wp_debug_session=...&mode=php 200
96.168.212.123 - [06:51:33] POST /?wp_debug_session=...&mode=php 500
23.26.130.54   - [06:51:35] POST /?wp_debug_session=...&mode=php 500
96.166.17.125  - [06:51:37] POST /?wp_debug_session=...&mode=php 500
96.191.139.234 - [06:51:38] POST /?wp_debug_session=...&mode=php 500

Întregul atac, de la prima autentificare până la compromiterea completă a site-ului, a durat mai puțin de 2 minute.

Ce ne arată această cronologie

Atacul este complet automatizat. Niciun om nu navighează atât de rapid între pagini (2-3 secunde per acțiune). Este un script care:

  1. Obține credențiale admin prin brute force pe xmlrpc.php
  2. Se loghează automat in WordPress
  3. Uploadeaza si activează un plugin malware cu nume random
  4. Execută comenzi PHP pentru a răspândi backdoor-ul
  5. Instalează WP File Manager pentru acces persistent
  6. Editează fișierele mu-plugins cu malware-ul final

Cum va protejați împotriva brute force pe XML-RPC

Deoarece vectorul inițial de intrare este brute force prin xmlrpc.php, cea mai importantă măsură preventivă este dezactivarea sau restricționarea accesului la acest endpoint.

Dezactivare completă xmlrpc.php

Adăugați în fișierul .htaccess din root-ul site-ului:

# Blocare completa xmlrpc.php
<Files xmlrpc.php>
  Order Deny,Allow
  Deny from all
</Files>

Dezactivare prin WordPress

// Adăugați în functions.php sau într-un mu-plugin:
add_filter('xmlrpc_enabled', '__return_false');

XML-RPC nu mai este necesar pentru majoritatea site-urilor WordPress moderne. REST API a înlocuit complet funcționalitatea XML-RPC. Dezactivarea sa nu afecteaza funcționarea normală a site-ului.

Cum detectați dacă site-ul dumneavoastră este infectat

Verificați prezența următoarelor indicii pe server:

Fișiere malware cunoscute

# Verificare rapidă prin SSH/Terminal:
ls -la .wp-config-cache.php
ls -la wp-content/mu-plugins/session-manager.php
ls -la wp-content/mu-plugins/wp-user-query.php
ls -la wp-content/mu-plugins/health-check.php
ls -la wp-content/uploads/wp-cache-stats.php
ls -la wp-content/languages/wp-locale-handler.php
ls -la wp-content/upgrade/wp-update-verify.php
ls -la wp-includes/fonts/font-metrics.php

Dacă oricare din aceste fișiere există, site-ul este infectat.

Verificare functions.php

# Verifică dacă functions.php este gol:
wc -c wp-content/themes/TEMA-ACTIVA/functions.php
# Dacă rezultatul este 0, fișierul a fost golit de malware

Verificare .user.ini

# Verifică dacă .user.ini conține auto_prepend_file suspect:
cat .user.ini
# Dacă vedeți auto_prepend_file către .wp-config-cache.php, este malware

Verificare baza de date

-- Căutați în phpMyAdmin sau WP-CLI:
SELECT * FROM wp_options WHERE option_name IN (
  '_pre_user_id',
  '_wp_session_tokens_config',
  '_wp_session_tokens_data'
);
-- Dacă returnează rezultate, site-ul a fost compromis

Verificare utilizatori admin ascunși

# Prin WP-CLI:
wp user list --role=administrator

# Căutați useri cu nume suspecte:
# log_agent*, system*, dwanw98232h13ndwa*

Cum curățați complet un site infectat

Curățarea trebuie făcută complet și simultan. Dacă omiteți o componentă, malware-ul se regenerează în 15 minute prin cron.

Pasul 1: Ștergeți toate fișierele malware

# Ștergeți din root:
rm -f .wp-config-cache.php

# Ștergeți din mu-plugins:
rm -f wp-content/mu-plugins/session-manager.php
rm -f wp-content/mu-plugins/wp-user-query.php
rm -f wp-content/mu-plugins/wp-user-query-filter.php
rm -f wp-content/mu-plugins/health-check.php

# Ștergeți din alte locații:
rm -f wp-content/uploads/wp-cache-stats.php
rm -f wp-content/languages/wp-locale-handler.php
rm -f wp-content/upgrade/wp-update-verify.php
rm -f wp-includes/fonts/font-metrics.php

Pasul 2: Curățați .user.ini

# Verificați conținutul:
cat .user.ini

# Dacă conține auto_prepend_file către malware, ștergeți linia
# sau goliți fișierul dacă nu avea alt conținut:
echo "" > .user.ini

Pasul 3: Restaurați functions.php

Restaurați fișierul functions.php din backup sau re-descărcați tema originală de la furnizor. Nu lăsați fișierul gol, site-ul nu va funcționa corect fără el.

Pasul 4: Curățați baza de date

-- Ștergeți opțiunile malware din wp_options:
DELETE FROM wp_options WHERE option_name = '_pre_user_id';
DELETE FROM wp_options WHERE option_name = '_wp_session_tokens_config';
DELETE FROM wp_options WHERE option_name = '_wp_session_tokens_data';
DELETE FROM wp_options WHERE option_name LIKE '_transient__wp_session_%';
DELETE FROM wp_options WHERE option_name LIKE '_transient__tds_%';

-- Verificați și ștergeți cron-ul malware:
SELECT * FROM wp_options WHERE option_name = 'cron';
-- Căutați în valoare referințe la _tds_15min și eliminați-le

Pasul 5: Ștergeți admin-ul ascuns

# Aflați ID-ul din _pre_user_id (notat la pasul anterior)
# Apoi ștergeți userul:
wp user delete ID_USER --reassign=1

Pasul 6: Schimbați WordPress Salts

Accesați https://api.wordpress.org/secret-key/1.1/salt/ și înlocuiți toate cele 8 linii de salt-uri din wp-config.php. Aceasta invalidează toate sesiunile active, inclusiv cookie-urile furate de atacator.

// Înlocuiți aceste 8 linii din wp-config.php cu cele generate:
define('AUTH_KEY',         'valoare-noua-unica');
define('SECURE_AUTH_KEY',  'valoare-noua-unica');
define('LOGGED_IN_KEY',    'valoare-noua-unica');
define('NONCE_KEY',        'valoare-noua-unica');
define('AUTH_SALT',        'valoare-noua-unica');
define('SECURE_AUTH_SALT', 'valoare-noua-unica');
define('LOGGED_IN_SALT',   'valoare-noua-unica');
define('NONCE_SALT',       'valoare-noua-unica');

Pasul 7: Schimbați toate parolele

Schimbați imediat parolele pentru:

  • Toți utilizatorii WordPress administrator
  • Contul FTP
  • Contul cPanel
  • Baza de date MySQL (și actualizați wp-config.php)

Cum vă protejați pe viitor

Fixați permisiunile fișierelor și folderelor

Permisiunile 0777 pe foldere sunt cel mai frecvent vector de intrare pentru acest atac. Rulați din terminal:

# Setați permisiunile corecte:
find /home/user -type d -perm 0777 -exec chmod 755 {} \;
find /home/user -type f -perm 0666 -exec chmod 644 {} \;

# wp-config.php ar trebui să fie și mai restrictiv:
chmod 440 wp-config.php

Monitorizați folderul mu-plugins

Verificați periodic conținutul folderului wp-content/mu-plugins/. Fișierele din acest folder se încarcă automat fără activare. Orice fișier necunoscut aici este suspect.

Instalați un plugin de securitate

Plugin-uri precum Wordfence, Sucuri sau SecuPress pot detecta modificări neautorizate ale fișierelor și pot alerta în timp real. Activați scanarea de integritate a fișierelor WordPress core.

Activați autentificarea în doi factori (2FA)

Chiar dacă un atacator obține cookie-urile administratorului, 2FA adaugă un nivel suplimentar de protecție. Plugin-uri recomandate: WP 2FA sau Two Factor Authentication.

Mențineți totul actualizat

Actualizați regulat WordPress core, temele și plugin-urile. Vulnerabilitățile în plugin-uri neactualizate sunt cel mai frecvent punct de intrare pentru atacuri.

Blocați domeniile C2 la nivel de server

# Blocați comunicarea cu serverele atacatorului:
# În hosts file sau la nivel de firewall:
0.0.0.0 webanalytics-cdn.sbs
0.0.0.0 webanalytics-cdn.cyou
0.0.0.0 webanalytics-cdn.cfd
0.0.0.0 webanalytics-cdn.icu

Dezactivați editarea fișierelor din admin

// Adăugați în wp-config.php:
define('DISALLOW_FILE_EDIT', true);

Indicatori de compromitere (IOC)

Dacă administrați mai multe site-uri WordPress, puteți automatiza verificarea folosind acești indicatori:

  • Fișiere: .wp-config-cache.php, session-manager.php, wp-user-query.php, health-check.php, wp-cache-stats.php, wp-locale-handler.php, wp-update-verify.php, font-metrics.php
  • Domenii C2: webanalytics-cdn.sbs, webanalytics-cdn.cyou, webanalytics-cdn.cfd, webanalytics-cdn.icu
  • Opțiuni DB: _pre_user_id, _wp_session_tokens_config, _wp_session_tokens_data
  • Transients: _transient__wp_session_*, _transient__tds_*
  • Cron: _tds_15min
  • Useri: log_agent*, system*, dwanw98232h13ndwa*
  • Comentariu cod: /* __mu_deployer__ */
  • Detecție Imunify360: SMW-INJ-2035791-php.bkdr-0

Concluzie

Acest atac WordPress din martie 2026 este unul dintre cele mai sofisticate pe care le-am întâlnit. Folosește 7 niveluri de persistență, se auto-regenerează și fură activ credențialele administratorilor. Curățarea parțială nu funcționează, toate componentele trebuie eliminate simultan.

Dacă suspectați că site-ul dumneavoastră a fost compromis, contactați-ne pentru un audit de securitate complet. Oferim servicii de optimizare și securizare WordPress pentru a vă proteja afacerea online.

Pentru mai multe informații despre securitatea WordPress, consultați și celelalte articole din blogul nostru.

Servicii SEO speciale – Oferim servicii speciale de optimizare SEO și promovare pentru motoarele de căutare. Contactați-ne acum!

Dorel Tănase

Dorel Tănase – specialist SEO și Web Design-er cu peste 18 ani de experiență. Dorel Tănase este unul dintre specialiștii în optimizare SEO din România, cu o activitate neîntreruptă în mediul online de peste 18 ani.

Parcursul său profesional a început în anul 1997, odată cu lansarea website-ului cisnet.ro – unul dintre primele proiecte web românești axate pe servicii IT și prezență online.

Articolul precedent
Următorul articol

Comments (0)

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Înapoi sus
Caută
ROEN