Allt du vill veta om CAPTCHA
Du har säkert sett sådana här när du har registrerat ett konto på någon webbsida:
Programmen som hanterar dessa bilder kallas CAPTCHA och som du säkert misstänkt så finns de där som en säkerhetsfunktion. Vad skyddar de mot och hur bra fungerar de?
Bakgrund
CAPTCHA står för Completely Automated Public Turing test to tell Computers and Humans Apart. Det handlar alltså om att kunna skilja på människor och datorer, eller egentligen, om möjligheten för en människa att bevisa att hon inte är en dator.
Behovet finns eftersom Internet har många resurser som kan missbrukas genom automatisering. En angripare skulle t ex kunna skriva ett program som under några timmar registrerar 20 000 mailkonton på Spray och sedan skickar ett tiotal mail var; ett enkelt och relativt oskyldigt sätt att slussa ut en kvarts miljon spammail. Ett annat klassiskt exempel är en omröstning som hölls på Slashdot 1999 om vilken skola som hade den bästa utbildningen i datavetenskap. Efter att studenter på Carnegie Mellon hade skrivit ett program för att rösta automatiskt ryckte snart studenter från MIT in och det urartade i en tävling om vem som skrev det mest effektiva röstprogrammet. Carnegie och MIT fick strax över 20 000 röster var medan trean fick knappt 1000.
Den formella definitionen är att en CAPTCHA är ett program som kan generera och bedöma tester som (1) de flesta människor kan klara av men (2) dagens datorer inte klarar. Det populäraste testet har visat sig vara att kunna läsa deformerad text, något som datorer generellt har svårt för medan människor är väldigt duktiga på. Definitionen på en CAPTCHA lämnar dock testets typ öppet.
Däremot, om man följer direktiven för en CAPTCHA strängt så ska programmets beståndsdelar vara öppna (Public Turing test). Dels för att följa Kerckhoffs princip men också för att en välkommen bieffekt är att forskning runt artificell intelligens drar nytta av kapprustningen kring CAPTCHA-program. I den här texten använder jag alltså termen något oansvarigt.
Som vanligt inom säkerhet så är inte CAPTCHA en fullständig lösning på problemet. Implementeringar är fyllda av fällor.
Svagheter och attacker
Det första man behöver övertyga sig om är hur en lyckad attack ser ut. En CAPTCHA-knäckare behöver inte vara perfekt; en angripare kan t ex nöja sig med att, i genomsnitt, var tionde försök är korrekt. Detta leder direkt till att test med en väldigt begränsat mängd möjliga svar kan betraktas som svaga. Se till exempel metoden Spray använder för att kontrollera användare som glömt sitt lösenord.
Hos Spray är ett av ett litet antal (här fem stycken) möjliga svar rätt. En 20-procentig hit rate genom blint gissande är fullt godtagbart för en angripare. (Sprays implementering lider av flera problem men det lämnas som en övning för läsaren.)
En annan faktor än (lite slarvigt) lösningsrymden är (lite slarvigt) problemrymden. Hur många bilder har Spray i databasen? Är det möjligt att ladda ner alla och identifiera dem en gång och sedan utnyttja kunskapen för att lösa alla framtida? Om databasen innehåller 200 bilder är det något jag skulle kunna ägna några timmar åt. Om databasen innehåller 3,4 miljoner bilder är jag inte riktigt lika sugen.
Det här knyter an i text-CAPTCHA-metoden. Standardattacken är att använda OCR-program (Optical Character Recognition) för att tolka bilden som text. Om de textsträngar som testet använder är riktiga ord från t ex engelska så minskar antalet möjliga gissningar radikalt. Om OCR-programmet analyserar en bild, hittar en text och tolkar den som BRNANA men samtidigt meddelar att den är osäker på den andra bokstaven är det förstås ett enkelt steg att kontrollera med en ordlista innan gissning. Sannolikt kommer det att visa sig att BANANA har det kortaste avståndet till BRNANA.
Ytterligare en uppenbar svaghet är algoritmer som inte utnyttjar slumptal. Om de deformationer som används för att förvränga texten alltid är samma har angripare möjlighet att hitta andra deformationer som inverterar effekten. (Det här beror förstås på att data inte förloras vid vissa deformationer, något som somliga har fått lära sig den hårda vägen.)
En mindre uppenbar svaghet i text-CAPTCHA-bilder är när enskilda bokstäver är enkla att separera från varandra. Jämför t ex Googles nuvarande CAPTCHA med en av de tidigaste exemplen; EZ-Gimpy nedan. Om bokstäverna kan anlyseras var för sig förenklas attacker rejält.
Redan under CAPTCHAs barndom fruktade man att människor skulle utnyttjas för att lösa testerna. En farhåga man hade var att porrsidor skulle sättas upp där besökare fick lösa en CAPTCHA varje gång de ville se ett gäng bilder. De test som besökarna löste genererades inte av porrservern utan skulle då tas från Hotmails användarregistrering så att porrsurfare, ovetandes, registrerade mailkonton. De goda nyheterna är att det här aldrig blev ett riktigt problem, åtminstone inte vad man vet. De dåliga nyheterna är istället att CAPTCHA-knäckare rekryterades i låglöneländer. Det finns tyvärr inte så mycket information om hur utbredd metoden är.
Förutom detta finns det förstås flera exempel på program avsedda för att knäcka CAPTCHA-tester.
Andra problem
Det är inte det här inläggets fokus men det är viktigt att påpeka; CAPTCHA-tester må vara svåra för dagens datorer att lösa men de är också svåra för en ansenlig del människor. En arbetsgrupp på W3C släppte en rapport på ämnet för fem år sedan; Inaccessibility of CAPTCHA:
A common method of limiting access to services made available over the Web is visual verification of a bitmapped image. This presents a major problem to users who are blind, have low vision, or have a learning disability such as dyslexia. This document examines a number of potential solutions that allow systems to test for human users while preserving access by users with disabilities.
Rekommendationer
Precis som med kryptering så ska man inte göra som Martin Timell; själv. Lägg istället krut på en känd CAPTCHA. Jag rekommenderar vanligtvis reCAPTCHA (som är gratis). Huvudsaken är att eventuellt lyckade attacker hanteras relativt snabbt. Det hände till exempel med just reCAPTCHA i december. När en sådan utbredd CAPTCHA knäcks är det större chans att det upptäcks, rapporteras och hanteras.
Generellt är det ganska svårt att ge riktlinjer för hur en stark CAPTCHA ser ut. Olika deformationer och algoritmer kan tillsammans ha oförutsedda effekter. Eftersom konceptet CAPTCHA är fött på universitet finns det gott om utrymme för en akademisk syn...
Trots detta kan några riktlinjer vara:
--
Stefan Pettersson
Programmen som hanterar dessa bilder kallas CAPTCHA och som du säkert misstänkt så finns de där som en säkerhetsfunktion. Vad skyddar de mot och hur bra fungerar de?
Bakgrund
CAPTCHA står för Completely Automated Public Turing test to tell Computers and Humans Apart. Det handlar alltså om att kunna skilja på människor och datorer, eller egentligen, om möjligheten för en människa att bevisa att hon inte är en dator.
Behovet finns eftersom Internet har många resurser som kan missbrukas genom automatisering. En angripare skulle t ex kunna skriva ett program som under några timmar registrerar 20 000 mailkonton på Spray och sedan skickar ett tiotal mail var; ett enkelt och relativt oskyldigt sätt att slussa ut en kvarts miljon spammail. Ett annat klassiskt exempel är en omröstning som hölls på Slashdot 1999 om vilken skola som hade den bästa utbildningen i datavetenskap. Efter att studenter på Carnegie Mellon hade skrivit ett program för att rösta automatiskt ryckte snart studenter från MIT in och det urartade i en tävling om vem som skrev det mest effektiva röstprogrammet. Carnegie och MIT fick strax över 20 000 röster var medan trean fick knappt 1000.
Den formella definitionen är att en CAPTCHA är ett program som kan generera och bedöma tester som (1) de flesta människor kan klara av men (2) dagens datorer inte klarar. Det populäraste testet har visat sig vara att kunna läsa deformerad text, något som datorer generellt har svårt för medan människor är väldigt duktiga på. Definitionen på en CAPTCHA lämnar dock testets typ öppet.
Däremot, om man följer direktiven för en CAPTCHA strängt så ska programmets beståndsdelar vara öppna (Public Turing test). Dels för att följa Kerckhoffs princip men också för att en välkommen bieffekt är att forskning runt artificell intelligens drar nytta av kapprustningen kring CAPTCHA-program. I den här texten använder jag alltså termen något oansvarigt.
Som vanligt inom säkerhet så är inte CAPTCHA en fullständig lösning på problemet. Implementeringar är fyllda av fällor.
Svagheter och attacker
Det första man behöver övertyga sig om är hur en lyckad attack ser ut. En CAPTCHA-knäckare behöver inte vara perfekt; en angripare kan t ex nöja sig med att, i genomsnitt, var tionde försök är korrekt. Detta leder direkt till att test med en väldigt begränsat mängd möjliga svar kan betraktas som svaga. Se till exempel metoden Spray använder för att kontrollera användare som glömt sitt lösenord.
Hos Spray är ett av ett litet antal (här fem stycken) möjliga svar rätt. En 20-procentig hit rate genom blint gissande är fullt godtagbart för en angripare. (Sprays implementering lider av flera problem men det lämnas som en övning för läsaren.)
En annan faktor än (lite slarvigt) lösningsrymden är (lite slarvigt) problemrymden. Hur många bilder har Spray i databasen? Är det möjligt att ladda ner alla och identifiera dem en gång och sedan utnyttja kunskapen för att lösa alla framtida? Om databasen innehåller 200 bilder är det något jag skulle kunna ägna några timmar åt. Om databasen innehåller 3,4 miljoner bilder är jag inte riktigt lika sugen.
Det här knyter an i text-CAPTCHA-metoden. Standardattacken är att använda OCR-program (Optical Character Recognition) för att tolka bilden som text. Om de textsträngar som testet använder är riktiga ord från t ex engelska så minskar antalet möjliga gissningar radikalt. Om OCR-programmet analyserar en bild, hittar en text och tolkar den som BRNANA men samtidigt meddelar att den är osäker på den andra bokstaven är det förstås ett enkelt steg att kontrollera med en ordlista innan gissning. Sannolikt kommer det att visa sig att BANANA har det kortaste avståndet till BRNANA.
Ytterligare en uppenbar svaghet är algoritmer som inte utnyttjar slumptal. Om de deformationer som används för att förvränga texten alltid är samma har angripare möjlighet att hitta andra deformationer som inverterar effekten. (Det här beror förstås på att data inte förloras vid vissa deformationer, något som somliga har fått lära sig den hårda vägen.)
En mindre uppenbar svaghet i text-CAPTCHA-bilder är när enskilda bokstäver är enkla att separera från varandra. Jämför t ex Googles nuvarande CAPTCHA med en av de tidigaste exemplen; EZ-Gimpy nedan. Om bokstäverna kan anlyseras var för sig förenklas attacker rejält.
Redan under CAPTCHAs barndom fruktade man att människor skulle utnyttjas för att lösa testerna. En farhåga man hade var att porrsidor skulle sättas upp där besökare fick lösa en CAPTCHA varje gång de ville se ett gäng bilder. De test som besökarna löste genererades inte av porrservern utan skulle då tas från Hotmails användarregistrering så att porrsurfare, ovetandes, registrerade mailkonton. De goda nyheterna är att det här aldrig blev ett riktigt problem, åtminstone inte vad man vet. De dåliga nyheterna är istället att CAPTCHA-knäckare rekryterades i låglöneländer. Det finns tyvärr inte så mycket information om hur utbredd metoden är.
Förutom detta finns det förstås flera exempel på program avsedda för att knäcka CAPTCHA-tester.
Andra problem
Det är inte det här inläggets fokus men det är viktigt att påpeka; CAPTCHA-tester må vara svåra för dagens datorer att lösa men de är också svåra för en ansenlig del människor. En arbetsgrupp på W3C släppte en rapport på ämnet för fem år sedan; Inaccessibility of CAPTCHA:
A common method of limiting access to services made available over the Web is visual verification of a bitmapped image. This presents a major problem to users who are blind, have low vision, or have a learning disability such as dyslexia. This document examines a number of potential solutions that allow systems to test for human users while preserving access by users with disabilities.
Rekommendationer
Precis som med kryptering så ska man inte göra som Martin Timell; själv. Lägg istället krut på en känd CAPTCHA. Jag rekommenderar vanligtvis reCAPTCHA (som är gratis). Huvudsaken är att eventuellt lyckade attacker hanteras relativt snabbt. Det hände till exempel med just reCAPTCHA i december. När en sådan utbredd CAPTCHA knäcks är det större chans att det upptäcks, rapporteras och hanteras.
Generellt är det ganska svårt att ge riktlinjer för hur en stark CAPTCHA ser ut. Olika deformationer och algoritmer kan tillsammans ha oförutsedda effekter. Eftersom konceptet CAPTCHA är fött på universitet finns det gott om utrymme för en akademisk syn...
Trots detta kan några riktlinjer vara:
- Det ska vara svårt att separera enskilda tecken.
- Det ska finnas slumpmässighet på både enskilda tecken och hela ordet.
- Nyanser av färger (även gråskalor) är lätta att ta bort.
- Strikt horisontella och vertikala streck är lätta att ta bort.
- Streck som är tunnare än texten är de lätta att ta bort.
--
Stefan Pettersson
Kommentarer
Trackback