CAPTCHA, cosa sono e come usarli

Trovate qui la traduzione italiana del mio articolo pubblicato sul numero 50 di Hakin9.

Introduzione

CAPTCHA è un acronimo per Completely Automated Public Turing test to tell Computers and Humans Apart. Il test è stato creato nel 2000 da alcuni ricercatori della Carnegie Mellon University, per prevenire l’utilizzo illecito di strumenti come i bot nella fase di registrazione ad un servizio web. Il principale scopo di un CAPTCHA è infatti quello di prevenire una registrazione di tipo massivo, ad esempio ad un servizio di webmail gratuita. In questo articolo parleremo dei diversi tipi di test che è possibile implementare, analizzeremo quanto sicuri sono queste varianti, e cercheremo di capire quali sono le contromisure usate per eludere i CAPTCHA e come impostarli correttamente per renderli accessibili a tutti.

Come sono usati i CAPTCHA

Il CAPTCHA è un test di tipo challengeresponse. Questo significa che all’utente viene presentato un testo, e successivamente gli viene richiesto di digitare lo stesso testo in una form. Considerato che questa azione richiede un ragionamento, si presume che sia eseguibile solo da un umano, non da un bot (i bot sono programmi scritti per ripetere automaticamente l’attività di una persona, ma non a questi livelli). Esistono diverse tipologie di CAPTCHA, vediamo quali sono.

CAPTCHA grafico

Questo è il test più comune. Si presenta all’utente un’immagine , in cui il testo appare più o meno distorto, e viene richiesto di inserire quel testo (che può contenere numeri e/o lettere) in una form. In figura 1 potete vedere un esempio.

Figura 1 –  Yahoo graphic CAPTCHA from Wikipedia

Figura 1 - CAPTCHA grafico utilizzato da Yahoo! (da Wikipedia).

Questa tipologia di test è relativamente semplice sia da implementare che da utilizzare. L’utente deve solo leggere il testo, replicarlo, e il test è concluso. Per il provider, in questo caso di un servizio di webmail, è inoltre molto semplice scrivere una procedura che, all’interno di una form standard, cambi l’immagine ogni volta che la pagina viene ricaricata. Questo è senza dubbio il modo più semplice per usare un CAPTCHA, ma è abbastanza? Più importante ancora, è accessibile? La risposta ad entrambe le domande è no. Vediamo perché.

CAPTCHA grafico e sonoro

La seconda tipologia di test integra un CAPTCHA audio a quello visivo. Questo è necessario poiché un test solo grafico necessita unicamente dell’utilizzo della vista per essere risolto, euna persona con problemi di vista non potrebbe registrarsi al servizio. Nel test grafico e sonoro viene aggiunta una funzionalità che legge il testo presentato (o legge un altro testo, dipende da come viene implementato), permettendo quindi anche ad una persona ipo o non vedente di inserire nella form il testo corretto. Di seguito un esempio.

Figura 2 – CAPTCHA grafico e sonoro di Gmail

Figura 2 – CAPTCHA grafico e sonoro utilizzato da Google per la registrazione a Gmail.

Il CAPTCHA in figura 2 risulta molto accessibile poiché anche l’attributo HTML alt dell’immagine è valorizzato come “Ascolta e inserisci i numeri che senti“, in questo modo è possibile cliccare sull’icona della sedia a rotelle, ascoltare un file audio (che in questo caso presenta dei numeri, non delle lettere come nell’immagine) e superare il test. Ancora più interessante in questo caso è che il CAPTCHA è localizzato. Nell’immagine potete vedere la versione italiana, e i numeri sono effettivamente letti da una voce italiana. La stessa localizzazione c’è anche per l’inglese e le altre lingue di Google. Un’altra cosa da notare è che questo test ha di fatto due modi per essere risolto: sia inserire le lettere viste che i numeri ascoltati permettono di passare il test.

CAPTCHA cognitivo

C’è un ulteriore modalità di utilizzare i CAPTCHA, ed è forse la più complessa ma allo stesso tempo la più affascinante, soprattutto se usata all’interno di un social network. Questo tipo di CAPTCHA chiede all’utente, invece che mostrare lettere e numeri, di effettuare un’operazione logica del tipo: quanto fa 3+3/2? Oppure di che colore è il cielo quando non piove? Un altro modo di impostare un CAPTCHA cognitivo è quello di utilizzare informazioni conosciute sia dall’utente sia da chi espone il servizio. Questo funziona molto bene proprio nei social network, ed è stato implementato da Facebook. Se Facebook infatti pensa che il login sia stato effettuato in maniera illecita, ad esempio proviene da un IP che l’utente non aveva mai usato, mostra all’utente alcune foto dei suoi amici, chiedendogli di identificare tra le varie foto una specifica persona. Questo tipo di CAPTCHA è tuttavia molto difficile da realizzare, visto che necessita di un notevole database di domande/risposte possibili, e questo è un problema di sicurezza di cui parleremo dopo. Nell’altro caso necessita di conoscere un buon numero di informazioni dell’utente, quindi è impossibile utilizzarlo su servizi non autenticati (come un WHOIS per un dominio, ad esempio), o ancora peggio nella fase di registrazione ad un servizio.

E per quanto riguarda l’accessibilità?

L’accessibilità, o meglio la non-accessibilità dei CAPTCHA è un problema reale, ed è stato analizzato molte volte nel corso degli anni. Nel 2005 anche il World Wide Web Consortium ha pubblicato un documento a riguardo. Il documento del W3C non è molto attuale in alcuni passaggi, ma le considerazioni finali sono sicuramente molto interessanti, i problemi che espone sono reali, e dovrebbe essere tenuto in considerazione da chiunque utilizza o intende implementare i CAPTCHA nei propri servizi web. Come detto prima i test esclusivamente grafici non sono accessibili da persone cieche o ipovedenti. Tuttavia anche utilizzando la grafica e l’audio resta il rischio di tagliare fuori un discreto numero di utenti. Questo può succedere se l’utente non ha la possibilità di ascoltare il test (per problemi hardware, per mancanza di plugin specifici, ecc.), oppure se il test è svolto in un ambiente particolarmente rumoroso. Prendendo come esempio il test di Google, l’audio è molto complesso da comprendere anche in una situazione normale e da parte di una persona senza problemi di udito. Questo succede quando si sposta l’asse troppo dalla parte della sicurezza, chi ci rimette è proprio l’accessibilità. Anche il CAPTCHA cognitivo ha molti problemi di accessibilità, a cominciare ovviamente da utenti non vedenti, che non riescono a comprendere le immagini proposte. Questo si inquadra in un contesto molto più complesso, visto che un social network in se non è propriamente il servizio più accessibile presente su Internet. In questo caso tuttavia è possibile usare altre informazioni già in possesso di chi propone il test, come ad esempio la data di nascita dell’utente, la sua squadra preferita, oppure una domanda e risposta fatta impostare all’utente in fase di registrazione. Questo può aiutare ad implementare un CAPTCHA cognitivo accessibile a molte persone.

Ma i CAPTCHA sono sicuri?

Ora parliamo di sicurezza. Come ogni strumento atto a prevenire un utilizzo illecito di un servizio, anche i CAPTCHA sono pesantemente attaccati. Considerando poi che spesso difendono la registrazione a servizi di webmail gratuite, quasi tutti gli attacchi vengono da spammer, che mirano a registrare quanti più account possibili, per poi usarli ed inviare email. Analizziamo ora alcuni metodi utilizzati per risolvere il test automaticamente, ma è importante tenere in considerazione che questo tipo di attacchi è in continua evoluzione, e i ricercatori presentano soluzioni sempre più evolute anno dopo anno.

Risolvere un CAPTCHA automaticamente

Come già detto i CAPTCHA sono stati creati per evitare che i bot inviino richieste in modo massivo. I programmatori di bot hanno costantemente lavorato su tecniche per permettere una lettura automatica dell’immagine, superando automaticamente il test. Queste tecniche sono state sviluppate in modo parallelo alla nascita dei CAPTCHA. Considerando che questo tipo di attacco è molto simile alle tecnologie OCR, il modo migliore per evitarlo è distorcere il testo nell’immagine, aggiungendo quindi maggiore complessità.
Un esempio di distorsione.

Figura 3 – CAPTCHA di Yahoo! distorto per evitare una lettura automatica.

Figura 3 – CAPTCHA di Yahoo! distorto per evitare una lettura automatica.

Nel CAPTCHA in figura 3, è stata aggiunta distorsione e complessità al test presentato da Yahoo!. Questo è però un caso in cui la sicurezza prevale sull’accessibilità. Poiché più il testo viene distorto meno diventa leggibile, questo avviene sia per strumenti automatici che per esseri umani, che abbiano problemi di vista o no. Quante volte avete ricaricato un CAPTCHA perché il testo presentato era illeggibile? Molte volte immagino
Anche il CAPTCHA audio può essere ovviamente risolto automaticamente. Molti programmi sono in grado di ascoltare delle parole e scriverle su un file. Analogamente a quanto detto per la parte grafica, anche per l’audio è possibile aggiungere disturbi sonori o aumentare il rumore di fondo. Questo a discapito dell’accessibilità, ovviamente, ma non è ancora abbastanza. Uno studio recente su questo argomento ha mostrato come, anche aggiungendo distorsione al file audio, il CAPTCHA è stato risolto automaticamente il 67% delle volte per Google, il 70% per Digg e il 45% per reCAPTCHA(che è probabilmente il servizio di CAPTCHA più usato sul web, di proprietà di Google stessa). E ovviamente più rumore o distorsione viene aggiunto all’audio, meno diventa comprensibile da chiunque.
Per quanto riguarda il CAPTCHA cognitivo, il suo punto debole è senza dubbio la base dati delle domande. Mentre una combinazione di parole e numeri è illimitata, in questo caso è necessario creare un elenco di domande e risposte da chiedere. Risulta quindi facile per un attaccante studiare il test, collezionare le possibili domande e preparare un bot che sia in grado di rispondere a tutte. Se il CAPTCHA cognitivo è basato invece su informazioni possedute sia dal gestore del servizio che dall’utente, risulta molto più difficile da attaccare. Ma questo come già detto richiede una registrazione preventiva, quindi non è utilizzabile su servizi anonimi o in una form di registrazione.

Attaccare l’algoritmo di generazione dei CAPTCHA

Come ogni generatori di numeri casuali, anche l’algoritmo che genera un CAPTCHA può essere attaccato e scoperto, in questo modo sarebbe possibile risolvere il test prima ancora che venga presentato all’utente. Questo tipo di attacco è tuttavia molto difficile da eseguire. I moderni algoritmi sono robusti, in molti casi analizzati da una comunità open source, ed è difficile che un attaccante spenda tempo e risorse per cercare di comprendere la logica dietro l’algoritmo. Può tuttavia succedere che un provider utilizzi un sistema di generazione di CAPTCHA molto vecchio, con un algoritmo prevedibile. Questo è uno dei motivi per cui molti utilizzano i servizi di reCAPTCHA, che risulta molto sicuro da questo punto di vista.

Risolvere un CAPTCHA manualmente

Questo tipo di attacco può sembrare una contraddizione: se devo risolvere un CAPTCHA automaticamente perché dovrei tentare di attaccarlo risolvendolo manualmente? La risposta alla domanda è semplice: se un CAPTCHA è creato per essere risolto da umani, usiamo gli umani per risolverli! Questo tipo di attacco può essere svolto in due modi. Si può includere il CAPTCHA da attaccare all’interno di un proprio servizio web, pubblicato dall’attaccante.

Un altro modo è di pagare delle persone per fargli risolvere quanti più CAPTCHA possibili. Questo caso è stato citato anche nello studio del W3C di cui avevamo parlato prima, notando come un operatore specializzato in questo può risolvere centinaia di CAPTCHA ogni ora.

Questo tipo di attacchi sono comunque molto costosi e spesso non valgono la spesa, considerato che un sistema di risoluzione automatico è comunque più veloce di qualsiasi umano, e che è complesso creare dei siti fake in cui includere un CAPTCHA da un altro servizio web.

Anche pubblicare un sito che presenti delle immagini pornografiche, in seguito alla risoluzione di un CAPTCHA è abbastanza inutile. Ci sono moltissime immagini immediatamente accessibili con una semplice ricerca, ed è improbabile che qualcuno perda tempo a risolvere un test per vederle. Questo tipo di attacco è poco più di una leggenda urbana, come analizza lo stesso Captcha.net in “L‘attacco tramite pornografia non è un problema“:

Mentre è molto semplice scrivere un bot che abusi di siti non protetti milioni di volte al giorno, reindirizzare i CAPTCHA per essere risolti da umani che vogliono vedere immagini pornografiche permetterebbe agli spammer di utilizzare illecitamente i servizi poche migliaia di volte al giorno. I conti di questo attacco semplicemente non tornano: ogni volta che un sito porno mostra un CAPTCHA prima di un’immagine rischia di perdere un utente, che si rivolgerebbe ad un altro sito senza quel blocco.

Devo monitorare i miei CAPTCHA?

La risposta a questa domanda è senza dubbio ! Chi espone un servizio deve mantenere un log di ogni cosa riguardi l’uso del CAPTCHA, e deve analizzare questo log molto attentamente.

Questo è necessario sia per la sicurezza che per l’accessibilità. È necessario analizzare quante volte gli utenti hanno fallito il test rispetto al totale degli accessi e, se avete un CAPTCHA audio e video, è necessario comprendere quanti utenti hanno passato il test leggendo le parole o ascoltando il file audio.

Analizzando questi log è possibile infatti capire se il test è realmente utile, se è troppo facile o difficile da passare, e quale soluzione è più efficace. Per esempio se pensate che il vostro servizio sia utilizzato da un piccolo numero di persone non vedenti, e i vostri log vi dicono che il CAPTCHA è stato superato al 50% per la parte visiva e al 50% per quella audio, questo può significare sia che la parte audio è vulnerabile ad attacchi, sia che la parte visiva è troppo complessa da leggere. Conoscere queste statistiche può senza dubbio aiutare a pubblicare un servizio migliore, e migliorare l’esperienza dei vostri utenti.

Correlando questi log con altre fonti, come ad esempio i log degli application server o dei firewall/IPS, è possibile avere informazioni chiare su chi, come e da dove sta usando (o forse abusando) dei vostri servizi.

Conclusioni

Abbiamo quindi fatto un tour sui tipi di CAPTCHA che possono essere usati, quali sono i punti di forza e le debolezze di ogni tipo, e come è possibile provare ad identificare abusi o possibili attacchi.

Come ogni misura tecnica i CAPTCHA non possono garantire il 100% di sicurezza sui vostri servizi. Sono uno strumento molto utile, ma è necessario implementarli molto bene. Bisogna pensare all’accessibilità, alla sicurezza e alla user experience, e questi sono problemi critici se il vostro servizio ha una platea di utenti molto ampia. Ancora di più se lo pubblicate come amministrazione pubblica o come servizio orientato ai cittadini.

La sicurezza del CAPTCHA può essere aumentata aggiungendo complessità, distorsione o domande logiche difficili (ma in gran numero). Bisogna però essere consci del fatto che più si aumenta la complessità, più il test diventa sicuro, ma meno è accessibile da una gran parte dell’utenza. Questo è il motivo principale per cui molti servizi che usano un CAPTCHA sono molto complessi da utilizzare, e questo genera frustrazione negli utenti, e quindi lamentele o abbandono del servizio. E di certo vorrete evitare questa situazione.

Come ulteriori scenari di implementazione, insieme ad un CAPTCHA in fase di registrazione ben bilanciato tra sicurezza e accessibilità e ben monitorato, è possibile attivare dei controlli ulteriori con questo test all’interno del servizio stesso. Se l’applicazione pensa ad esempio che l’utente stia facendo troppe operazioni in poco tempo, rispetto a quanto possa fare un essere umano, allora blocca la funzionalità e presenta un CAPTCHA.
Questo è esattamente quello che fa Google con il suo servizio di ricerca web, se provate a fare numerose ricerche con uno strumento automatico. Naturalmente Google non può mostrare un CAPTCHA ad ogni query di ricerca (non lo userebbe più nessuno), ma se il motore ritiene che voi siate un bot e non un umano, ferma tutto e vi chiede di risolvere un CAPTCHA cognitivo. E questo sicuramente rallenta e tenta di prevenire gli abusi.

In conclusione: rispettate sempre i vostri utenti, pensate bene a quale servizio state difendendo e bilanciate la sicurezza di conseguenza, e monitorate attentamente i log.

E sicuramente avrete un ottimo CAPTCHA!

Federico Filacchione
pubblicato originariamente come “CAPTCHAs, What They Are and How To Use Them” su Hakin9 numero 50© Software Press, Poland.

Un pensiero su “CAPTCHA, cosa sono e come usarli

Commenta il post!