Sadržaj

Korištenje strojnog učenja za razbijanje jednostavnijih CAPTCHA sustava

Sažetak

CAPTCHA sustav je danas gotovo ne moguće izbjeći. Vrlo je važno koristiti jedan takav sustav zbog sve većeg broja korištenja botova na Internetu.

Strojno učenje i njegove grane kao što su duboko učene danas se koriste sve više vi više. Ponajviše zbog toga što je računalna snaga dosegla nivo da bi se takvi algoritmi mogli izvršavati u razumnom vremenu.

TensorFlow i Keras danas su jedni od najpopularnijih biblioteka za korištenje algoritama strojnog i dubokog učenja.

Iako ideja CAPTCHA sustava da pokuša otkriti tko koristi web stranicu bot ili čovjek, ovdje „pomažemo“ botu da zavara jednostavan CAPTCHA sustav kako bi se predstavio kao čovjek.

Ključne riječi: CAPTCHA, strojno učenje, duboko učenje, robot, čovjek, Tensroflow, Keras

Uvod

CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)[2] sustav koristi se kako bi se razlikovala računala od ljudi. To je zapravo računalni program koji štiti web stranicu protiv botova tako što generira i ocjenjuje testove koje će većina ljudi najvjerojatnije uspješno riješiti dok trenutni računalni programi ne mogu takve testove riješiti.

Malo jednostavnije CAPTCHA sustave moguće je riješiti pomoću strojnog učenja i biblioteka za računalni vid. Konkretno predefinirane CAPTCHA slike koje su označene treba izrezati u segmente, gdje je svaki segment jedno slovo ili broj. Tada treba naučiti model strojnog učenja da pokušava prepoznavati brojeve i slove na CAPTCHA slici.

CAPTCHA

CAPTCHA testovi od korisnika traže da unesu tekst ili kliknu na određenu sliku. Sam unos ovisi o upitu koje računalo postavi. Recimo računalo može tražiti da se tekst sa slike replicira, odgovori na pitanje, riješi jednostavan matematički zadatak ili unese tekst nakon glasovne poruke. Računala imaju problema sa takvim zadacima jer tekst može imati različite fontove, veličine slova, zarotirane elemente, dodan šum pa čak i mrlje po tekstu. Takvi zadaci ne bi trebali predstavljati problem prosječnoj osobi, ali većina od tih zadataka zadaje probleme računalu.

CAPTCHA pomaže u borbi protiv[3]:

Zaobilaženje CAPTCHA sustava[1]:

Povijest

Moni Naor je prvi koji je teoretizirao o načinima provjere dolazi li zahtjev od osobe ili od bota. Primitivni CAPTCHA test su 1997. razvili Andrei Broder, Martin Abadi, Krishna Bharat i Mark Lillibridge, da bi spriječili internet botove da dodaju URL-ove od njihovih pretraživača.

Da bi slike učinili otpornijim na OCR (engl. Optical Character Recognition), tim je simulirao situacije, koristili su primjere iz priručnika za skener gdje su prikazani znakovi krivo očitani uz pomoć OCR-a. 2000. godine, Luis von Ahn i Manuel Blum smislili su izraz 'CAPTCHA', koji je podrazumijevao općeniti program za razlikovanje ljudi od računala. Osmislili su višestruke primjere CAPTCHA-e, uključujući prve naširoko korištene CAPTCHA-a, one koje je u početku koristio Yahoo!. [1]

Vrste CAPTCHA

Danas postoji razne vrste CAPTCHA testova, ali ovdje su izdvojeni oni najčešći. [9]

Jednostavni

Ovo je najjednostavniji primjer CAPTCHA testa. Test se sastoji od 4 znaka broja ili slova. Slova i brojke mogu biti nakošeni, font im može biti različiti i razmak između znakova nije konstantan. Ovakav CAPTCHA test ovaj rad pokušava razbiti.

Šuplji simboli

U ovome primjeru znakova su također neravni i zakrivljeni, ali ovoga puta se vide samo konture znakova, dok je unutrašnjost prazna. Takve znakove je malo teže segmentirati računalu, ali su jako dobro vidljivi i razumljivi ljudima.

Lijepljenje znakova zajedno

Ovakav tip je i ljudima dosta kompliciran zbog toga što su znakovi spojeni i nerijetko se znaju preklapati. Zbog toga je računalima još teže napraviti segmentaciju znak po znak i tako prepoznati pojedine dijelove.

Šum u pozadini

Ovakva vrsta CAPTCHA testa je u većini slučajeva teža za čovjeka nego za računalo. Računalo vrlo lako može zanemariti šum oko znakova, dok ljude to može jako zbuniti. Dosta slika sa šumom uzeto je sa Googleovog sustava Street View.

CAPTCHA u dvije razine

Koriste se dva redaka znakova, kako bi računalo pri probijanju trebalo segmentirati dva puta po horizontalnoj osi i potencijalno zbunilo računalo. Ljudima nije ništa teže nego običan CAPTCHA test sa šupljim znakovima.

Selekcija i odabir

Ako se koristi ovakav slučaj testa, tada se od korisnika zahtjeva da izabere određeni lik koji se nalazi na slici. Ako ima više slika koje su također točne onda se izaberu sve. Ovaj problem je malo teži računalu jer test može tražiti stvarno razne stvari koje se trebaju pronaći na slikama.

Povucite i ispustite

Ovdje korisnik treba povući klizač do određene pozicije. Analizira se trag pokreta miša, brzina pokazivača i brzina reakcije. Računala bi imala nadljudske brzine u ovome slučaju pa je lako otkriti da korisnik nije čovjek.

Audio

Korisnik bi trebao napisati ono što je čuo ili u ponuđenoj traci odabrati što misli da je čuo npr. zvuk životinje ili instrumenta.

Klik

Makar se čini kao jako jednostavan test i zapravo to i je, ali ideja testa nije da korisnik klikne do pozicije gdje treba kliknuti. Nego se ispituje pomak miša do te pozicije. Nešto slično kao što smo imali kod tipa „Povucite i ispustite“. Danas se dosta često koristi Googleova implementacija reCAPTCHA.[4]

Strojno učenje

Strojno učenje grana je umjetne inteligencije koja se bave oblikovanjem algoritama koji svoju učinkovitost poboljšavaju na temelju empirijskih podataka. Strojno učenje jedno je od danas najaktivnijih i najuzbudljivijih područja računarske znanosti, ponajviše zbog brojnih mogućnosti primjene koje se protežu od raspoznavanja uzoraka i dubinske analize podataka do robotike, računalnog vida, bioinformatike i računalne lingvistike.[10]

Napadi na CAPTCHA testove izvodili su se u prošlosti, ali ne sa tolikom točnošću i toliko brzinom kao kada se koriste algoritmi strojnog učenja. Među prvim pokušajima probijanja CAPTCHA testova strojnim učenjem pripada grupi znanstvenika Guixin Ye, Zhanyong Tang, Dingyi Fang, Zhanxing Zhu, Yansong Feng, Pengfei Xu, Xiaojiang Chen i Zheng Wang. Njihov pristup se temeljio na algoritmu generativnih suparničkih mreža (engl. Generative Adversarial Network).[5]

Pristup i rješavanje problema

Pokušavamo razbiti stvarno jednostavne CAPTCHA testove preuzete sa WordPress stranice.[6] Test se sastoji od 4 znaka koja su vrlo čitka tako da čovjek ne bi trebao imat nikakvih problema u rješavanju. Cijeli skup podataka sastoji se od 9955 slika.

Programski kod i skup podataka nalazi se na ovoj poveznici [8]

Korišteni alati:

Glavna ideja rješavanja problema može se svesti na 4 jednostavna koraka:

  1. Preuzmi sliku CAPTCHA testa
  2. Podijeli test na 4 segmenta, svaki segment je jedan znak
  3. Neuronska mreža radi predikciju za svaki znak pojedinačno
  4. Iskoristi predikciju za četiri znaka kao odgovor na CAPTCHA test

Obrada slike

Za početak imamo čistu CAPTCHA sliku koju moramo obraditi.

Takva slika nije pogodna za rješavanje problema jer pikseli na rubovima nisu skroz crni kao unutar znakova. Zbog toga trebamo sliku pretvoriti u čisti crno-bijeli format, gdje sve što nije čisto bijelo postaje crno.

Sada vrlo lagano možemo detektirati rubove svakog znaka i pomoću funkcije findContours() iz biblioteka OpenCV-a, dijelimo sliku na četiri segmenta.

Ovdje vidimo da je segmentacija uspješno odvojila sva četiri znaka bez problema. No, što ako imamo znakove koji su slijepljeni jedan uz drugog. Takve znakove detektiramo tako što vidimo da je pravokutnik segmenta puno širi u x-osi nego što je u y-osi. Onda ga možemo podijeliti na pola i greška neće biti toliko primjetna, kao što bi bila da su znakovi spojeni ušli u test za učenje.

Nakon što se segmentiraju svi znakovi, stavljaju se zasebno u mapu sa ostalim znakovima koji su identično označeni. Za primjer imamo znak “W” u svojoj mapi.

Neuronska mreža

Neuronska mreža ne treba biti presložena, ponajviše iz razloga što trebamo prepoznati samo jedan znak. Prepoznavanje znakova je puno lakši problem od prepoznavanja kompleksnijih slika kao što su slike pasa i mačaka. Zato se koristi jednostavna konvolucijska neuronska arhitektura mreže sa dva konvolucijska i dva potpuno povezana sloja.

Ovdje koristimo biblioteke Keras i TensorFlow, koji će nam u par linija koda napraviti cijelu neuronsku mrežu.

# Izgradi neuronsku mrežu
model = Sequential()

# Prvi konvolucijski sloj sa maksimalnim sažimanjem
model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

# Drugi konvolucijski sloj sa maksimalnim sažimanjem
model.add(Conv2D(50, (5, 5), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

# Skriveni sloj sa 500 neurona
model.add(Flatten())
model.add(Dense(500, activation="relu"))

# Izlazni sloj sa 32 neurona za svaku klasifikaciju znaka
model.add(Dense(32, activation="softmax"))

# Definiranje funkcije gubitka, optimizacijskog algoritma i metrike
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

Nakon što smo definirali cijelu mrežu, sada ju sa dostupnim prethodno obrađenim podacima trebamo istrenirati.

# Treniranje neuronske mreže kroz 10 epoha
model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10, verbose=1)

Rezultati

Nakon 10 epoha točnost je iznosila približno 100%. Sada bi mogli mreži postaviti neviđeni primjer i vidjeti rezultat. Za očekivati je da će mreža klasificirati svaki znak ispravno te da će proći CAPTCHA test.

Vidimo da je mreža ispravno klasificirala svaki pojedini znak te da je CAPTCHA test uspješno riješen. Mreža ne bi trebala imati problema točno klasificirati sve znakove koji relativno podjednako izgledaju testovima nad kojima je mreža učila, čak i ako CAPTCHA test ima više znakova za pogoditi.

Zaljučak

Iako je ova mreža gotovo točna 100% u rješavanju ovakvih jednostavnijih CAPTCHA testova. Sa razlogom možemo razumjeti zašto se ovakvi CAPTCHA testovi više ni ne koriste. Računalni sustavi za prepoznavanje ovakvih znakova daleko su napredovali pa ovakvi sustavi zaštite više nisu korisni. Zato se danas koriste puno složeniji CAPTCHA testovi, gdje prvo morate razumjeti kontekst problema, a onda ga riješiti na odgovarajući način. Znamo da računala teško mogu povezati semantiku nekoga teksta pa onda na temelju toga riješiti zadani problem. Nije nemoguće da će se u budućnosti takvi izazovi uspješno riješavati od strane računala, ali će se tada sigurno pojaviti nova vrsta CAPTCHA testova koja će zamijeniti starije ranjive CAPTCHA testove.

Literatura

[1] CAPTCHA wiki.org

[2] captcha.net

[3] Panda Security What is Captcha?

[4] How CAPTCHAs Work | What Does CAPTCHA Mean?

[5] Breaking CAPTCHA Using Machine Learning in 0.05 Seconds

[6] Really Simple CAPTCHA By Takayuki Miyoshi

[7] TensorFlow

[8] How to break a CAPTCHA system in 15 minutes with Machine Learning Code

[9] «Build it & Break it»: How some algorithms generate captcha, while others crack it

[10] Strojno učenje fer.hr

[11] OpenCV

[12] Keras