====== 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, ro**bot**, čovjek, Tensroflow, Keras
===== Uvod =====
CAPTCHA(**C**ompletely **A**utomated **P**ublic **T**uring test to tell **C**omputers and **H**umans **A**part)[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.
{{ :racfor_wiki:captcha.jpg?200 |}}
CAPTCHA pomaže u borbi protiv[3]:
*Email prevaranata
*Prevara u mrežnom glasanju
*Prevara u registracijama na web stranicama
*Spam komentara na web stranicama
*Napada rječnikom
Zaobilaženje CAPTCHA sustava[1]:
*Iskorištavanje programskih grešaka
***Poboljšanje računalnog programa za pronalaženje i prepoznavanje znakova**
*Korištenje jeftine radne snage za prolaženje testova
*Gruba sila - višestruki napadi
==== 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.
{{:racfor_wiki:captcha_osnovno.png?200|}}
=== Š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.
{{:racfor_wiki:captcha_suplje.png?200|}}
=== 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.
{{:racfor_wiki:captcha_spojeno.png?200|}}
=== Š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.
{{:racfor_wiki:captcha_sum.png?200|}}
=== 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.
{{:racfor_wiki:captcha_2sloja.png?200|}}
=== 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.
{{:racfor_wiki:captcha_slika.png?200|}}
=== 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.
{{:racfor_wiki:captcha_povuci.png?200|}}
=== 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.
{{:racfor_wiki:captcha_zvuk.png?200|}}
=== 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]
{{:racfor_wiki:captcha_klik.png?200|}}
===== 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 [[https://s3-us-west-2.amazonaws.com/mlif-example-code/solving_captchas_code_examples.zip| ovoj poveznici]] [8]
Korišteni alati:
* Python 3 - popularan programski jezik pogodan za korištenje u strojnom učenju i računalni vid
* OpenCV - popularna biblioteka za obradu i analizu slike, podržava Python programski jezik [11]
* Keras - biblioteka za strojno učenje pisana u Python programskom jeziku, uz malo kodiranja lagano je definirati, trenirati i koristit duboke neuronske mreže [12]
* TensorFlow - Googleova biblioteka za strojno učenje, koristimo ovu biblioteku zbog toga što keras sam po sebi ne implementira logiku neuronskih mreža koja nam je potrebna za ovaj zadatak [7]
Glavna ideja rješavanja problema može se svesti na 4 jednostavna koraka:
- Preuzmi sliku CAPTCHA testa
- Podijeli test na 4 segmenta, svaki segment je jedan znak
- Neuronska mreža radi predikciju za svaki znak pojedinačno
- Iskoristi predikciju za četiri znaka kao odgovor na CAPTCHA test
{{ :racfor_wiki:captcha_mreza.png?500 |}}
==== Obrada slike ====
Za početak imamo čistu CAPTCHA sliku koju moramo obraditi.
{{ :racfor_wiki:captcha_prije_tresh.png?200 |}}
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.
{{ :racfor_wiki:captcha_poslije_tresh.png?200 |}}
Sada vrlo lagano možemo detektirati rubove svakog znaka i pomoću funkcije //findContours()// iz biblioteka **OpenCV**-a, dijelimo sliku na četiri segmenta.
{{ :racfor_wiki:captcha_segmentacija.png?200 |}}
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.
{{ :racfor_wiki:captcha_spojeno2.png?200 |}}
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.
{{ :racfor_wiki:captcha_trainset.png?200 |}}
==== 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.
{{ :racfor_wiki:captcha_predict.png?200 |}}
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] [[https://en.wikipedia.org/wiki/CAPTCHA|CAPTCHA wiki.org]]
[2] [[http://www.captcha.net/|captcha.net]]
[3] [[https://www.pandasecurity.com/en/mediacenter/panda-security/what-is-captcha/|Panda Security
What is Captcha?]]
[4] [[https://www.cloudflare.com/learning/bots/how-captchas-work/|How CAPTCHAs Work | What Does CAPTCHA Mean?]]
[5] [[https://medium.com/towards-artificial-intelligence/breaking-captcha-using-machine-learning-in-0-05-seconds-9feefb997694|Breaking CAPTCHA Using Machine Learning in 0.05 Seconds]]
[6] [[https://wordpress.org/plugins/really-simple-captcha/|Really Simple CAPTCHA
By Takayuki Miyoshi]]
[7] [[https://www.tensorflow.org/|TensorFlow]]
[8] [[https://medium.com/@ageitgey/how-to-break-a-captcha-system-in-15-minutes-with-machine-learning-dbebb035a710|How to break a CAPTCHA system in 15 minutes with Machine Learning Code]]
[9] [[https://habr.com/en/post/496854/|«Build it & Break it»: How some algorithms generate captcha, while others crack it]]
[10] [[https://www.fer.unizg.hr/predmet/su|Strojno učenje fer.hr]]
[11] [[https://opencv.org/|OpenCV]]
[12] [[https://keras.io/| Keras]]