Flashi mängude ja võistluste turvavead

Käesolev artikkel on veidi muudetuna ilmunud ka ajakirjas Arvutimaailm.

Kuidas Flashi rünnatakse

Flash on saanud tänapäeval veebilehitsejas mängitavate mängude ja uhkete kasutajaliideste sünonüümiks. Arendajatel on Flash-i kasutades väga lihtne valmistada ilusa graafikaga mänge ja rakendusi, ilma et peaks pöörama liigset tähelepanu vahekihtidele ja muule esmapilgul teisejärgulisele. Arendamise kiiruse ja odavuse osas on see väga positiivne, kuid kahjuks tuleb see tihti teiste asjade hinnaga. Näiteks on peaaegu kõik mängud, mis on tehtud Flashis ning millel kehtib mingisugune edetabel või võidud, haavatavad teatud lihtsatele rünnakutele. Et aru saada, miks see nii on, seletan lühidalt kuidas käib andmete liikumine ajal kui mängite mingit arvutimängu:

Tegevused ja andmete liikumine tüüpilise edetabeliga Flash mängu puhul:

1) Kasutaja avab lehekülje, millel mäng asub.

Kasutaja veebilehitseja saadab päringu serverisse, millele server vastab, saates tagasi flashi swf faili.

2)Kasutaja hakkab mängu mängima.

Kasutaja arvuti avab flashi programmi abil selle swf faili mille server saatis. Selle avamisel luuakse ette pilt ja kasutaja saab mängu mängima hakata.

3) Kasutaja lõpetab mängu, sisestab oma nime ja näeb oma kohta edetabelis

Kui flashi mäng jõuab lõpule, esitab mäng kasutajale nime jms. andmete sisestamise võimaluse. Kui need on sisestatud, saadab mäng tulemused serverile, kasutades selleks täpselt samasugust protokolli (HTTP), mida kasutab ka browser. Samuti kasutab suures osas sama seadistust (sama proxy jms). Server vastus sisaldab endas kohta edetabelis ja muud infot, mida tuleb kasutajale kuvada.

Selline lahendus võib tunduda esmapilgul piisav, kuid ei ole seda sugugi. Nimelt on petmiseks lühidalt 2 võimalust. Üks võimalus on kuidagi muuta flashi faili nii, et kasutaja saab suuremad punktid või paremad tingimused. See võib osutuda veidi keeruliseks ning pigem vajab programmeerija teadmisi. Kuid kui need on olemas (ja need ei pea olema eriti heal tasemel või kogemusega), siis ülejäänud on väga lihtsaks tehtud. On tarkvarad nagu SWF Decompiler või Flash Decompiler Gold, mis muudavad flashi koodi tagasi algkujule, lubades ründajal vaadata kuidas programm oli loodud ning seejärel vajalikud muudatused sisse viia.

Kuid pahatihti pole isegi seda vaja. Nimelt on olemas ka teine võimalus, milleks on rakenduse ja serveri vahel toimuva andmevahetuse kinni püüdmine, et seal sees muudatus teha. Kuigi ka see võib esmapilgul kõlada keerulisena, ei ole see tegelikult seda sugugi. Nagu ma kirjutasin eespool, kasutab Flash andmevahetuseks paljuski sama seadistust, mida veebilehitseja, sealhulgas sama proxy-t. See tähendab, et flashi on juba sisseehitatud võimalus vahendada andmeid mõne kolmanda osapoole vahendusel. Selleks kolmandaks ehk vahelüliks võib olla mõni kasutaja valitud programm tema enda arvutis. Näiteks Burp Suite vahendite hulka kuuluv Burp Proxy. See käivitades ja määrates veebilehitseja proxy aadressiks oma arvuti (localhost või 127.0.0.1) ning port mida Burp proxy kasutab (vaikimisi 8080), saame igat saadetavat päringut uurida ning muuta. Tihti avastame selle käigus, et hetkel kui oleme oma nime ja muu vajaliku info mängu lõppedes sisestanud, saadab flash serverile umbes sellise päringu:

http://www.mangu_aadress.ee/mängu_nimi_vms.php?player=Jaanus&points=2450

Juhul kui hetk enne seda olime oma nimeks sisestanud Jaanus ja saanud oma punktsummaks 2450 punkti, siis pole vaja olla programmeerija, et aru saada, mida tuleks muuta, et oma punktisummat suurendada. Ja seejärel võib su punktisumma olla juba milline iganes.

Kuidas saab arendaja kaitsta ennast

Arendaja saab ennast kaitsta erinevate vahenditega. Esimese kirjeldatud rünnaku, ehk flashi dekompileerimise ja uurimise vastu aitab näiteks ActionScript Obfuscator, mis muudab dekompileerimise palju raskemaks, ning samuti on tulemus palju halvemini loetav. Samas pole see aga kahjuks piisav vahend kindlameelse ründaja vastu. Teise rünnaku ehk andmevahetuse lõikamise ja muutmise vastu, aitab teataval määral signeerimine. See aga aitab ainult seni, kuni ründaja ei ole Flashi programmi dekompileerinud ning näinud, kuidas ja mille abil signeerimine toimub. Kui aga kombineerida nii esimene kui teine kaitsemeetod, on tulemuseks sihtmärk mis suure tõenäosusega pole ründajale vaeva väärt. Kuid murdmatu pole see kaugeltki.

Seega on ainuke turvaline viis luua rakendus, mis kasutab Flashi ainult kasutajaliidese kihina ning ei jäta rakendusse mingit olulist loogikat ega andmeid. Seda teed on läinud näiteks kasiinod. Kui inimene neis mängima hakkab, siis ei hoita Flashis mingit loogikat või andmeid, mida muutes inimene saaks kasiinot petta. Näiteks pokkerit mängima hakates ei arvuta suvalisi kaarte välja Flash ise, vaid server. Server saadab selle info Flashile ja ootab. Kui kasutaja midagi valib või teeb, siis saadetakse kogu see info serverile ja server teeb kogu loogika ja arvutused. Flashi kasutatakse ainult kasutajaliidese kihina.

Näide ühelt tuntud saidilt

Delfi tegi oma 10-da sünnipäeva puhul Flash lauamängu, mille parimatele mängijatele pakuti spa ja golfi puhkusepakette ning muid auhindu. Mängimise ajal ei pidanud rakendus serveriga kordagi ühendust. Alles pärast mängu lõpetamist ja oma kontaktide sisestamist saadeti serverile järgnev päring:

www.delfi.ee/misc/game10/score.php?name=Jaanus&phone=53111777&hash=4d17fbed2 e8e81e91b4d6e0715f7502&email=minuMail@gmail.com&score=125

Nagu näha, oleks oma punktisummat väga lihtne muuta, kui asi ainult sellega piirduks. Aga Delfi oli õnneks ühe kaitsemeetme kasutusele võtnud. Nimelt hash=4d17fbed2 e8e81e91b4d6e0715f7502 on kontrollväärtuseks ja lihtsalt peale vaadates ei ole teada, kuidas see koostatud on. Samas jäeti aga tähelepanute esimesena kirjeldatud oht, ning oleks olnud suhteliselt lihtne võtta flashi rakendus lahti ja vaadata kuidas kontrollkood koostatakse.

Sealt edasi oleks olnud juba lihtne saada parim tulemus. Aega oleks see võtnud alla tunni ja esikohad oleks läinud kõigile ründaja pere liikmetele ja parematele sõpradele. Loodetavasti seda tegelikult ei juhtunud.

Kirjeldatud viga Delfi lauamängus oleks saanud vältida kui oleks kasutanud ka selles mängus Flashi lihtsalt kuvamiseks ja vahendamiseks. Käike, küsimusi ja täringuveeretusi oleks arvutanud server. Iga kasutaja vastus oleks saadetud serverile tagasi ning ka punkte oleks hoitud serveris. Sellisel juhul oleks rünnak Flashi vastu olnud kasutu. Kuigi selliseid vigu leidub Eestis väga väga palju, ei saa suurema osaga nendest midagi tõeliselt halba korda saata. Palju suurem probleem on sellise vea olemasolu ka välismaistel ülisuurtel mängusaitidel, kus võistlus käib raha peale. Üheks selliseks näiteks on king.com mängusait, mis on küll maailma suurim, kuid ikkagi samade probleemide ees ning pole suutnud samuti neile üheselt rahuldavat lahendust leida.

3 thoughts on “Flashi mängude ja võistluste turvavead”

  1. Probleemid tavaliste http päringute ja kriitilise loogika sissekirjutamisega on mitte ainult Flash-i mängudel. Vaid pigem ka kõikidel muudel vahenditel millega veebimänge või programme realiseeritakse. Flash ega ka muud vahendid ei erine siin kohal üskteisest mitte kuidagi. :)
    Pigem peaks nentima, et kui tõesti pole mingi veebimängu andmeid tõhusamalt kaitsta viitsitud, ju siis pole seda nii väga oluliseks peetud.

  2. Loomulikult on see üldisem viga kui ainult Flashi puhul :) Lihtsalt Flashi puhul on see kõige levinum( valdav osa mänge jms tehaksegi Flashis ) ja kõige kergem näiteid tuua. Ning jah, turvalisus pole oluline mingite lihtsate mängude jms puhul, millel on lihtsalt skoori tabel vms.
    Probleem on olemas, kui rakenduse taga on reaalsem raha. Mängude puhul see sama Delfi näide ja samuti king.com sait, kus mängitakse juba raha peale ning kus on sama viga olemas. Aga asi ei piirdu mängudega. Ma olen näinud admin rakendusi, kus saab pm täieliku ligipääsu, muutes veidi flashi programmi või jättes proxyga rakendusele muu mulje( ehk jällegi pole pea mingit serveri poolset kontrolli ). Ja siis on see juba suureks probleemiks. Mängud olid antud olukorras lihtsalt süütuks näiteks suuremale probleemile. Ja Flash saigi valitud kirjeldamiseks seepärast, et see on väga levinud ning seepärast, et mitmedki arendajad ei oska oodata sellist rünnet selle rakendustele. Loomulikult on probleem tegelikult palju üldisem

  3. Väga hea postitus, lugesin suure huviga.
    Mind üllatas väide, et praegu on ikka veel levinud mingid reaalse rahaga seotud flash mängud ja süsteemid, kus ei toimu käigupõhist serveriga suhtlemist.

    Tänapäeva netikasiinod muidu jälgivad iga liigutust ning keerukad algoritmid üritavad avastada mängijate tegevuses seaduspärasusi. Praktiliselt võimatu on olla edukas mängides näiteks netiruletti Martingale panustamise printsiibi järgi, reaalses elus on aga tõenäosus “alati” võitjaks jääda üsna suur.

Leave a Reply

Your email address will not be published. Required fields are marked *