Showing posts with label sigurnost. Show all posts
Showing posts with label sigurnost. Show all posts

Monday, October 8, 2012

Kako radi token za Internet bankarstvo...

Što zbog posla, što zbog čiste znatiželje, već dulje vremena pokušavam saznati kako točno rade tokeni koji se koriste u Internet bankarstvu, primjerice Zabe. Primjetite da je naglasak na riječi "točno" budući da znam načelno kako rade, a i guglajući se mogu pronaći neke odokativne informacije. Međutim, to nije zadovoljavajuće, a čak ni dovoljno. Na Internetu je relativno lako pronaći proizvođača i konkretan token koji Zaba i ostali koriste, iako ima puno vrsta tokena, ali traženje kako točno ti tokeni rade iz nekog razloga nije baš tako lako. Ako bi se pitali zašto bi htio znati kako točno rade, tada je odgovor da osim znatiželje u pitanju je i sigurnost. Naime, zanima me u kojoj mjeri je proizvođač predodredio što i kako se treba raditi, a u kojoj mjeri programeri dizajniraju protokole. Izrada ispravnih i sigurnih protokola je izuzetno težak problem na kojemu i profesionalci koji se bave s tim imaju poprilično problema, a ako to radi neki programer koji se prije toga nije bavio proučavanjem protokola onda je velika vjerojatnost da će napraviti neku grešku. To pogotovo postaje bitno ako se uzme u obzir činjenicu da se uvode razne vrste mTokena koje su čisto programske komponente i prema tome programeri imaju potpunu slobodu implementirati ih kako god žele.

Opis upotrebe tokena

Tokeni u Internet Bankarstvu upotrebljavaju se u dvije svrhe. Prva namjena je za autentikaciju, drugim riječima, dokazivanje da smo onaj/ona za kog se predstavljamo. U tom smislu token generira broj (APPL1) koji je potrebno upisati u neko polje Web aplikacije i na taj način dokazati tko smo. Na neki način to je slično lozinci. Umjesto korisničkog imena koristi se broj tokena i broj tokena je vezan uz naš račun, odnosno, po broju tokena aplikacija na poslužitelju će pronaći naše podatke. Dakle, s tim procesom prijave (kucanja broja tokena i broja kojeg token generira) dokazujemo da posjedujemo token, i neposredno, da smo vlasnici nekog računa. Posjedovanje tokena je prvi faktor autentikacije! Očito je kako bi gubitkom ili krađom tokena netko dobio potpuni pristup našem računu i da se to spriječi, token je zaštićen PIN-om, četveroznamenkastim brojem, koji bi morao znati isključivo vlasnik tokena! To je drugi faktor autentikacije. Dakle, za uspješnu autentikaciju potrebno je imati token i znati PIN koji ga otključava. To je tzv. two-factor authentication (2FA) ili dvo-faktorska autentikacija. S obzirom da je PIN relativno mali broj koji se sastoji od samo četiri znamenke, koje omogućavaju 10000 kombinacije, nije tako teško pogađati PIN, treba vremena, ali je moguće. Kako bi se token zaštitio od napada pogađanja PIN-a, on se automatski zaključava nakon tri uzastopna neuspjela pokušaja. Ovaj sustav prilično je siguran budući da se broj koji generira token i koji se mora upisati u aplikaciju stalno mijenja i jako je teško pogoditi koji će biti idući broj! S obzirom da se generirani broj za autentikaciju može upotrijebiti samo jednom, onda se naziva i jednokratna lozinka, ili engleski one-time password (OTP).

Druga namjena je za autorizacija transakcija. Naime, ako se netko uspije ubaciti u komunikacijski kanal između banke i klijenta (što u biti i nije tako teško) tada se otvara mogućnost napada u kojemu napadač modificira podatke neke transakcije ili jednostavno inicira transakcije bez znanja korisnika. Recimo da klijent plaća režije i zbog toga prebacuje XYZ kn sa svog računa na račun tvrtke kojoj treba platiti račun. Napadač može presresti podatke o plaćanju kada putuju od klijenta do banke, promijeniti odredišni račun tako da to bude njegov račun, a istovremeno može promijeniti i cifru, i onda to proslijediti banci. Korisnik neće ni znati što se desilo. No, ne samo to, već nakon autentikacije (koju napadač ne može tako lako zaobići) može inicirati bilo koju transakciju i opet klijent neće biti svjestan da je upravo prevaren. Dakle, bez nekakve dodatne zaštite očito je da napadač može otuđiti sva sredstva s klijentovog računa i da se radi o priličnoj ozbiljnoj prijetnji.

Jedna mogućnost da se to spriječi je da klijent mora upisivati jednokratnu lozinku prije svake transakcije, tj. na neki način se uvijek mora autenticirati. Ovo će istina spriječiti napadača da izdaje naloge bez znanja korisnika, ali neće spriječiti napadača da promijeni podatke o transakciji bez znanja korisnika. Zbog toga se upotrebljava drugi pristup (koji također ima problem vidjeti Nadopunu 1!). Naime, kada korisnik upiše podatke o transakciji oni se šalju u banku. U banci se na temelju podataka iz transakcije (brojevi računa, iznosi i slično) generira jedinstveni broj koji nazivamo izazov (engl. challenge). Potom se korisniku prikazuju svi podaci iz naloga (dakle ponovo se prikazuje nalog) ali se prikazuje i broj generiran od strane banke. Korisnik taj broj mora utipkati u svoj token (APPL2) koji na temelju njega generira odgovor (response). Nakon toga, odgovor, zajedno sa svim podacima o transakciji vraća se u banku. Aplikacija u banci ponovo provjerava da li generirani jedinstveni broj odgovara podacima u transakciji te da li je korisnik upisao očekivani odgovor (primjetite da aplikacija u Banci zna koji broj očekuje). Ako je sve OK, transakcija se provodi, ako nije, transakcija se odbija. Na taj način značajno smo otežali posao napadaču u njegovim pokušajima promjene podataka iz transakcije. Da bi zaštita bila uspješna, i od korisnika se traži određena doza pažljivosti.

Implementacija

Razlog zašto sam se odlučio na pisanje ovog posta je što sam konačno uspio pronaći kako je implementirano generiranje jednokratne lozinke. Naime, to je opisano u RFC dokumentu TOTP: Time-Based One-Time Password Algorithm (RFC6238). Taj RFC je nadogradnja RFC-a pod nazivom HOPT: An HMAC-Based One-Time Password Algorithm (RFC4226). U oba algoritma koristi se HMAC funkcija (definirana u RFC2104) koja na temelju tajnog ključa i dodatnog parametra generira novu jednokratnu lozinku. E sad, razlika između TOPT i HOTP je baš u tom dodatnom argumentu, iako je sve ostalo potpuno isto. U slučaju HOTP-a, dodatni argument je brojač, dok je u slučaju TOTP-a dodatni argument trenutno vrijeme u sekundama podijeljeno s nekom konstantom (recimo s 30). Razlog uvođenja TOTP-a je poboljšana sigurnost. Naime, kod HOTP-a se brojač povećava nakon svakog korištenja pa ako korisnik ne  bi upotrebljavao token neko vrijeme, stalno bi bio isti OTP i napadač bi ga mogao pogađati te bi u jednom trenutku i uspio. Kod TOTP-a, kako vrijeme prolazi, mijenja se i jednokratna lozinka (svake minute ako se koristi dijeljenje s 30) te napadač sada ima pokretnu metu što je dosta složenije za pogoditi. Ono što mi se posebno sviđa kod RFC-a o HOTP-u je analiza sigurnosti, dok se u oba RFC-a nalazi Java kod koji implementira algoritam opisan u RFC-u. I pogodite što? Pronašao sam taj kod u mTokenu jedne određene banke. Kako i što, prešutit ću, bar za sada. :)

No, ovdje ima jedan ALI. Preporučena minimalna duljina jednokratne lozinke prema RFC-u je 6 znakova, dok se u tokenu upotrebljavaju 4 znamenke. Pretpostavljam da je razlika u finalnom koraku kada se radi modulo operacija, ali nisam siguran, a pogotovo nisam siguran koliko to utječe na sigurnost (trebalo bi proći analizu iz RFC-a, što ću sigurno obaviti čim uhvatim vremena).

Što se tiče jednokratne lozinke još je samo ostalo reći što je s onim tajnim ključem. Pa, taj ključ se generira na autentikacijskom poslužitelju (o toj komponenti nisam pisao, ali se ona nalazi u banci) te se taj broj upisuje u token preko onih ledica na vrhu tokena. Sumnjam kako se to obavlja prema protokolu opisanom u RFC6030 ili da je upotrebljeni protokol barem sličan tome opisanome u RFC-u. Inače, preporučena vrijednost za dijeljeni ključ prema RFC-u je 128 bita, ali ako je vjerovati postu na forumu, onda se u HR upotrebljavaju vrijednosti od 256 bita.

Što se tiče implementacije izazova i odgovora, prvo pitanje je što se od podataka uključuje u generiranje izazova. Pretpostavljam da je odluka prepuštena onima koji rade aplikaciju. Naime, tokenu je svejedno kako je nastao broj koji se upisuje, on jednostavno na temelju broja generira novi broj. U tom smislu postoji nejasnoća, ali moguće je da se koristi neka varijacija HOTP-a. Ono što i aplikacija i token moraju imati zajedničko je algoritam uz pomoć kojega se broj generira. Pretpostavljam da se za to koristi postupak definiran u RFC6287 - OCRA: OATH Challenge-Response Algorithm. Konkretno, postupak iz odjeljka 7.1. No ukratko, opet se koristi HOTP ali su neki ulazi promijenjeni, konkretno umjesto brojača (C) koristi se sažetak koji server šalje. Moguće je da se koristi i vremenska oznaka (trebalo bi provjeriti), ali sigurno se ne koristi PIN. Naime, PIN mora biti poznat isključivo korisniku i budući da ga poslužitelj ne zna onda ga ne može koristiti za generiranje podataka!

Umjesto zaključka

Čini se da je token prilično siguran sustav. U stvari, siguran je što se tiče stvari definiranih odgovarajućim standardima (RFC), ali kada je u pitanju programerska implementacija moguće su ranjivosti. Token ipak ne štiti od nekih mogućih zloupotreba, primjerice, neporecivost nije najbolje osigurana zbog toga što je izazov vrlo mali broj i grubom silom se može generirati slična transakcija s istim izazovom. Dodatno, moguće je i određeno modificiranje računa u prijenosu od strane napadača, iako nije trivijalno. U tom smislu pametne kartice nude doista puno bolje rješenje, ali na uštrb više zahtjevanih resursa (čitači, instalacija dodatne programske podrške).

Nadopuna 1 [20121011]
Na žalost, moram se ispraviti. Mehanizam izazova i odgovora (challenge-response) ne štiti od MITM (ili MITB) napada. Naime, napadač koji se ubaci u komunikacijski kanal može prilikom slanja naloga na poslužitelj izmjeniti podatke, poslužitelj na to generira izazov i vraća nalog zajedno s izazovom korisniku. Međutim, napadač vraća originalne podatke u nalog ali ne dira izazov te to prikazuje korisniku. Korisnik ukucava odgovor te se nalog, zajedno s odgovorom šalje na poslužitelj. Međutim, napadač u prolazu modificira nalog tako da opet ima krive podatke. Poslužitelj na to provodi transakciju. Ovaj napad nije moguće detektirati samo na temelju izazova budući da korisnik ne zna da li je on ispravan za podatke trenutno prikazane u formi!

Thursday, August 30, 2012

Sigurnost i državna uprava...

Upravo sam pročitao kako državna uprava razmišlja o uvođenju sustava koji bi omogućio građanima dobijanje informacija putem Interneta, a također i mogućnost da građani mijenjaju svoje podatke korištenjem istog sustava!

To je vrlo pohvalno, ali dio oko kojeg sam se naježio je kada sam pročitao da bi se koristilo korisničko ime i lozinka:
Ministarstvo znanosti, Hrvatski zavod za mirovinsko osiguranje, Zavod za zdravstveno osiguranje, Ministarstvo uprave i Porezna uprava u pilot-projektu će biti spojeni na jedan sustav kojem će svaki građanin moći pristupiti putem interneta koristeći korisničko ime i lozinku koju će dobiti od jedne od navedenih institucija. Identifikacijom u sustavu, građani će u početku moći koristiti po jednu od najjednostavnijih usluga od svake ustanove.
S obzirom koliko problema na Internetu ima, koliko je programska podrška nesavršena, koliko su ljudi nesavjesni i ležerni, i konačno, koliko je problema zbog korisničkog imena i lozinki to je jedan veliki veliki potencijalni problem koji bi omogućio krađu identiteta, a možda još i gore stvari!

U tom smislu smatram da bi tome trebalo jako jako oprezno pristupiti cijelom problemu. Sigurnost je nešto što ne donosi direktnu dobit i zbog toga su rijetki dovoljno svjesni potencijalnog problema da samoinicijativno uvode kontrole koje koštaju, a ne donose direktnu dobit. Pozitivan primjer je HNB i njegova pravila koja je nametnuo bankama kako bi se osiguralo Internet bankarstvo. Čak mislim da bi tu trebalo izglasati i odgovarajuće zakone, zakone koji bi obvezali sve na pažnju i odgovorno postupanje, a možda bi ti zakoni bili dovoljno inovativni da budu primjer svima u svijetu.

Uglavnom, vidjet ćemo kako će se to razvijati...

Wednesday, July 11, 2012

Sigurnost Hrvatskih Web stranica...

Bojim se da danas svatko želi biti administrator i imati svoje vlastite Web stranice. To samo po sebi ne bi bilo problematično kada dobar dio tih wannabe administratora doista ne bi i ostvario svoje nakane. Ali eto, ostvaruju ih.

Sigurno se pitate zašto o tome pišem te zašto je to strašno? Pa evo, upravo sam naletio na jedan primjer pregledavajući Zone-H: Web sjedište joomla.upi.geof.hr je bila hackirana 6.4.2012. Na današnji dan, 11. 7. 2012. kada sam naletio na tu informaciju, ta stranica je još uvijek hackirana! Ista stvar je za www.upi.geof.hr koja se nalazi na istoj IP adresi. Uglavnom, čini se da nikoga nije briga!

Kao digresiju mogu navesti da sam prije godinu ili tako nešto slao mail jednom administratoru da ga obavijestim kako mu je provaljeno na Web stranice. Nikada nisam dobio odgovor, a i koliko sam pratio, ta provala nije bila sanirana!

Uglavnom, prvi primjer naveo me je da malo istražim koje su sve stranice u HR hakirane. U biti, samo sam postavio sljedeći upit na Google: "hacked by site:hr" i dobio popriličan broj stranica:
  • http://cib2009.grad.hr/
  • http://www.zamirnet.hr/unija47/
  • http://www.lukoc.com.hr/
  • http://udruga-slijepih.hr/
  • http://www.ffos.hr/katedre/knjiznicarstvo/studij/plan.php?studij=5
    (tu je u igri jedan lijepi SQL injection)
  • http://www.cvjecarna-amalija.hr/
  • ...
Primjetio sam također da je hakirano dosta blogova. I to na bloger.hr njih oko 98000, zatim na blog.hr 22600 i konačno na blog.dnevnik.hr oko 1350. Nije loše, čini se da im software baš i nije najjači, da ne kažem da je jadan. :) Uglavnom, sve skupa u samoj .hr domeni preko 140 tisuća rezultata.

U biti, možda to sve može izgledati bezazleno, ali baš i nije. Naime, na hakirane stranice može se podmetnuti zloćudni kod tako da se posjetitelje zarazi. Nakon što zaraze računala, napadačima se otvara cijeli niz drugih mogućnosti, od kojih je jedan i krađa privatnih podataka. Nadalje, hakirane stranice mogu biti samo prvi korak da se u potpunosti preuzme računalo te da se koristi kao "odskočna daska" za nove napade!

Saturday, April 28, 2012

Vrlo zanimljiv slučaj u vezi sigurnosti korisnika...

Dakle, desio se jedan vrlo zanimljiv slučaj u kojemu je nešto napravljeno kako bi se korisnici zaštitili a korisnici su optužili krivu tvrtku. Istovremeno, Microsoft nije ništa napravio i u očima korisnika on je bolji, iako je te iste korisnike ostavio na cjedilu!? Zvuči zanimljivo, zar ne?

Dakle, da opišem malo konkretnije što se desilo, samo što ću naravno izbaciti iz priče konkretna imena kako bi zaštitio nedužne (tj. sebe :)).

Dakle, u Oracleovoj Java implementaciji otkriven je ozbiljan propust koji omogućava vrlo jednostavno kompromitiranje računala. Iz tog razloga Mozilla je odlučila onemogućiti Java podršku u Firefox pregledniku. Ako se pitati zašto, odgovor je zato što preglednik ne može forsirati korisnika da nadogradi Java okruženje. Ono što može je spriječiti korisnika da koristi Java Applete dok dotični ne nadogradi Javu.

Međutim, što korisnici znaju o Java programskom okruženju. To je retoričko pitanje jer odgovor je jasan kao dan i glasi: ništa! Ono što oni znaju je da koriste aplikaciju od Jedne tvrtke (TM) - primjetite veliko početno slovo. Ali ne znaju da ta aplikacija ovisi o Javi. U biti, još ljepše je što ti dijelovi koji ovise o Javi nisu nastali unutar Jedne tvrtke, već su kupljeni od Druge tvrtke (TM) - opet, primjetite veliko početno slovo. Uglavnom, aplikacija na Firefox pregledniku odjednom ne radi i eto hrpe gnjevnih korisnika koji optužuju Jednu tvrtku. Međutim, Druga tvrtka nije samo Jednoj tvrtki prodala svoje Java rješenje, prodala je i trećim tvrtkama. Pratite me? :) Ali tim trećim tvrtkama i dalje aplikacije rade, a rade zato što oni svojim klijentima kažu da koriste Internet Explorer koji bez ikakvih problema izvršava ranjivo Java okruženje.

Uglavnom, rezultat su gnjevni korisnici Jedne tvrtke koji su istovremeno zaštićeni, i sretni korisnici trećih tvrtki koje nije briga za vlastite korisnike i koji su ranjivi, a vjerojatno dobar dio njih i zaražen na neki način. Zanimljivo, zar ne. :)

A naravno, tu je i Druga tvrtka koja da iole malo drži do svojih korisnika, direktnih i indirektnih, dobro bi razmislila može li eliminirati Java programski jezik iz svojih proizvoda. U biti ne samo to, ta tvrtka bi obavijestila svoje klijente o navedenom propustu. Ali Drugu tvrtku brine samo profit, moguće i da je nekompetentna (u to neću ulaziti sada) i rezultat je jedan veliki krš i lom!

Thursday, February 16, 2012

Napadi Anonymousa po Hrvatskoj...

Eto, zadnja vijest je da je Anonymous uspješno napao stranice Ministarstva vanjskih poslova, treći javni napad nakon stranica Predsjednika Republike i ZAMP-a.

Dalo bi se filozofirati što je taj "Anonymous" budući da svaki hakerčić može na stranicu staviti izjavu "Ja sam Anonymous." To s jedne strane nije bitno, a s druge je. :) Nebitno je zato što je napad učinjen i očito je bilo propusta te je nebitno tko konkretno je to napravio, postoji propust i to je to! S druge strane, kada ono protiv čega se borite nema organizaciju, onda nemate ni gdje udariti kako bi ste tu organizaciju onesposobili! To je veliki problem u stvari, i zbog toga je bitno kako Anonymous funkcionira!

No, bitno je isto tako kako je razina sigurnosti i svijesti o sigurnosti u Hrvatskoj na izrazito niskim granama. Moram priznati kako je najnapredniji dio sustava bankarski, odnosno, financijski sektor koji kontrolira HNB. HNB sve bolje upravlja tim sustavom sa sigurnosnog stanovišta. Istina, kakva je situacija u obavještajnim službama i policiji ne znam, a moguće je i da velike internacionalne tvrtke u HR isto imaju odgovarajuće mehanizme zaštite. No, većina u Hrvatskoj, što javnih što privatnih poduzeća je u katastrofalnom stanju!

Konačno, to me dovodi i do jedne pozitivne stvari u cijeloj ovoj priči s Anonymousom. Ovo do sada su relativno bezazleni napadi (bar se tako čini za sada!) čija jedina šteta je utjecaj na reputaciju. Iako, moram reći, da reputacija ionako nije nešto prevelika. No, da se vratim na bitnu stvar, naime, nadam se da odgovorni u Hrvatskoj postaju sve svjesniji sigurnosnih problema te da će to potaknuti ulaganje više sredstava u zaštitu, ne samo institucija već i pojedinaca.

Za kraj, zanima me da li MVPEI, odnosno policija, traže počinitelja...

Friday, January 27, 2012

Biseri naših neukih novinara 2...

Eto, nastavak serije bisera potaknut člankom o napadu na Index u Novom listu. Ok, moram priznati da ovaj puta biser nije toliko velik kao prethodni, ali svejedno ga smatram biserom. Međutim, ovom prilikom neću kritizirati samo novinare Novog lista već i Index (iako, praktično gledajući radi se opet o novinarima :)).

Citirani članak piše kako je "najpoznatiji" domaći "haker" napao Index i zamijenio mu naslovnu stranicu. Stranica je nakon napada, a prije obnove, imala sljedeći oblik:


Ok, ajmo sada s kritikama.

Thursday, January 26, 2012

Tvrtki Symantec ukraden izvorni kod...

Symantecu je ukraden izvorni kod nekih njegovih proizvoda! O tome sada bruji cijeli Internet jer se radi o velikom problemu.

Ironija je da proizvođač čija primarna djelatnost je vezana uz sigurnost računala i mreža, i koji bi trebao druge štiti, je sam uspješno napadnut 2006. godine te mu je tom prilikom ukraden izvorni kod nekih njegovih proizvoda. Kradljivci koda prijete da će ga objaviti, no, bez obzira na to da li je javno objavljen ili ne već sama činjenica da napadači imaju kod znači da mogu (i vjerojatno hoće) pronaći sve ranjivosti. U najgoroj situaciji su korisnici pcAnyware proizvoda za koji Symantec preporuča da ga se isključi! Još gore, na jednom tweet-u sam primjetio kako se tvrdi da je Symantec nekoliko godina znao za postojanje tri stražnja vrata (backdoor) u tom proizvodu te da ih nije ispravio.

Ovdje ima još jedna zanimljivost. Naime, stalno se vode rasprave da li je sa sigurnosnog stanovišta bolje objaviti kod ili ne. Pobornici zatvorenog koda tvrde kako na taj način napadači imaju manje informacija te su manje efikasni prilikom napada. Teoretski, takav pristup bi se moglo podvesti pod sigurnost korištenjem prikrivanja (engl. security through obscurity) za koji se općenito tvrdi da nije dobar (plus/minus, pogledajte ovaj post). S druge strane, zagovornici otvorenog koda tvrde kako se objavljivanjem koda postiže bolja kvaliteta dotičnoga. Ja sam osobno negdje na sredini, iako, bliže ovom drugom pristupu. Ovaj incident sa Symantecom pokazuje da u slučaju krađe zatvorenog koda nastaju veliki problemi jer je gotovo sigurno da je kod nesiguran, tj. da ima dosta propusta. Dodatno, slučaj Symanteca (a i Microsofta prije toga) pokazuje da je jako teško zaštititi kod od ciljane krađe. I ne samo to. Prva vijest je bila da je kod ukraden Indijskoj vladi. Ispostavilo se da je ta vijest lažna, tj. da je baš Symantecu ukraden kod. Međutim, ne smije se podcijeniti činjenica da se kod nalazi i u posjedu nekih vlada - a koje bi ga mogle zloupotrijebiti za svoje potrebe!

Sve u svemu, škakljiva tema.

About Me

scientist, consultant, security specialist, networking guy, system administrator, philosopher ;)

Blog Archive