Identificata una grave vulnerabilità nelle HASH TABLE che affligge PHP e altri linguaggi di programmazione.
Gli array sono molto utilizzati nello sviluppo di applicazioni web scritte in PHP o altri linguaggi di scripting.
Gli Array consentono di memorizzare un numero variabile di valori di ogni tipo e da qui può nascere il problema denominato “Collisione Hash“.
In PHP, o anche altri linguaggi, gli array possono essere utilizzati per memorizzare i valori delle variabili $_POST, $_GET, $_COOKIE etc. e se riceviamo un richiesta con un numero elevato di valori, PHP potrebbe incappare in qualche problema.
Spiego meglio il problema: il motore di runtime di PHP che è implementato in C, legge le richieste HTTP e crea gli Array per memorizzare le varibili e questo accade prima che il codice PHP venga eseguito.
In C e altri linguaggi, gli Array sono implementati come strutture dati chiamate tabelle di HASH (o hash map) che non è altro che una struttura dati usata per mettere in corrispondenza una data chiave con un dato valore.
Ogni volta che vogliamo aggiungere una nuova voce ad una tabella di hash è necessario calcolare un nuovo valore di hash per questa nuova chiave e questo sarà un valore intero che determinerà in quale lista sarà collegata questa nuova voce.
Una volta determina questa lista verrà verificato se esiste già una voce con la stessa chiave e, nel caso non venisse trovato nessun record, verrà aggiunto il nuovo valore altrimenti, il nuovo valore verrà sostituito con quello trovato.
Questo è un processo molto veloce e che richiede un piccola quantità di risorse se il numero delle voci della matrice è molto piccolo al contrario, avendo un numero elevato di voci, questo processo comincerà ad appesantirsi e il problema più grave sarà quando avremo dei valori da aggiungere alla matrice che hanno uno stesso valore di hash. Questo vuol dire che saranno aggiunti alla stessa lista.
Alcuni ricercatori che studiano la sicurezza delle applicazioni, hanno trovato un modo per determinare un gran numero di chiavi di array che possono essere utilizzate per creare una richiesta HTTP con molte variabili di richiesta (GET, POST, Cookie etc.) che possono mettere PHP sotto stress e richiedere anche ore per gestire ogni singola richiesta HTTP, facendo consumare a PHP tutta la CPU.
Questo significa che un malintenzionato, anche con un numero relativamente piccolo di richieste potrebbe mandare in saturazione la CPU fino al crash del server.
Di seguito un video molto tecnico che ci spiega questo processo di creazione delle HASH Table e la vulnerabilità che affliggono le HASH Table:
Dobbiamo dire che questa non è una vulnerabilità di nuova scoperta. Già nel 2003 è stato illustrato questo problema e molti sviluppatori di linguaggi come Perl e Cruby hanno affrontato la questione mentre altri non hanno preso in considerazione una risoluzione rapida del problema e, tra questi linguaggi troviamo anche PHP (diffusissimo nel web application).
Gli sviluppatori di PHP hanno rilasciato una patch per PHP 5.3.9 RC 4 e PHP 5.4.0 RC 4 che aggiunge una nuova funzionalità nella configurazione del php.ini chiamata max_input_vars.
La variabile max_input_vars limita il numero di variabili che PHP accetta. Questo significa che se il server riceverà una richiesta HTTP con un numero di variabili GET, POST Cookie etc. superiore all’impostazione di max_input_vars, PHP ignorerà i dati in eccesso.
Questo però non riduce le collisioni della HASH Table ma almeno riduce al minimo le cause dovute da eventuali attacchi.
La variabile max_input_vars di default è settata a 1000 ma, un consiglio è di abbassare questo valore e portarlo ad un numero inferiore dato che le web application non hanno bisogno di gestirne un numero così elevato.
Devo aggiornare la mia installazione di PHP installata sul server?
Questo dipende dal tipo di hosting che utilizzate. Se siete su hosting condiviso, non avrete la possibilità di effettuare questo aggiornamento dato che è compito della società che gestisce i server. Cosa che va detta è che di solito su un hosting condiviso ci sono degli script che in caso di sovraccarico delle risorse, viene automaticamente sospeso il servizio per il sito che sta causando il disagio. Quindi quello che dobbiamo fare è verificare tramite phpinfo(); quale versione abbiamo installata e, casomai contattare la società di hosting per un eventuale aggiornamento.
Se siete su un VPS, molto probabilmente esistono dei controlli che in caso di sovraccarico del server, viene sempre interrotto il servizio per non causare problemi ad altri clienti che condividono lo stesso server fisico ma, qui abbiamo la possibilità di accedere in SSH ed aggiornare manualmente la nostra installazione di PHP.
Su server dedicati, molto probabilmente, siamo noi che dobbiamo aver cura di installare software di controllo per il carico della CPU in tempo reale altrimenti potremmo incorrere, in caso di attacco, al blocco del server o, nel peggiore dei casi, anche arrivare a “friggere” la CPU.