Tartu Ülikool CVE-2013-7040 Referaat aines Andmeturve Autor: Markko Kasvandik Juhendaja : Meelis Roos Tartu 2015
1.CVE 2013 7040 olemus. CVE 2013 7040 sisu seisneb krüptograafilises nõrkuses. Turvaaugu esinemise korral genereeritakse räsialgoritmiga mitmele erinevale võtmele ühesugune viide ehk räsikood mis peaks viitama tabeli koordinaadile. Ideaalis peaks ühele võtmele vastama ainult üks viide ehk igale elemendile määratletud oma koht paisktabeli masiivis. Turvaaugu tõttu suunatakse aga mitme erineva võtme korral ühte ja samasse andmemassiivi lahtrisse. Näitena võiks tuua kui andmebaasis erinevatele inimestele on omistatud sama telefoni number kui telefoninumber saab kuuluda tegelt ainult ühele isiksusele. 2.Turvaaugu kirjeldus. Paisktabel ehk räsitabel (inglise k. hash table) on tihedalt kasutatud andmestruktuur mis eksisteerib enamikes programmeerimis keeltes. Selle andmestruktuuri ülesanne on vastavusse panna võtme ja väärtuse paarid. Et seda teha tuleb kasutada vahelüli, milleks on räsifunktsioon. Näitena võib tuua situatsiooni kus on vaja kokku viia näiteks inimese nimi ja tema telefoni number. Räsifunktsioon arvutab välja unikaalse koodi ehk räsi, võttes sisendiks sisestatud võtme (inimese nimi). Selle tulemusena saadakse räsikood, mis defineerib mingi väärtuse koordinaati (asukohta) andmemassiivi tabelis. Näitena siis ütleb se koordinaat(räsi kood) millisel asukohal asub väärtus mis kuulub sisestatud võtmele ehk inimese nimele vastav telefoni number. Ideaalis peaks olema igale elemendile määratletud oma koht paisktabeli andmemasiivis. CVE 2013 7040 turvaaugu tõttu võib juhtuda, et mitmele võtmele arvutatakse sama tabelis paiknemis asukoht ning seda situatsiooni nimetatakse kokkupõrkeks ehk collision. Paisktabelite töö effektiivsemaks muutmiseks tuleb võimalikult väikseks muuta collision ehk kokkupõrgete võimalus. Probleemi intensiivsuse vähendamiseks tuleks valida selline räsifunktsioon mille põhjal leitud indeksid kattuks võimalikult vähe. Teine faktor mida veel silmas pidada, tuleb kasutada piisavalt suurt andmemassiivi, milles oleks elementidele kohti.
3.Võimalikud ohud. CPython ja python 2.7 kasutavad viimast kaheksat biti eesliitest, et genereerida suvalisi räsi väärtusi. Seda omadust saab ära kasutada,et kutsuda välja kindlalt ette ennustatud räsi koodi. Sisuliselt ei ole vaja teada õiget võtit vaid võib tuletada paisktabeli andmemassiivi lahtrile vastava alternatiivse võtme, kuna turvaauk võimaldab mitut võtit ühe paisktabeli andmemassiivi asukoha määramiseks. Mitu erinevat võtit mis kutsuvad esile sama räsikoodi tekitavad kokkupõrke. 4.Võimalik rünne. Üks rünne mida esile saab kutsuda kasutades turvaaugu nõrkust on "Dos" ehk denial of service. Erinevalt tavalisest DOS rünnakust (ehk BotNet koondab päringud ühte punkti) saab siinses situatsioonis üle koormata näiteks serverit ainult ühte arvutit kasutades. Kui ründaja saadab suures koguses päringuid millele vastab sama räsi väärtus, koormab se märkimisväärselt üle arvuti CPU ning tekib DOS rünnaku sümptom. Üks päring suudab tekitada ühele tuumale kuni 90 sekundilise tööprotsessi, ja kui päringuid korrata siis saab ajalimiiti pikendada niivõrd et serveri töö on pikalt häiritud.
5.Turvaaugu parandus. Ainus viis turva augu likvideerimiseks tuleb kasutusele võtta parem algoritm, mis genereerib räsisid mille puhul võimalus räside kokkulangemiseks on väiksemad. 100% räside kokkulangemist ei saa välistada kuid seda võimalust saab vähendada. Erinevate võtmevariantide arv sõltub räsi algositmist. Kuna siinkohal ei panda rõhku niiväga turvalisusele vaid kiirusele siis ei saa räsi pikkus olla liiga pikk (8 elementi). Kuid lühema pikkuse arvelt saab luua väiksema arvu võtmeid. Paremate (modifitseeritud) algoritmidega saab märkimisväärselt minimaliseerida kokkulangevuste võimalust. CPython originaalis kasutab ' Fowler Noll Vo ' räsi funktsiooni. Järgnev algoritm on modifitseeritud versioon ' Fowler Noll Vo 'st,et vähendada räside kokkulangevust (hash collision) tavaliste mitte väga pikkade sõnede (short string) puhul. Algoritmi kood : def fnv(p): if len(p) == 0: return 0 # bit mask, 2**32-1 or 2**64-1 mask = 2 * sys.maxsize + 1 x = hashsecret.prefix x = (x ^ (ord(p[0]) << 7)) & mask for c in p: x = ((1000003 * x) ^ ord(c)) & mask x = (x ^ len(p)) & mask x = (x ^ hashsecret.suffix) & mask if x == -1: x = -2 return x
6.Kasutatud materjalid. https://web.nvd.nist.gov/view/vuln/detail?vulnid=cve 2013 2131 http://bugs.python.org/issue14621 http://www.gossamer threads.com/lists/python/dev/959026 http://www.ocert.org/advisories/ocert 2011 003.html http://events.ccc.de/congress/2011/fahrplan/attachments/2007_28c3_effective_dos_on_web _application_platforms.pdf https://www.python.org/dev/peps/pep 0456/ http://www.securityweek.com/hash table collision attacks could trigger ddos massive scale