headermask image

header image

Cosa c’è di buono

Ben arrivati, o bentornati. Ecco alcune letture interessanti che si possono trovare in questo sito.
There are documents in english language, too.

Il mio libro Windows XP in sicurezza pubblicato da Apogeo come e-book gratuito. Leggetelo!

Un manuale sulla crittografia pratica, per Windows e Linux, con GnuPG, gratuito e leggibile on-line.

Per chi sta pensando di installare Linux, consiglio la lettura di Linux per Futili Motivi, Prima di installare Linux e Linux virus e antivirus, per sapere se Linux è la soluzione ai nostri problemi, e soprattutto cosa ci aspetta se decidiamo di installare.

Se poi comunque si decide per installare, e si sceglie Fedora, la mia distribuzione di riferimento, c’è una nutrita schiera di documenti a cui attingere:

Per chi vuole essere avvertito dell’arrivo di nuovi articoli può iscriversi al feed.

Se invece avete qualcosa da dirmi, qui trovate come contattarmi.

Buona lettura, e grazie per la visita.

Ne vale la pena. Eccome!

Qualche giorno fa mi sono lasciato andare ad uno dei miei momenti di sconforto (il termine appropriato sarebbe un altro, ma lasciatemelo passare così…), lamentandomi in sostanza che il mondo è brutto, sporco e cattivo.

Mi stavo chiedendo da un po’ se valesse tutto il tempo perso e lo sbattimento per avvertire gente del fatto di avere il sito bucato e schiavizzato da gente priva di scrupoli. In effetti i risultati ottenuti erano piuttosto scarsi, e tutto sommato molto frustranti. Insomma, ero convinto di fare qualcosa di meritevole. Ma le reazioni erano spesso sconcertanti, per non parlare delle poche risposte ottenute.

Ma in questi giorni qualcosa è cambiato, nel senso che sono successe un po’ di cose che in effetti non mi aspettavo, e che mi hanno dato una vigorosa spinta per continuare il lavoro fatto fino ad ora.

A volte ne vale la pena. Molto.

Grazie di cuore a Sauro, Suzukimaruti, Andrea ed altri che non posso citare per riservatezza.

Owned Wordpress blog: ricapitolando

Riassumo qui tutto quello che ho scoperto sull’attacco massivo in atto contro i blog basati su Wordpress.

La situazione

Wordpress in versione precedente alla 2.5.x è vulnerabile ad una vasta gamma di attacchi che non sono contrastabili se non in un unico modo: tenere aggiornato Wordpress. Non esistono altri metodi, non per i comuni mortali.

L’attacco è generalizzato, nessuno è al sicuro. Se il blog è presente nei motori di ricerca (Google, MSN, Altavista, Yahoo, ecc.) è solo questione di tempo. La riuscita dell’attacco è indipendente dal tema utilizzato, riesce anche con il tema di default. Quello dei temi infetti è un altro problema.

Se il blog viene compromesso, un aggiornamento non risolve, e non risolve neanche una sommaria ripulita al database: l’intrusione è profonda e su molti fronti. Se ci si limita ad un aggiornamento ed a una sommaria pulizia del database, in breve il blog sarà di nuovo compromesso. Ci sono blog con Wordpress 2.5.1 con lo stesso problema e ci sono stati casi di blog violati, i cui proprietari sono stati avvertiti da me, puliti sommariamente e ri-violati nel giro di mezzora. Quindi la pulizia deve essere totale, come spiegato qui.

La sequenza di intrusione

Questa è verosimilmente la sequenza che porta alla violazione del blog. E’ ricostruita sulla base degli esemplari di codice e database forniti da persone coraggiose che non finirò mai di ringraziare. E che dovreste ringraziare tutti.

Selezione del blog bersaglio

L’attaccante cerca i blog basati su Wordpress con semplicissime query ai principali motori di ricerca. Usa strumenti automatizzati, che gli garantiscono di riuscire a trovare un gran numero di possibili bersagli. Attraverso una forma di fingerprinting determina la versione di Wordpress installata nel bersaglio. A questo proposito è del tutto inutile nascondere la versione che viene inserita nel tag apposito:


<meta name="generator" content="WordPress 2.5.1" />

l’attaccante usa un algoritmo molto più sofisticato per determinare la versione, ed ignora del tutto, o quasi, la stringa nell’header della pagina HTML emessa da Wordpress. Per dare un’idea, viene controllata l’esistenza di alcuni file e directory caratteristiche di certe versioni, come pure il formato dei feed.

Creazione di un amministratore abusivo

Attraverso un attacco di tipo SQL injection, sfruttando le suddette vulnerabilità di Wordpress, viene creato un amministratore “abusivo” del blog. Il tipo di attacco è calibrato sulla versione di Wordpress rilevata, quindi ce n’è per tutti. L’amministratore creato con questa tecnica è invisibile dal pannello di amministrazione utenti (dettagli qui), a meno di usare trucchi o di esaminare direttamente il database. L’utente abusivo si chiama di solito “WordPress” (la ‘W’ e la ‘P’ maiuscole), ma non è detto che rimanga così.

Iniezione dei primi file

Una volta ottenuto l’accesso amministratore, viene esaminato lo spazio di hosting, per capire se e quali file e directory permettono la scrittura e la modifica dei file, se è permesso il download e l’esecuzione diretta di script PHP da altri siti e varie altre impostazioni. Se la directory dei temi è scrivibile, viene inserito un file PHP con un nome camuffato o insospettabile in uno dei temi installati, di solito quello “Classic”, che nessuno va a guardare. Tipicamente ha il nome di un altro file presente fra quelli del tema, con aggiunto in coda al nome la stringa “_old”, e non è detto che l’estensione sia “.php”. Ho trovato falsi file ZIP, false immagini PNG e JPG. Oppure è un file PHP con un nome verosimile: functions.php, locals.php e simili. Stessa cosa può succedere con la directory dei plugin, dove in qualche caso ho trovato dei falsi file ZIP con lo stesso nome di uno dei plugin installati, in realtà file PHP.
Se nessuna directory o file è scrivibile, tranne quella degli upload o quella dei backup, il file viene iniettato in quelle posizioni.
Se tutti i file sono modificabili dagli script PHP stessi, come succede in alcuni hosting, vengono modificati alcuni file dell’installazione di Wordpress, iniettando poche righe di codice, anche una sola, di solito offuscata o ricodificata in Base64 o simile. Questo semplifica parecchio l’attacco.
In qualche caso, se la configurazione del server lo permette, il file è iniettato nella directory /tmp del server, con il nome che scimmiotta i file di sessione PHP: sess_11a2d23b2……, la stringa esadecimale nel nome è praticamente casuale.
In totale i file iniettati sono almeno due: il plugin camuffato ed una sorta di shell remota che permette di modificare a piacere file ed eseguire comandi impartiti da remoto.

Iniezione di codice e dati nel database

Uno dei file appena iniettati viene inserito come plugin agendo direttamente sulla corrispondente opzione nel database di Wordpress. Naturalmente anche questo plugin “abusivo” è invisibile dal pannello di gestione dei plugin. Il nome può variare, come detto sopra, come pure la posizione. La funzione del plugin è molteplice: iniettare i link di spam al momento della visita dello spider di uno dei motori di ricerca noti, controllare che il codice iniettato sia presente ed attivo, altrimenti operare automaticamente l’iniezione del codice negli script PHP originali. Ecco uno dei motivi per cui la semplice reinstallazione, o l’aggiornamento, e la sommaria pulizia del database non funziona: anche cancellando l’utente abusivo e togliendo i link di spam, il plugin rimane attivo, per via della posizione in cui è nascosto il file, ossia nel tema, cosa che si tende a preservare, negli upload o nella directory /tmp a cui non si pensa proprio. Alla prima occasione il plugin rimette tutto a posto. Il blog, anche se aggiornato all’ultima versione di Wordpress, è già compromesso.
Altro gruppo di dati che viene inserito è il blocco dei link spam. E’ nascosto nel database come opzione fasulla di Wordpress, oppure nella cache dei feed letti dai vari blog di sviluppo e news che si vedono nel pannello di amministrazione, ed è una lunga stringa, oltre 16kb, codificata in Base64, preceduta dalla stringa eval(base64_decode(, in qualche caso è anche rovesciata, quindi in testa non ha niente, ma in coda è presente la stringa: (edoced_46aseb(lave. In altri casi, i link non sono nel database, ma nel file wp-includes/class-mail.php, che non appartiene ai file standard dell’installazione. Il file è un array serializzato con apposite funzioni PHP (dettagli qui). Questo però nelle versioni più vecchie. Nelle ultime versioni in mio possesso il file non esiste più e viene usato il database, più complicato ma molto meno visibile.
In un paio di casi ho trovato nel database anche una copia di uno dei file iniettati, ricodificato anch’esso in Base64 per nasconderlo. Probabilmente è una copia di riserva da recuperare ed attivare se il blog viene ripulito dal proprietario.

Modifica del file index.php

Se l’hosting ha una configurazione di sicurezza “debole”, e quindi permette la modifica da parte degli script PHP stessi di tutti i file dell’installazione di Wordpress, viene cambiato il file index.php nella directory principale del blog. Nelle versioni da me esaminate c’era una istruzione di include di un file preso da un sito remoto. Questo file è quello che opera il redirect verso i siti di spam, di solito farmacie online. Non sono riuscito a mettere le mani su questo file, il download è probabilmente subordinato ad una qualche forma di protezione, tipo il controllo dello user agent o dell’indirizzo IP di chi chiede l’accesso al file. Vista la complessità e l’organizzazione dell’attacco, non mi stupirebbe che sia fatto un controllo verso un database di siti compromessi prima di consentire l’accesso al file.
Non tutti i siti hanno questa variante. Dipende molto dalla versione e dalla configurazione del server. Ma quelli che la possiedono vengono inclusi nelle liste di link in altri blog violati, per consentire appunto la ridirezione al sito degli spammer.

Altri file modificati

Il codice usato nell’attacco è in diverse varianti, e ci sono segnali che è in continua evoluzione, cambiando ed affinando le tecniche sia di intrusione che di evasione dei controlli. In qualche caso ho trovato del codice inserito come action, nel file wp-includes/default-filters.php. Lo stesso file conteneva una sorta di sistema di esecuzione di codice da remoto (dettagli qui), con tanto di autenticazione tramite cookie.

Come accorgersene

Non è per niente banale. Ci sono decine di blog italiani violati e centinaia in tutto il mondo, e nessuno dei proprietari si accorge di nulla. A differenza delle prime varianti, dove si avevano malfunzionamenti che potevano insospettire, le versioni ora in circolazione sono molto meno banali, e sono molto difficili da trovare “per caso”. Chi ha sviluppato il codice ed il metodo di violazione è partito dall’obbiettivo di nascondere il più possibile al legittimo proprietario ed ai visitatori abituali la presenza della violazione. Presenza che sfugge anche ad un controllo sommario. Se non si opera in modo mirato, non si noterà nulla di strano. Ho attrezzato un test di “infezione”, che esegue alcuni semplici controlli sulla pagina principale del blog, cercando i segni, assolutamente non evidenti, dell’infezione. Segni che potrebbero a breve cambiare e rendere inefficace il controllo stesso. Per questo motivo non posso per ora aprire il codice del controllo o descriverne nei dettagli il funzionamento. Se gli spammer scoprono i punti deboli del mio controllo, e ve ne sono, lo possono rendere inefficace in breve tempo, ed avremmo tutti un’arma in meno. Altra strada per trovare i segni dell’infezione è descritta qui, in un breve documento che ho scritto specificamente per CFItaly. E’ chiaramente un documento diretto a persone dotate di specifiche conoscenze e non una ricetta passo passo, quindi non è assolutamente fruibile per gli utenti “fai-da-te”. Nessuna connotazione dispregiativa in questo, ma se non si possiedono alcune competenze specifiche è del tutto inutile leggere un simile documento.

Come uscirne

Una procedura a grandi linee l’ho descritta qui. Occorre tenere presente che il metodo di attacco cambia continuamente, e chi ha sviluppato il kit del perfetto devastatore di blog non è un cretino qualsiasi: è una persona con competenze molto al di sopra della media degli sviluppatori web, ed in generale anche alla media degli sviluppatori in generale. Sia il test che la procedura per ora dovrebbero funzionare su tutte le varianti, anche sulle più recenti. La procedura è generica, nel senso che segue le linee guida delle normali operazioni da fare quando si ha a che fare con un server violato, ossia parte dal presupposto che niente sul quel server è più affidabile, anche i comandi più semplici. Quindi dovrebbe continuare ad essere utilizzabile anche se lo schema di infezione dovesse cambiare totalmente.
Quello che forse potrebbe smettere di funzionare è il test, a causa di quanto detto sopra. Inoltre c’è il problema che per me è sempre più difficile reperire codice infettato, ossia il contenuto dei blog colpiti, sia come file che come dump del database.
Naturalmente nelle mail che ho inviato a molti c’era la richiesta, ma i più la ignorano. Questo sta togliendo a tutti noi un’arma potentissima: il codice stesso dell’infezione, quindi la possibilità di esaminare come opera e quali sono i suoi punti deboli. Senza quel codice non si può fare nulla.

Temi ed equivoci

Qualche settimana fa il test che ho attrezzato ha avuto un minimo di risonanza in Rete, ma con un problema: è stato scambiato per un test volto ad appurare se il tema è “infetto”. Il problema dei temi troianizzati è in realtà molto differente, e riguarda un altro aspetto della sicurezza di Wordpress. Ho scritto un altro articolo in proposito qui. Per ora il tutto si limita ad un modo per iniettare pochi link di spam, una decina al massimo, nel footer del blog, ed in più a proteggere il tema dalle modifiche, inserendo codice offuscato e ricodificato nel file footer.php.
Ma… c’è un grosso ma. Se dovesse succedere che l’attacco in corso esaurisse la sua efficacia, niente ci può garantire che il prossimo veicolo di infezione siano proprio i temi scaricati ed installati senza verificarne la provenienza. Il metodo è semplicissimo da applicare: una volta che abbiamo inserito un file PHP nel nostro sito senza appurare cosa faccia, per chi ha nascosto codice malevolo nel tema è un gioco da ragazzi violare il nostro blog.
Quindi, chiarito che il mio test NON può verificare se il tema installato in un blog è “infetto” o troianizzato, l’unica possibilità è di installare solo i temi di cui possiamo verificarne la provenienza o quelli di cui possiamo controllare agevolmente il codice. La semplice presenza di stringhe codificate in Base64 ed eseguite con una istruzione eval() è un segno molto poco rassicurante. Ma il mio test non può controllare questo. E’ impossibile. E’ vero però che l’infezione rilevata dal mio test è infinitamente più pericolosa.

Conclusione

Come ho già spiegato qualche tempo fa, non è facile fare il webmaster. Le conoscenze necessarie sono tante e in ogni caso potremmo non avere quelle giuste per fronteggiare una situazione come questa che stiamo affrontando.
Se poi ci si mette la faciloneria e la leggerezza nel fare le cose, il rischio di rimanere scottati è molto alto. Per carità, nessuno vuole impedire alle persone di esprimersi liberamente, se però siamo a corto di competenze, e solo perché non è il nostro campo, ci sono validissime alternative a fare il blogger fai-da-te, basta riconoscere con un po’ d’umiltà che forse è al di là delle nostre capacità. Blogspot, Splinder, Wordpress.com e tanti altri sono a disposizione per chi vuole concentrarsi su quello che ha da dire, invece di trovarsi invischiato in grossi guai. Questa è la mia opinione. Poi ognuno è libero e consapevole delle sue scelte, quindi niente da dire se si preferisce un hosting e la scelta di fare da sé. Solo che Internet è un luogo ostile.

Per cui occhi aperti e Trust no one.

Owned Wordpress: the day after

Alla fine, nonostante tutta la nostra attenzione, è successo: siamo vittima di una intrusione nel nostro blog, basato su Wordpress.

I primi sentimenti sono rabbia e vergogna, anche se a pensarci bene c’è poco da vergognarsi: come se fosse colpa nostra se dei mentecatti vanno in giro a sfasciare il lavoro degli altri…

Cosa fare? Ecco una breve guida su come rimettere in piedi il nostro amato blog. Naturalmente non è la guida definitiva, i nostri amici mentecatti riescono a fare cose realmente abominevoli, ma dovremmo essere in grado di recuperare la quasi totalità dei casi.

Come al solito, andiamo con ordine.

Salvare il salvabile

Per prima cosa facciamo un backup completo del database di Wordpress. Di seguito facciamo anche una copia completa del contenuto dell’installazione del blog sul server, ossia tutti i file contenuti nello spazio di hosting. Questo perché il nostro amico mentecatto ha certamente piazzato le sue mine in giro per le varie sottodirectory del sito. In molti casi sono file apparentemente innocenti, con il nome che termina in _old, come se fosse un nostro file salvato per una modifica. Non è detto che siano file PHP, possono essere JPG, PNG, JS, qualsiasi cosa, ma dentro contengono tutt’altro, e possono essere inclusi ed eseguiti da altri file PHP, oppure “chiamati” direttamente con l’URL per eseguirli ed attivarli.

Se avete un amico di cui vi fidate, e che sia molto pratico di Wordpress, database, PHP e cose di questo tipo, potete fornirgli tutti e due i gruppi di dati: potrà indicarvi come e dove sono piazzate le mine.

Potete anche mandarli a me, dietro accordi preliminari. Nel database vi è tutta la vostra produzione, ma non è quella che mi interessa, se volessi potrei prenderla direttamente dal sito, visto che è pubblicata, come pure i file dell’installazione di Wordpress che, ricordiamolo, è un Open Source, quindi non c’è nulla di segreto. Mentre è importantissimo poter esaminare come opera il nostro amico mentecatto, per poterlo contrastare efficacemente. Per questo ho bisogno sia del backup completo del database che di tutti i file contenuti dentro l’installazione del blog, anche di quelli che credete di aver messo voi. Ma questo non è assolutamente obbligatorio. Naturalmente, se volete che possa continuare a contrastare il nostro amico mentecatto, scrivendo ad esempio documenti come questo, o tenendo aggiornato il test di contagio, ho assoluta necessità dei dati del vostro blog violato.

Ma andiamo avanti con le operazioni di bonifica.

Abbiamo due possibilità: tentare una bonifica andando ad eliminare le mine una alla volta, ma posso assicurarvi che non è per niente banale, il nostro amico mentecatto ha fatto bene il suo lavoro; oppure ripartire da una installazione pulita, che è la situazione che vi consiglio caldamente.

Di seguito facciamo una operazione di Export, tramite la funzione apposita nel pannello di amministrazione di Wordpress. Questa funzione genera un file con tutto il contenuto originale di Wordpress: articoli, commenti, categorie, tag, insomma, tutto quello che conta. Quello che è certo è che lascia fuori quasi certamente tutte le mine disseminate dal nostro amico mentecatto. Solo nel caso, visto in alcuni blog, di link spam nascosti in normali articoli, questi rimarranno: occorrerà pulire gli articoli uno ad uno, ma non è una mina, è solo codice HTML, statico, niente di pericoloso. Basta ripulirlo editando l’articolo, ma lo faremo dopo.

Edit delle 17.15
Se il nostro blog ha una versione molto vecchia di Wordpress, precedente alla versione 2.1.x, non c’è la funzione di Export, disponibile appunto a partire dalla versione 2.1.x. Una soluzione percorribile può essere di fare un aggiornamento “di comodo” del solo codice del blog alla versione 2.2, 2.3 o 2.5, usando il tema di default e disabilitando tutti i plugin, per poter utilizzare l’esportazione, poi procedere con il seguito delle operazioni.

Via tutto

Via il database, via tutti i file nello spazio di hosting. Ma proprio tutto. Deve rimanere il vuoto. Il database deve essere cancellato, o quanto meno eliminate tutte le tabelle, anche se il nostro amico mentecatto potrebbe averne create di proprie, quindi meglio eliminare tutto.

Se proprio vogliamo essere gentili con i nostri visitatori e lettori, carichiamo un bel file index.html con un cartello “Chiuso per Manutenzione”, che abbiamo preparato in anticipo. Niente PHP, mi raccomando.

Il nuovo database

Adesso possiamo creare la nuova installazione, partendo appunto dal database. Per prima cosa cambiamo la password di accesso al database. Il mentecatto ha avuto accesso a tutti i file dell’installazione, tra cui il prezioso wp-config.php, che contiene utente e password del database. Quindi dobbiamo cambiare almeno la password di accesso. Se poi il nostro servizio di hosting lo permette, cambiamo anche il nome del database e dell’utente usato da Wordpress, oltre alla password. I dati che il mentecatto ha in mano devono diventare inutili.

Wordpress, ultima versione

Andiamo sul sito di Wordpress e prendiamo l’ultima versione rilasciata. Installeremo quella e non la vecchia: se rimettiamo quella che avevamo prima, stiamo di nuovo consegnando il nostro blog nelle mani del mentecatto. Se non potete aggiornare per via di quel bellissimo tema che avevate, o di quei plugin irrinunciabili che sulla nuova versione non funzionano, buttate tema e plugin: non aggiornando consegnate il blog al mentecatto. Senza eccezioni. Al diavolo temi e plugin.

Non ci sono altre possibilità, né se o ma: dovete aggiornare all’ultima versione di Wordpress, questa è l’unica cosa irrinunciabile.. Altrimenti tanto vale che rimanete col blog compromesso, in compagnia del mentecatto che scrive le sue cose insieme a voi. Se pensate che siano battute o esagerazioni, non sarò io a sprecare il fiato per convincervi del contrario: smettete di leggere immediatamente questo testo, stiamo sprecando tempo in due, io a scriverlo e voi a leggerlo. E salutatemi tanto il mentecatto. Che, lo ricordo è un amministratore del blog, quindi può fare di tutto, anche buttarvi fuori dal blog.

Fatta l’installazione pulita, possiamo partire con l’attivazione del nuovo blog. Ovviamente il nuovo file wp-config.php conterrà tutt’altre cose rispetto al vecchio. Già che ci siamo possiamo anche dare una rinforzata alle difese del blog, come spiegato qui.

Una volta attivato il nuovo blog, possiamo ricreare gli utenti, facendo attenzione a cambiarne le password di accesso. Il mentecatto ha avuto accesso al database, che le contiene sotto forma di hash non reversibile, ma esistono le rainbow tables, quindi meglio stare sul sicuro. Tanto più che le password nel database sono cifrate (non è proprio così, ma non stiamo a sottilizzare), ma quelle che inseriamo per entrare arrivano in chiaro e il mentecatto può aver messo un frammento di codice PHP per intercettarle e leggerle prima che siano trasformate in hash.

Poi passiamo a riconfigurare le opzioni di funzionamento del blog, secondo i nostri gusti e necessità.

Tema e plugin

Possiamo ora rimettere quei plugin che funzionano con la nuova versione di Wordpress, ma installando i file presi dal sito originale del plugin, non quelli presi dal backup del blog. Prenderemo ovviamente le ultime versioni, e scarteremo senza pietà quelli che non funzionano.

Stessa cosa per i temi, facendo attenzione a non installare un tema troianizzato, cosa assolutamente da evitare. Se il vecchio tema non funziona con la nuova versione di Wordpress, pazienza, ne useremo uno nuovo. Non useremo nessun file preso dalla vecchia installazione, pena l’invito al mentecatto a rientrare nel blog.

Ripristinare i file in upload

Ora arriva la parte più delicata. Occorre rimettere sul sito i file che avevamo caricato nel tempo, durante la normale attività. Immagini, documenti PDF, presentazioni, file audio o video, insomma tutti i nostri contenuti. Se pensiamo di prendere la directory uploads dalla vecchia installazione e rimetterla al suo posto, abbiamo già sbagliato. Andiamo a prendere i file originali e li metteremo al loro posto, se li abbiamo, altrimenti possiamo riutilizzare quelli del backup, ma prima li controlliamo uno ad uno, aprendoli per esaminarne il contenuto. Non ci fideremo di quello che dice il nome del file: lo apriremo e ne ispezioniamo il contenuto. Se è una immagine, la apriremo col nostro programma di visualizzazione o editing preferito. Se è un PDF, lo scorreremo per vedere che sia un PDF, e non qualcos’altro. Con l’occasione, possiamo togliere quelli non più utilizzati, col vantaggio di guadagnare un po’ di spazio sprecato, che non fa mai male.

Non è un passo che si può saltare, e non deve essere sottovalutato. In quei pochi blog che ho potuto esaminare personalmente, il mentecatto aveva piazzato le sue mine ogni volta in un posto differente: come falso file Javascript, come immagine nel tema, rinominata _old.jpg, come finto file .zip con lo stesso nome di un plugin installato, tanto per fare qualche esempio. Tutti invece erano file PHP che venivano inclusi ed eseguiti da un altro pezzo di codice iniettato dal mentecatto. Se puliamo tutto e poi lasciamo anche uno solo di questi file negli upload, stiamo lasciando un invito gratuito al mentecatto. Che non esiterà ad accettare, e saremo daccapo.

Rimettiamo dentro tutto il resto

Ora che tutto è in ordine, possiamo usare la funzione di Import dal pannello di amministrazione di Wordpress e caricare il file salvato in precedenza. Al termine del caricamento, la funzione di Import ci chiederà la corrispondenza fra i vecchi autori ed utenti ed i nuovi, così da associare correttamente la proprietà di ogni articolo.

Restart

Dovremmo aver terminato. Naturalmente faremo un giro di ispezione al blog, per vedere che immagini, articoli, categorie e tag siano al loro posto. La procedura è lunga e faticosa, ma l’intrusione è molto pesante e subdola, per cui è assolutamente necessario operare in condizioni di assoluta sicurezza. Ecco il motivo delle cancellazioni di database e file, dei cambi di password e dell’ispezione accurata di tutto il materiale.

La convalescenza

Ora il nostro amato blog è a posto. Da ora in poi aggiorneremo sia Wordpress che i plugin ad ogni rilascio. E se un plugin smette di funzionare, vi rinunceremo, piuttosto che ritardare l’aggiornamento di Wordpress: il mentecatto è sempre là fuori in attesa di un nostro momento di disattenzione.

Tutti i passi sono fondamentali

Se pensiamo di fare le cose in fretta, saltando uno dei passi, non risolveremo niente. Vi sono blog che hanno tutti i segni di un aggiornamento affrettato, senza pulizia del database e degli upload, e contengono centinaia di link di spam nascosti negli articoli. Il mentecatto ha provveduto a fare l’unica cosa che poteva: da amministratore ha modificato qualche articolo per includere i link, nascosti con un comando di stile CSS. E’ ancora lì, annidato nel blog.

Altri blog sono tornati ad essere compromessi. Il mentecatto sa che voi tenterete l’aggiornamento ed ha preso tutte le contromisure. Rimarrà nascosto fino a quando sarà certo di averla scampata, poi tornerà a prendere possesso del vostro blog.

Conclusione

Chiudo qui. Sono a disposizione per chiarimenti e per aiutarvi, non voglio niente in cambio. Vi chiedo solo di non sottovalutare il fatto di avere un sito compromesso. Al recente convegno di CFItaly ho parlato di come un blog compromesso può essere sfruttato per commettere crimini, non solo di tipo informatico (vedere la mia presentazione qui).

Naturalmente vi invito a leggere tutti gli altri articoli sul tema, pubblicati nella categoria Wordpress.

Owned Wordpress autotest: nuovo rilascio

Ho scoperto che alcuni server di hosting non gradiscono la stringa che uso per lo user agent, così l’ho cambiata in una meno “indigesta”.

Ho tolto una delle parole chiave che dava falsi allarmi, e ne ho aggiunte altre due meno problematiche, ma certamente più peculiari.

Il controllo è sempre qui.

Owned Wordpress autotest: versione 1.5 rilasciata

Ho aggiornato il test di controllo per blog compromessi (vedi qui).

Le modifiche sono per lo più cosmetiche: viene stampato l’elenco sia delle parole chiave trovate con il conteggio, sia un campione dei link abusivi. Ho aggiunto alcune parole chiave nuove fra quelle controllate, visto che fra i link spam ora c’è anche la pubblicità per le suonerie dei cellulari.

Ho aggiunto un avviso sulla natura del controllo, che naturalmente è stato equivocato per un controllo sui temi troianizzati, invece che un test per vedere se il blog ci appartiene ancora, cosa un po’ più grave.

Ma di questo ho già parlato. Ieri ho avvisato altre sei persone che si trovano con il blog compromesso, e sono siti importanti. Indovinate un po’? Nessuna risposta.

Penso che a breve lascerò perdere questa indagine, e mi dedicherò ad altro. Il mio tempo è limitato e le cose da fare si accumulano, quindi sono costretto a scegliere.

Per ora non pubblicherò il codice del test per evitare che gli spammer possano cambiare lo schema di infezione e vanificare il controllo. Poi chissà.

Da questo momento, se avete il blog compromesso niente più avvisi e niente più aiuto gratis. Spiacente. Come si dice in inglese: you are on your own.

A proposito di bilanci: Wordpress autotest. Grazie, eh?

E’ passato un po’ di tempo dal rilascio del Test di contagio per Wordpress, e stavo tirando le somme. Rilasciato il 5 giugno, è stato usato ad oggi oltre 1200 volte. Non ho contato quanti blog infetti ha trovato, sicuramente qualcuno.

Quello che è certo è che ha avuto una certa risonanza su vari siti e blog, primo fra tutti il gentilissimo Suzukimaruti, che ha avuto il coraggio (e credetemi ce ne vuole, visto il livello di boria che c’è in giro) di esporre in tutta sincerità i fatti, ammettendo di aver avuto un incidente di sicurezza, ed ha collaborato con me fornendomi i dettagli per rendere ancora più efficace il test di contagio.

Come lui altre persone, poche per la verità, che si sono offerte di passarmi tutto il contenuto del loro blog, codice e dump del database, affinché io potessi esaminarlo e creare non solo il test, ma anche tutta la documentazione che potete leggere su questo sito, a vostro beneficio. Persone a cui è stato assicurato l’anonimato, per motivi che dovrebbero essere lampanti. Per chi si domanda il perché, un suggerimento: boria (degli altri) e wannabe (acari della polvere).

Molti, di cui ho scoperto tramite query di Google e di altri motori di ricerca l’infezione al blog, quella vera, pericolosa, sono stati avvertiti da me personalmente, tramite e-mail o messaggi nel blog, ovviamente dotato di moderazione. Nel messaggio chiedevo se era possibile avere il codice del sito e, in seconda istanza, anche il dump del database, assicurando l’anonimato e chiedendo ovviamente l’autorizzazione alla pubblicazione di quanto avessi scoperto sul modo in cui era stato violato il blog. Pochissimi hanno risposto affermativamente. Una persona, gentilissima, mi ha anche offerto l’accesso diretto allo spazio in hosting, di cui mi avrebbe spedito le credenziali, per indagare sulla tecnica di intrusione e violazione del blog.
Gli altri che hanno risposto ho dovuto anche faticare per convincerli che stavo facendo loro un favore.

Ebbene sappino i signori che se hanno potuto pulire il proprio blog, e se hanno potuto verificarne l’integrità devono ringraziare queste persone che si sono offerte di rilasciare il codice del sito ed il contenuto del database per l’analisi. Loro è il merito, e grazie queste persone lor signori hanno potuto usare quanto messo a disposizione senza alcun onere in questo sito, sotto forma di test e documentazione. Avrei potuto chiedere dei backlink, cosa abbastanza comune nei blog. Nemmeno questo ho chiesto, non so che farmene.

Alcuni hanno equivocato lo scopo del test, confondendolo per un test di “infezione del tema di Wordpress”, che è tutta un’altra cosa, come ho spiegato qui. Col risultato di far stare tranquillo chi ha un tema “troianizzato”, perché il test serve a tutt’altro. Eppure sulla pagina di test c’è spiegato di leggere la documentazione, e nelle avvertenze c’è scritto che non è un test per temi “troianizzati”. Anche su Wordpress-it c’è spiegato chiaramente che non è un test per temi infetti, ma non basta. Evidentemente sono io che non riesco ad essere chiaro.

Tutti gli altri non hanno nemmeno ringraziato.

Ci sono ancora molti blog violati là fuori, ed ogni giorno se ne aggiungono altri, l’attacco è tutt’altro che terminato. Ogni volta che faccio una delle query con uno dei motori di ricerca escono nuovi blog, appena violati. Il codice usato per l’intrusione è in evoluzione rapida, e chi lo sviluppa è uno in gamba, non un cretino qualsiasi. Conosce a fondo PHP, Javascript, AJAX, Wordpress, tutti i protocolli del web. Meglio di chiunque altro nei paraggi, molto meglio di me che ne so veramente poco. Lo scopo dell’intrusione è per il momento di fare solo spam, o di iniettare virus attraverso il browser ai visitatori, ma non è detto che rimanga quello. E se una volta violato ed aperto il vostro blog lo vendessero ad una organizzazione criminale dedita al phishing, o peggio?

Vi trovate “bannati” da google? Ossia del vostro sito non v’è più traccia in Google? Siete entrati nella lista di stopbadware.org? Technorati vi snobba? Avete un blog con Wordpress in versione 2.3.3 o precedente? Allora siete già infetti, o state per diventarlo. Dalla scorsa settimana ad oggi almeno altri 5 blog italiani sono stati violati. Quelli che ho scoperto io, ma potrebbero essere molti di più.

Se arrivate qui condotti da una ricerca per “wordpress violato” o “wordpress compromesso”, basta leggere tutti gli articoli della categoria Wordpress. Il link non lo metto, è qui a fianco nell’elenco delle categorie.

Essere colpiti o meno non è questione di popolarità o di “manico”: è solo fortuna. Ed essere colpiti è tutto meno che una vergogna.

Tant’è. Centinaia di e-mail spedite, il tempo impiegato per scriverle, per spiegare ad ogni vittima dell’intrusione dove guardare e come uscirne, col rischio di passare per un hacker cattivo, o un truffatore, e magari trovarmi anche una querela tra capo e collo. Il risultato? Ditemelo voi.

…forse era meglio non fare bilanci.

Convegno CFItaly giugno 2008: il giorno dopo

Finalmente, ora che il pargolo dorme, la cucina è tornata pulita ed in ordine, posso sedermi un po’ al computer e fissare le idee sulla giornata di ieri.

Non è il primo convegno a cui partecipo come relatore, ma certamente è stato il primo in cui mi presentavo in prima persona.

Finalmente ho conosciuto quelle persone che hanno reso possibile e realizzato concretamente l’evento: Nanni Bassetti, Denis Frati, Gianni Amato, Giancarlo Cucinotta, gli avvocati Gallus e Micozzi (simpaticissimi e preparatissimi).

Gli interventi sono stati tutti validissimi, e mi è molto dispiaciuto per quelli di Gallus e Micozzi, a cui ero particolarmente interessato, accorciati per mancanza di tempo. D’altra parte era il primo convegno organizzato da CFItaly e ovviamente non poteva andare tutto perfetto e liscio.

Il risultato è stato comunque di rilievo, con una buona partecipazione, considerando il particolare argomento e la giovinezza di CFItaly.

Personalmente ho trovato semplicemente sbalorditivo l’intervento di Cucinotta, a cui va un meritatissimo titolo di Hacker di prima classe. Quello che è riuscito a fare il suo reparto ha dell’incredibile.

Un ringraziamento a chi ha partecipato, mostrando pazienza per i piccoli intoppi tipici della prima volta, ma anche coinvolgimento e partecipazione, con le tantissime domande con cui hanno tempestato tutti i relatori.

Per chi è interessato, sul sito di CFItaly si trova il resoconto completo e qualche foto. L’album completo di quelle scattate da me sono in questo set su Flickr.

La mia presentazione è qui:

Wordpress: bello il tuo tema! E’ un trojan?

Nonostante tutte le precauzioni che si possono pensare per proteggere il proprio blog, è facile commettere un errore, installando qualcosa di dubbia provenienza e aprendo una porta a sconosciuti, dritto dentro il nostro sito.

Basta andare in cerca di un tema, ad esempio utilizzando un motore di ricerca, con le parole chiave “free wordpress themes”, e si ottengono parecchi risultati. Ma, per quanto strano possa sembrare, sono proprio i siti da cui occorre diffidare. Ho fatto una breve indagine, prendendo un tema a caso da ognuno dei siti restituiti dalla ricerca, ed ho appurato quanto segue:

  • Tutti i temi sono copiati da quelli originali presenti nel sito themes.wordpress.net o dal sito del creatore del tema, di solito indicato con un link nel file footer.php all’interno del tema stesso. Nessuno dei temi è originale.
  • Tutti i temi scaricati e controllati contengono codice per fare cose certamente poco etiche. Ci sono molti temi contenenti codice offuscato che dopo essere stato “disoffuscato” rivela istruzioni per scaricare ed eseguire codice preso da siti non appartenenti a nessun circuito “ufficiale” di Wordpress. In molti casi si tratta di siti cinesi. Altri temi contengono funzioni in PHP per inserire link spam nella home page del blog in cui vengono caricati. Notare che è una situazione molto diversa da quella dei siti Wordpress violati. Più avanti mostrerò alcuni esempi del codice malevolo.
  • I siti da cui si scaricano i temi sono ben fatti e graficamente molto curati, a differenza di molti altri siti contraffatti. Questo trae in inganno e svia i sospetti.

Esempi di codice malevolo

In un tema, denominato Dragee (il link porta al sito originale), vi era una funzione in PHP, sepolta nel file functions.php, che apparentemente chiama un link per una sorta di contatore per le statistiche di utilizzo, ma esaminando meglio il codice, inserisce il contenuto letto dal sito remoto nella homepage del blog in cui il tema è installato. Ecco un esempio del contenuto inserito:


<div id="refl" style="display: none">
<a href="http://www.pokerando.com" hreflang="it"><b>il casino</b></a>
</div>

In altri temi il contenuto del file footer.php è stato totalmente sostituito da uno script PHP costituito da una sola istruzione:


eval(gzinflate(base64_decode('NdNHkptYA ....... r6+fH99/M/zzGw==')));

E’ un codice offuscato, che in realtà scarica da un altro sito un blocco di dati e lo esegue come codice PHP.

Un altro tema contiene:


<body><?php @eval(@base64_decode('aWYoJFIzN0MwMT ....... Y3MzVBQkMzMDkxNik7')); ?>

Nel tema originale vi è solo il tag body. Anche questo codice, una volta reso in chiaro, scarica qualcosa da un sito remoto e la esegue come codice PHP.

Un altro tema contiene un segmento simile di codice PHP, il cui risultato consiste in una coppia di link a un casinò online ed a una finanziaria, niente di particolare. Il fatto curioso è che il codice è offuscato con oltre 20 annidamenti di codice convertito con differenti metodi, ossia un eval(base64_decode(... che restituisce a sua volta un eval(gzinflate(str_rot13(base64_decode(... che ancora restituisce un eval(base64_decode(..., e via così.

Effetti sul blog

Tutti i temi che ho analizzato possiedono codice in qualche modo malevolo. In tutti i casi è nascosto, mascherato, offuscato o ricodificato, per renderne meno facile l’individuazione.

L’effetto è variabile. In qualche caso si limita ad inserire pochi link, presi da un altro sito, verosimilmente gestito da chi ha manomesso il tema. In molti altri casi viene effettuato un controllo sulla configurazione dell’interprete PHP nel blog in cui il tema è installato, e se questa lo permette scaricano qualcosa da altri server e la eseguono come codice PHP tramite un eval().

Nessuno dei temi analizzati, presi dal sito dell’autore, ossia dal sito originale, mostra codice contraffatto o malevolo.

Conclusioni e avvertenze

Installando uno di questi temi con trojan incluso, invitiamo a casa il nemico. Un blog su cui uno di questi è installato potrebbe essere controllato a piacimento da chi ha inserito il codice malevolo nei file del tema.

Prima di installare un tema scaricato chissà dove, sarebbe il caso di farlo controllare da una persona competente. Non esistono al momento strumenti di controllo automatizzati per verificare la presenza di un trojan in un tema di Wordpress, come non esiste al momento uno strumento per controllare se il tema installato nel blog è colpito da questo problema: chi ha creato il trojan potrebbe aver già preso possesso del vostro blog ed aver nascosto le tracce della sua presenza.

Non esitate a cercare aiuto se non siete ferrati in materia: per la legge il blog è vostro e quello che ci appare dentro è sotto la vostra responsabilità, fino a prova contraria. Prova che non è affatto banale da trovare.

Owned Wordpress Blog: test di contagio

Avete dei dubbi sulla integrità fisica e sulla salute del vostro blog? Fate un test!

Mi spiego. Ho attrezzato una pagina PHP che effettua alcuni test automatici sul blog di cui viene fornito l’indirizzo completo. Il risultato è analizzato alla ricerca dei segni distintivi di questo tipo di intrusione: pagine differenti a seconda dello user agent, link contenenti i soliti farmaci venduti online ed altre stranezze. Al termine del test viene visualizzata una tabellina con i risultati.

Naturalmente, data la automaticità del test, il risultato è tutt’altro che certo, per cui occorre una verifica manuale in caso di segnalazione.

Cosa fa il test

  • Tenta l’identificazione della piattaforma su cui si basa il sito, tramite un semplice fingerprinting: controlla se esiste una pagina di login, se nella home page esiste la parola “wordpress”. Se non trova questi segni caratteristici stampa un avviso ed esegue comunque il controllo. Ovviamente se si esegue il test su un sito non basato su Wordpress il risultato è privo di senso, o comunque non significativo.
  • Legge più volte la pagina principale del sito. Una volta la legge presentandosi come spider di un noto motore di ricerca, poi la legge di nuovo presentandosi come un normale browser. Se le due pagine sono differenti, vengono fatti dei controlli sulle differenze, alla ricerca di parole tipiche dello spam, di link e di righe troppo lunghe.
  • Altri controlli vengono fatti sulla pagina restituita nella visita come spider, contando le parole tipiche dello spam, cercando stringhe esadecimali lunghe e particolari tipi di stile CSS atti a nascondere contenuto. Questi controlli sono “euristici” e la presenza di queste anomalie non è indice di infezione certa, ma se ne sono presenti più di uno, ed in numero consistente, conviene fare un controllo.
  • Viene infine controllata la presenza di due particolari elementi nella pagina, indicatori certi di infezione, una sorta di firma dell’intrusione. Se si verifica la presenza di questi, anche uno solo, si è in presenza degli effetti di una violazione del sito.

Cosa non fa

Il controllo vale solo per Wordpress installato su un sito dedicato, e solo per il tipo di intrusione documentato negli articoli elencati poco sotto. Non è un controllo antivirus, non è un rilevatore di intrusioni di qualsiasi tipo, né un controllo di integrità generico per Wordpress. Non è neanche un “tester di temi contraffatti”: è impossibile da realizzare a tema installato, il tema va controllato prima di installarlo, e da una persona competente. Tanto meno può ripulire o “disinfettare” un blog compromesso: questo può farlo solo il proprietario o il webmaster, e non sarebbe neanche tecnicamente possibile senza operare con i dati di accesso del webmaster.

Se il sito è molto personalizzato, il controllo può fallire in tutti i sensi, cioè segnalare come infetti siti puliti e viceversa. Può non riconoscere un sito basato su Wordpress, come può scambiare un sito costruito con altri software con Wordpress. In tutti questi casi i risultati sono da prendere molto con le molle.

Il controllo non esegue alcuna operazione critica o intrusiva sul sito: esegue le stesse operazioni di chiunque lo visiti con un normale browser, niente di più.

Nota bene

Per evitare abusi e scherzi idioti, ogni richiesta è loggata e sono inseriti alcuni controlli preventivi. Uomo avvisato…

La pagina del test è qui.

Se volete altri dettagli, leggete gli articoli predenti elencati sotto, o contattatemi direttamente.

Gli articoli precedenti

Per chi vuole leggere tutta la storia, qui c’è l’elenco con tutti gli articoli che trattano dell’indagine sui blog violati:

Di seguito alcuni consigli per diminuire il rischio di essere colpiti, e cosa fare quando succede:

  • Licenza

    Creative Commons License
    Questo sito e tutti i suoi contenuti sono pubblicati sotto una Licenza Creative Commons, quando non diversamente specificato.

    Per altri usi, basta contattarmi.

  • Argomenti

  • Archivio mensile

  • Spazio offerto da