Feb
12
2011

Quanto è – realmente - off-line la modalità off-line di Joomla!?

|

Blogging

In questo articolo scritto da Nicholas K. Dionysopoulos, da me tradotto per Joomla.it, viene spiegato come mettere realmente il sito offline in caso di attacchi.
La modalità “sito momentaneamente offline” di Joomla! è un’opzione molto comoda per mettere temporaneamente down il proprio sito mentre si effettuano opere di manutenzione – ad es. aggiornare il core di  Joomla! o un’estensione – ed è anche consigliato nella documentazione ufficiale nel malaugurato caso in cui il vostro sito venga compromesso.
Comunque, è davvero offline o ci sono delle insidie di cui dovreste preoccuparvi?

Come avrete intuito dal titolo, la modalità offline non è così tanto off-line come avreste potuto pensare. È un dato di fatto, la modalità off-line è un trucco di magia, eseguito come qualunque illusionista avrebbe fatto. Mentre il vostro sito funziona normalmente sotto il mantello  – componenti e plugin in esecuzione – Joomla esegue un trucco magico appena prima di inviare la pagina al browser, sostituendo la pagina reale con il template off-line di sistema. E’ la ragione per cui è possibile digitare http://www.joomla.org?tmpl=offline nella propria barra degli indirizzi del browser e vedere il sito ufficiale di Joomla! apparentemente offline quando non lo è. Vediamo come Joomla! esegue questo trucco da illusionista, le implicazioni e le soluzioni pratiche per mettere davvero off-line il vostro sito web nello sfortunato caso di un’emergenza.

Smontare pezzo per pezzo un trucco di magia.

Joomla! è infatti un framework PHP con diverse "applicazioni" installate. La parte front-end del vostro sito è una di queste. Ogni applicazione eredita la classe astratta JApplication. Per l’applicazione front-end, l’implementazione concreta di JApplication è chiamata JSite e può essere trovata nel file includes/application.php. L'unico riferimento alla modalità off-line che si può trovare è nel metodo render(), dove vedrete qualcosa di interessante e inquietante: Joomla! controlla se avete impostato il vostro sito nella modalità offline appena prima di caricare il template. Se il vostro sito è offline e sta provando a mostrare una pagina HTML, e non si è loggati come utente con accesso al back-end, Joomla! caricherà il file template offline.php invece del normale index.php. Bene, fermiamoci un attimo. Quando il metodo render() viene chiamato in causa? La risposta è nel file principale index.php situato nella root del vostro sito. La chiamata a $mainframe->render() ($ mainframe è una variabile globale che contiene l'oggetto JSite) è la penultima istruzione in quel file. In altre parole Joomla! eseguirà tutti i plugins, metterà in funzione i componenti e tratterà la modalità offline durante l’ultimo step, appena prima che sia pronto per effettuare l'output della pagina HTML nel browser. Il metodo JSite::render() ci dice inoltre che solo la modalità HTML è influenzata dalla modalità off-line. E questo, amici miei, può avere effetti indesiderati sul vostro sito.

Gli effetti indesiderati.

Pensate per un minuto a quando e perchè potreste aver necessità di utilizzare la modalità off-line. Per cominciare, quando state costruendo un sito web e volete che nessuno lo visualizzi. In questo caso la modalità off-line va bene, poichè nasconde semplicemente il contenuto visibile dagli utenti del sito ai visitatori casuali del web. In questo modo la modalità off-line funziona perfettamente. Ma questo non è il solo caso o quello più utilizzato.
Ricordate il link che vi ho segnalato nell’introduzione di questo articolo, che ricorda cosa avreste dovuto fare quando il vostro sito viene hackerato? La documentazione ufficiale consiglia di utilizzare la modalità off-line subito dopo che si è stati hackerati. GRANDE ERRORE! La maggior parte delle compromissioni dei siti avviene perchè un cracker pieno di risorse trova una vulnerabilità blind SQL injection o una scappatoia per l’upload diretto di file sul vostro sito.

Nel caso di una vulnerabilità SQL injection, un cracker aggiunge un'istruzione SQL di suo gradimento ad un URL del vostro sito, così che possa eseguire direttamente i suoi comandi dannosi contro il database del sito. Il presupposto di questo attacco è che il componente vulnerabile analizzi i parametri query inviati dal cracker. Indovinate come? Sebbene si è nella modalità offline, si è ancora sensibili agli attacchi di tipo SQL injection contro un componente vulnerabile. Perché? Perché il componente è in esecuzione solo che non vedete il suo output. Siete off-line e continuate ad essere hackerati. Scacco matto.

Nel caso dell’upload diretto del file, il cracker carica uno dei C99-variant “root” scripts da qualche parte sul vostro sito, sfruttando un componente vulnerabile. Lo script root si esegue al di fuori di Joomla!, così anche se mettesse il sito offline l’hacker avrà ugualmente possibilità di utilizzarlo. Diciamo che aprite gli occhi, trovate lo script e lo cancellate. Haha! Avete battuto il cracker………no. Quando scoprirà che il suo script è stato rimosso, proverà ad eseguire nuovamente l’upload diretto. Dal momento che il componente vulnerabile continuerà ad essere in esecuzione, pur non essendo visibile, lui potrà nuovamente caricare il root script e impossessarsi completamente del vostro sito. Due punti per il cracker, disperazione per il proprietario del sito.

La sostanza è questa: La modalità off-line non può e non potrà proteggervi dall’attacco di un cracker.

Il mio Kung-Fu è più forte del tuo.

Adesso dovresti saperlo. Per ogni problema che incontro sul mio cammino, trovo una soluzione, la documento e la condivido con il resto del mondo. C'è una soluzione pratica per mettere completamente il sito off-line, fin quando si usa Apache o qualsiasi altro server che supporta i file .htaccess e mod_rewrite. Questo significa praticamente che funzionerà su tutti i server tranne sulla maggior parte delle installazioni IIS. L'idea è che vogliamo essere gli unici ad avere accesso al sito, mostrando una pagina HTML statica agli altri visitatori e al cracker, superandolo con astuzia nel suo stesso gioco.

La prima cosa di cui avete bisogno è il vostro indirizzo IP pubblico, ovvero l’IP utilizzato dalla vostra connessione ad internet. Di solito può essere reperito nella pagina informazioni sulla connessione nel vostro router nella forma 123.123.123.123, quattro serie di numeri separati da punti. Se non avete idea di come fare visitate semplicemente www.WhatsMyIP.org. Il vostro IP è mostrato nella parte superiore della pagina con un carattere molto grande. Annotatelo. Ad esempio, utilizzerò il finto indirizzo IP 123.123.123.123. È inoltre necessario un file HTML da mostrare ai visitatori poichè non andremo più ad utilizzare il messaggio off-line standard di Joomla!. È possibile crearne uno con qualsiasi strumento ad hoc, tipo Kompozer. Potete usare CSS ed immagini se volete. Fingerò che abbiate creato un file chiamato offline.html e l’abbiate messo nella root del vostro sito.

Successivamente, create un file contenente il seguente testo e caricatelo nella root del vostro sito come .htaccess, sovrascrivendo il vecchio file .htaccess.

RewriteEngine On
RewriteBase /$rewrite_base
RewriteCond %{REMOTE_HOST}        !123\.123\.123\.123
RewriteCond %{REQUEST_URI}        !offline\.html
RewriteCond %{REQUEST_URI}        !(\.png|\.jpg|\.gif|\.jpeg|\.bmp|\.swf|\.css|\.js)$
RewriteRule (.*)                  offline.html    [R=307,L]

 

Come potete vedere, ci sono tre cose da cambiare in questo file:


1. 123\.123\.123\.123 è il vostro indirizzo IP. Tutto quello che dovete fare è  “precedere” i punti con backslash. Non dimenticate il punto esclamativo prima del vostro indirizzo IP.
2. offline\.html è il nome del vostro file .HTML, con il punto “preceduto” da backslash.
3. offline.html è il nome del vostro file .HTML. Non precedete il punto con il backslash in quest’ultimo caso!

Nota bene
: Se il vostro sito restituisce una pagina Bianca o un Internal Server Error 500 dopo aver caricato il file, sostitutite R=307 con R (senza la parte =307). Questa operazione è richiesta solo su host Apace 2.0 e 1.3. siccome queste vecchie versioni non supportano il “flag” R = 307 nelle suddette regole di reindirizzamento.

Non appena avrete caricato questo file, accadrà quanto segue. Se arrivasse una richiesta da qualsiasi indirizzo IP eccetto il vostro, il visitatore verrebbe reindirizzato alla pagina offline.html con un reindirizzamento temporaneo al codice di stato HTTP (questa è la funzione che ha R=307 e sta lì per non far andare fuori di testa i motori di ricerca quando si trovano di fronte al vostro sito off-line). I file PNG, JPG, GIF, BMP, SWF, CSS e JS saranno tuttavia utilizzabili, in modo tale potrete utilizzare tali tipi di supporto nel file offline.html, senza problemi. Potete verificarlo in maniera molto semplice. Quando provate a collegarvi al vostro sito potreste non vedere nessuna differenza. Se usate un dispositivo connesso ad internet tramite un altro router, ad es. un dispositivo mobile connesso ad internet attraverso una connessione 3G, vedrete il contenuto della pagina offline.html. Vittoria! Ora potete mettere apposto un sito compromesso senza il rischio che un cracker rovini le vostre correzioni mentre state lavorando.


Joomla! può essere migliorato?


Sì e no. Per cominciare, il metodo che ho proposto è una semplice alternativa al problema, non una soluzione. Funziona solo sul 60% degli host – che è la fetta di mercato dei server Apache. L’altro 40% non può essere protetto utilizzando questo metodo. Quindi no, non reputo Joomla! colpevole di non utilizzare un sistema come il mio nel suo core. Si suppone sia un CMS versatile, essendo in grado di girare praticamente su qualsiasi tipo di server.

Comunque, si può fare qualcosa. Abbiamo bisogno di spostare e regolare il controllo della modalità offline nel file index.php. Se il sito è in modalità offline, non c’è nessun utente Super Administrator loggato e la richiesta non proviene da un Super Administrator che prova a loggarsi, Joomla! non dovrebbe eseguirla. Soltanto mostrare la pagina di off-line. In ogni altro caso (ad es. nella modalità offline, con un utente Super Administrator loggato) eseguirla.
Questa sarebbe la modifica più semplice del mondo e farebbe miracoli sulla sicurezza di Joomla!. Qualcuno interessato ad "adottare" questa idea e trasformarla in una patch?

 

+Vincenzo Galliano

Stay Tuned


Inserisci il tuo indirizzo e-mail:


No Spam, No Worries