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
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.icuCu 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.phpAceasta î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" 20006: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=upload06: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-mmyf6zu306: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=phpAceste 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-managerPrin 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:
- Obține credențiale admin prin brute force pe xmlrpc.php
- Se loghează automat in WordPress
- Uploadeaza si activează un plugin malware cu nume random
- Execută comenzi PHP pentru a răspândi backdoor-ul
- Instalează WP File Manager pentru acces persistent
- 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.phpDacă 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 malwareVerificare .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 malwareVerificare 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 compromisVerificare 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.phpPasul 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.iniPasul 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-lePasul 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=1Pasul 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.phpMonitorizaț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.icuDezactivaț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.


Comments (0)