Tra tutte le backdoor, un utente amministratore creato dall’attacco è la più semplice e la più resistente: non contiene codice, non viene segnalata dagli scanner di file e sopravvive a qualunque ripristino dei file originali. Basta un login per riprendere il controllo del sito, reinstallare plugin malevoli e ricominciare.
Come si nascondono
Un amministratore fantasma raramente si chiama «hacker». Di solito ha un nome plausibile, come admin2, wpsupport o il nome di un collaboratore, e un indirizzo email simile a quello del titolare. Le varianti più curate si nascondono del tutto dalla schermata Utenti con poche righe di PHP, per esempio un filtro su pre_user_query che esclude l’utente dalla query, e correggono anche il conteggio degli amministratori mostrato in alto nella pagina.
Il punto chiave è che questi filtri agiscono dentro WordPress. Tutto ciò che passa da WordPress, compresa la schermata Utenti, vede l’elenco già filtrato.
Controllare dal database e con WP-CLI
Il controllo affidabile è quello che non passa dai plugin e dal tema. Con WP-CLI si possono escludere entrambi dal caricamento:
wp user list --role=administrator --skip-plugins --skip-themes \
--fields=ID,user_login,user_email,user_registered
Oppure si interroga direttamente il database, ricordando che il prefisso delle tabelle può essere diverso da wp_:
SELECT u.ID, u.user_login, u.user_email, u.user_registered
FROM wp_users u
JOIN wp_usermeta m ON m.user_id = u.ID
WHERE m.meta_key = 'wp_capabilities'
AND m.meta_value LIKE '%administrator%';
Se i risultati sono diversi da ciò che mostra la schermata Utenti, c’è del codice che nasconde qualcuno, e quel codice va cercato e rimosso quanto l’utente stesso.
Non solo amministratori
Un attacco non ha sempre bisogno del ruolo di amministratore. Vale la pena controllare anche:
- utenti con ruoli minori ma con capacità aggiunte a mano, come
edit_pluginsounfiltered_html, visibili nel valore serializzato diwp_capabilities; - le password per le applicazioni, introdotte in WordPress 5.6, che permettono di usare l’API REST senza la password principale: si elencano con
wp user application-password list <utente>; - account legittimi ma non più usati, come quelli di ex collaboratori o di agenzie, che sono spesso la porta d’ingresso originale.
Rimuovere senza perdere contenuti
Prima di eliminare un utente sospetto conviene annotarne i dati, perché data di registrazione e indirizzo email aiutano a collocare l’attacco nel tempo. Poi lo si elimina assegnando gli eventuali contenuti a un utente legittimo, e si chiudono tutte le sessioni aperte:
wp user delete 57 --reassign=1
wp user session destroy --all
wp config shuffle-salts
Rigenerare le chiavi e i salt di wp-config.php invalida tutti i cookie di accesso, compresi quelli che l’attacco potrebbe aver rubato. Infine vanno cambiate le password di tutti gli amministratori rimasti e attivata l’autenticazione a due fattori.
Un amministratore fantasma è quasi sempre il sintomo di qualcos’altro: una vulnerabilità, una password debole, un trigger nel database che lo ricrea. Eliminarlo è necessario, ma la pulizia è completa solo quando si è capito da dove è arrivato.