Numeri pseudo-casuali e problemi reali

E’ abbastanza facile creare l’ordine con un computer, ma è assai difficile, anzi quasi impossibile creare il disordine. Basta un Bubble-sort per ordinare perfettamente una lista, ma disordinarla è compito assai più arduo.

La casualità è molto importante in informatica, in molte applicazioni si rende necessaria la generazione di disordine, imprevedibilità. In un videogioco potrebbe servire per rendere imprevedibili le mosse di un alieno; in un sistema di autenticazione potrebbe essere utile a un certo punto un codice di attivazione o un numero di sequenza non predicibile.

Per questo motivo ogni linguaggio di programmazione è dotato di una serie di istruzioni per generare numeri casuali. Anzi, numeri pseudo casuali. Infatti come dicevamo prima creare numeri veramente casuali è quasi impossibile.

La risorsa in grado di generare numeri casuali è il PRNG, pseudo random number generator. Ovvero un algoritmo in grado di creare sequenze di numeri apparentemente disordinate.
Uno dei più utilizzati e diffusi è il Marsenne Twister disponibile per esempio i più diffusi linguaggi, come php, python, ruby.

Nella maggior parte dei casi ci si può accontentare di numeri casuali “poco casuali”. In un gioco per esempio la casualità apparente non comporta nessun problema e ottiene brillantemente gli obiettivi prefissati. Se però ci spostiamo dal dominio del divertimento a quello della sicurezza e della crittografia la situazione cambia. E di molto.

In un gioco difficilmente riusciremo a predire i movimenti di un’astronave aliena. Ma con un po’ di abilità, pazienza e fortuna potremmo essere in grado di predire numeri di sequenza, identificatori di sessione, codici di attivazione, password generate casualmente.

Un pioniere dello studio delle implicazioni della generazione pseudo casuale dei numeri è stato sicuramente Michal Zalewski, hacker di origine polacca che presentò al mondo la sua ricerca sulla predicibilità dei Sequence Numbers del tcp nel 2001.

Una sequenza numerica per dirsi casuale deve essere non-predicibile. Ma ciò che a prima vista potrebbe apparire casuale in realtà potrebbe avere un grado di predicibilità più alto del previsto.
Dopotutto anche la sequenza di Fibonacci o la serie dei numeri primi può apparire a prima vista casuale.

Ogni giorno chi usa Internet ha a che fare con numeri apparentemente casuali. Ogni connessione tcp/ip viene avviata con un numero di sequenza iniziale che dovrebbe essere non predicibile: la predicibilità di tale numero aprirebbe la strada ad attacchi di blind spoofing.

Ogni risoluzione di nome di dominio tramite DNS potrebbe essere sfruttata per attacchi di DNS poisoning da chi fosse in grado di indovinare l’id di transazione.

Ogni sessione di qualsiasi applicazione web (webmail, banca online…) sarebbe insicura se il session id fosse in qualche modo predicibile.

Un articolo di Stefan Esser intitolato “mt_srdan() and not so random numbers” ha riportato d’attualità il problema focalizzandolo sul mondo delle applicazioni web scritte in php, portando alla luce le vulnerabilità del PRNG utilizzato dal popolare linguaggio.

In particolar modo la sezione intitolata “The Art of Cross Application Attacks” presenta un tipo di attacco molto interessante, utilizzando il valore apparentemente innocuo del search_id di phpBB per calcolare e predire la password generata automaticamente su WordPress installato sullo stesso server, a seguito di una richiesta di password reset.

Un altro attacco che si basa su questi principi è quello contro Simple Machine Forum <= 1.1.5 installato su server win32.
In questo caso un codice di sessione presente in un campo nascosto della pagina di richiesta di reset della password, rivela all’hacker lo stato interno del PRNG, permettendogli di inizializzare il proprio PRNG con lo stesso valore e quindi ricreare la stessa sequenza pseudo casuale di generazione del codice di attivazione.

Mentre scrivevo questo articolo, alla lista dei software affetti da questa classe di vulnerabilità si è aggiunto Joomla. E’ stato reso pubblico un problema nella funzione di generazione delle password, problema che avevo notato in questi giorni investigando i temi trattati in questo articolo. Chi ha un sito con Joomla aggiorni alla 1.5.7. Il bug è stato notificato al security team di Joomla dallo stesso Stefan Esser.

Come si dice in questi casi: è la punta dell’iceberg. Dopo anni di File-Inclusion e Sql-Injection la sicurezza della web application si trova ora a dover fronteggiare una situazione diversa e molto più inquietante, la cui soluzione non si basa solo sulla creazione di unapatch estemporanea ma richiede una riflessione più approfondita, considerando anche l’impatto sempre più massiccio che ha e avrà nei prossimi anni il web.

4 comments to “Numeri pseudo-casuali e problemi reali”
  1. Creare un algoritmo della casualità è impossibile…già la frase è un controsenso…non penso si riuscirà mai ad avere veramente dei generatori di numeri casuali fino a quando non si riuscirà ad inventare l’intelligenza artificiale, e anche allora non sono sicuro che questo accada…a un pc bisogna sempre dargli un range di scelte e un modo per scegliere…in definitiva si possono creare scelte complesse ma sempre legate alla prevedibilità…

  2. Certamente è un po’ difficile “creare” il caso con le macchine deterministiche. Però è anche vero che gli sviluppatori devono stare attenti e fornire un po’ più di entropia e a non far trapelare lo stato interno del generatore.

  3. Pingback: Pillolhacking.Net: I Migliori Articoli del 2008 | PillolHacking.Net

  4. Pingback: Fantasmi della rete – Unità 731 – Capitoli 1 e 2 | PillolHacking.Net

Comments are closed.