Il contesto
Un’associazione di volontariato di provincia, con un centinaio di soci e una trentina di volontari attivi, che organizza l’accompagnamento di persone anziane alle visite mediche e una raccolta alimentare due volte l’anno. Nessun dipendente, un bilancio di poche migliaia di euro, un direttivo che si riunisce una sera al mese. Il sito, su WordPress, era stato realizzato sette anni prima da un volontario appassionato di informatica: pagine di presentazione, un calendario delle attività, il modulo per diventare soci e le istruzioni per il cinque per mille. Poi il volontario si era trasferito per lavoro in un’altra regione, e il sito era rimasto lì, «tanto funziona». Per riservatezza, nome dell’associazione, luogo e dettagli che permetterebbero di identificarla sono stati omessi o modificati.
I sintomi
A settembre una socia, cercando su Google il numero di telefono per prenotare un accompagnamento, ha trovato sotto il nome dell’associazione una serie di risultati strani: pagine in giapponese e in inglese che pubblicizzavano borse di marca e integratori, tutte con l’indirizzo del sito. Accanto al risultato principale compariva l’avviso «Questo sito potrebbe essere stato compromesso». Aprendo il sito dal computer tutto sembrava normale, e proprio questo ha fatto pensare, all’inizio, a un errore di Google.
Il presidente ha chiesto al direttivo chi avesse le password del sito. Nessuno. Nessuno sapeva nemmeno con precisione dove fosse ospitato, a nome di chi fosse registrato il dominio o se qualcuno ricevesse le comunicazioni di Google. È una situazione molto più comune di quanto si pensi, e non solo nel terzo settore: il sito esiste, ma non ha un proprietario.
Riprendere le chiavi
Il tesoriere ci ha contattato chiedendo un preventivo per «togliere il virus». La prima cosa che gli abbiamo spiegato è che il nostro tempo di intervento parte dalla ricezione degli accessi, e che quindi il primo lavoro spettava all’associazione: ritrovare le chiavi. Lo abbiamo aiutato a fare l’inventario con alcune domande semplici, e la ricostruzione ha richiesto una settimana.
- Il dominio. Una ricerca nel database pubblico dei nomi a dominio mostrava il registrar, ma non il titolare. Il vecchio estratto conto dell’associazione ha fatto il resto: il rinnovo annuale era addebitato sulla carta personale del volontario, che il direttivo è riuscito a rintracciare. Il dominio era intestato a lui, come persona fisica. Con la sua collaborazione è stata avviata presso il registrar la procedura di cambio del titolare a favore dell’associazione, con il codice fiscale dell’ente e un indirizzo email condiviso del direttivo.
- L’hosting. Era un piccolo piano condiviso, sullo stesso account del registrar e con la stessa email personale. Una volta ottenuto il cambio dell’indirizzo di contatto, il presidente ha potuto reimpostare la password del pannello e scaricare i dati di accesso a SFTP e database.
- WordPress. L’unico amministratore conosciuto era il volontario, che non ricordava la password e usava un indirizzo email non più attivo. Con l’accesso al pannello abbiamo potuto creare un nuovo amministratore intestato all’associazione.
- La Search Console. La proprietà del sito era verificata solo con l’account del volontario. Con l’accesso ai DNS l’associazione ha aggiunto il record di verifica per il proprio account Google e ha finalmente visto il rapporto sui problemi di sicurezza: mesi di avvisi mai letti da nessuno.
Con gli accessi finalmente in mano, l’associazione ha scelto il servizio con intervento entro 24 ore, il più adatto a un sito senza commercio elettronico e a un bilancio da volontariato.
Cosa abbiamo trovato a livello applicativo
Il sito girava con una versione di WordPress di sei anni prima, un tema non più mantenuto e undici plugin, sette dei quali non aggiornati da anni e due ritirati dalla directory ufficiale per problemi di sicurezza. Era un bersaglio facile, e infatti non era stato colpito una volta sola.
L’infezione principale era un classico spam SEO giapponese: un gruppo di file nascosti tra quelli di un plugin per i moduli generava migliaia di pagine pubblicitarie, visibili solo quando la richiesta arrivava da un motore di ricerca. Ai visitatori normali il sito mostrava le sue pagine di sempre, ed è per questo che nessuno se n’era accorto. Una sitemap aggiuntiva, creata nella radice del sito, segnalava a Google le nuove pagine. Accanto a questa c’erano i resti di almeno due infezioni più vecchie: backdoor negli upload con date di anni diversi e tre amministratori sconosciuti, due dei quali mai usati, come succede spesso con gli amministratori fantasma. Il modulo per diventare soci, basato su uno dei plugin ritirati, era con ogni probabilità la porta d’ingresso iniziale.
C’era anche un aspetto che al direttivo interessava più di tutto: i dati dei soci. Le richieste di adesione arrivate dal modulo erano salvate nel database, con nomi, indirizzi e numeri di telefono di oltre duecento persone. Non abbiamo trovato segni di esportazione di quelle tabelle, ma con backdoor attive per mesi non si poteva escluderlo; abbiamo quindi fornito all’associazione gli elementi per valutare, con il proprio consulente, gli adempimenti previsti in caso di violazione dei dati personali.
Cosa abbiamo trovato a livello di sistema
Su un hosting condiviso il margine d’azione a livello di sistema è limitato, ma non nullo. Nel pannello c’era un’attività pianificata, creata dall’attaccante, che ogni sei ore richiamava uno dei file di spam per rigenerare la sitemap. Nella cartella principale dell’account, accanto al sito, c’era poi una vecchia installazione di prova di WordPress, dimenticata dal volontario anni prima: anch’essa infetta e, condividendo lo stesso utente del sito principale, in grado di riscriverne i file. È il problema descritto nell’articolo sulla contaminazione incrociata sugli hosting condivisi. Il provider, interpellato, ha confermato che gli altri account del server non erano coinvolti.
Come l’abbiamo rimosso
Dopo aver salvato una copia completa di file, database e log, abbiamo:
- eliminato l’attività pianificata e l’installazione di prova, dopo averne conservato una copia;
- reinstallato da fonti ufficiali l’ultima versione di WordPress e un tema mantenuto, adattato per conservare l’aspetto del sito;
- ridotto i plugin da undici a quattro, sostituendo quelli ritirati con alternative mantenute, compreso un nuovo modulo di adesione che non conserva più i dati nel database ma li invia all’indirizzo del direttivo;
- ricopiato dagli upload solo immagini e documenti, dopo averli controllati, e rimosso le backdoor e la sitemap falsa;
- eliminato gli amministratori sconosciuti e quello del volontario, e cambiato tutte le credenziali: WordPress, database, SFTP, pannello, chiavi e salt;
- fatto restituire alle pagine di spam il codice 410, che dice a Google che non esistono più, e verificato il risultato simulando le richieste di un motore di ricerca.
Poi, con il tesoriere, abbiamo seguito dalla Search Console la procedura descritta nell’articolo sulla rimozione dalle blacklist di Google: inviata la sitemap corretta, segnalati gli indirizzi da rimuovere e richiesta la revisione dei problemi di sicurezza, con una breve descrizione di cosa era stato trovato e di cosa era stato fatto.
L’hardening
Per un’associazione senza tecnici, l’hardening migliore è quello che non richiede interventi continui. Abbiamo attivato gli aggiornamenti automatici di WordPress e dei quattro plugin rimasti, bloccato l’esecuzione di PHP negli upload e la modifica dei file dalla bacheca, attivato l’autenticazione a due fattori per i due amministratori e un backup giornaliero conservato fuori dall’hosting, con trenta giorni di storico. Il monitoraggio dell’integrità dei file invia un avviso all’indirizzo condiviso del direttivo se compare un file PHP nuovo.
Un piano di manutenzione su misura
La vera causa del problema non era un plugin, ma l’assenza di qualcuno responsabile del sito. Per questo abbiamo concordato con il direttivo un piano semplice, pensato per volontari che hanno poco tempo e nessuna competenza tecnica, e con costi contenuti: il dominio, un piano di hosting con backup inclusi e un gestore di password con un piano gratuito o scontato per il non profit.
Le regole di fondo sono tre. Ogni accesso è intestato all’associazione, non a una persona, e passa per un indirizzo email condiviso del direttivo, così le comunicazioni del registrar, del provider e di Google arrivano sempre a qualcuno. Ogni chiave è custodita in un gestore di password condiviso e almeno due persone possono usarla. E a ogni rinnovo del direttivo il passaggio delle chiavi è un punto all’ordine del giorno, come la consegna della cassa: chi lascia un incarico esce anche dagli accessi.
Il risultato
Il sito è stato dichiarato pulito entro le 24 ore previste dal servizio. Google ha accolto la richiesta di revisione in quattro giorni e l’avviso accanto al risultato è scomparso; le pagine di spam sono uscite dall’indice nel giro di un mese, e oggi chi cerca il nome dell’associazione trova di nuovo il numero per prenotare un accompagnamento. Nei due mesi successivi il monitoraggio non ha registrato modifiche non autorizzate. L’associazione ha ricevuto un rapporto con le cause, gli interventi e il piano di manutenzione, scritto in modo da poter essere letto anche da chi non si occupa di informatica.
Cosa insegna questo caso
Un sito dimenticato non resta fermo: invecchia, e prima o poi qualcuno se ne accorge, spesso non il proprietario. In questo caso la parte più lunga non è stata la bonifica, ma ritrovare le chiavi, perché tutto dipendeva da una persona generosa che aveva fatto il sito a titolo personale e poi, com’è normale, era andata avanti con la sua vita. Non serve un reparto informatico per evitarlo: servono accessi intestati all’ente, due persone che sanno dove sono e un piccolo appuntamento fisso sul calendario.
Rimozionemalware.com è il servizio di bonifica dei siti WordPress di Managed Server S.r.l., che gestisce server e hosting dal 2005. Interveniamo sull’applicazione e sul sistema, con tempi garantiti di 6, 12 o 24 ore per ogni installazione di WordPress, calcolati dalla ricezione degli accessi. Se il sito della tua associazione mostra risultati strani su Google, o se non sei più sicuro di chi ne abbia le chiavi, puoi contattarci.