Tartu Ülikool Loodus- ja täppisteaduste valdkond Arvutiteaduse instituut Sandra Puusepp CVE-2017-9948 Referaat Tartu 2018
Sissejuhatus Microsoft Skype on rakendus, mis võimaldab suhelda Interneti teel. Kasutajad saavad üksteisele saata tekstsõnumeid, jagada pilte ja videosid, teha tava- ning videokõnesid ja ka grupikõnesid. Skype i saab kasutada nii arvutis, nutiseadmes kui ka rakendust võimaldavates telerites. Kõnede tegemiseks kasutatakse seadmesse sisseehitatud või sellega ühendatud mikrofoni või veebikaamerat. 16. Mail 2017 leidis Benjamin Kunz Mejri Skype i Windowsi versioonidel 7.2, 7.35 ja 7.36 turvaaugu, mis seisnes pinu põhise puhvri ületäitumises (ing k: stack buffer overflow ). See turvaauk võimaldas rünnatavas masinas Skype i töö ootamatult peatada ning jooksutada seal pahatahtlikku koodi. Turvaaugu kirjeldus Turvaauk leiti Skype i lõikelaua ( clipboard ) vormingu funktsioonis. See oli seotud MSFTEDIT.DLL dünaamiliselt lingitava teegi failiga Windowsi operatsioonisüsteemides. Nimelt sai ründaja tekitada pinu põhise puhvri ületäitumise, kui ta kasutas kaugarvutit jagatud lõikelauaga ning kleepis kopeeritud materjali lokaalse masina Skype i sõnumiaknasse. Saadetud materjali suurusel või ekraanitõmmiste arvul ei olnud mingeid kindlaid piiranguid ning seetõttu sai ründaja ühe päringuga Skype i töö peatada ja kirjutada üle pinu EIP register (ehk kutsuda esile pinu põhise puhvri ületäitumise). Seega said ründajad läbi Skype i jooksutada oma pahatahtlikku koodi ohvri arvutis või sellega ühendatud masinates. Gilasterr.log faili kirjutatakse püüdmata erindi korral protsessi registrid ja toorandmed. Seda logi kasutavad Skype i arendajad, et tuvastada probleeme nende tekkimise hetkel ja saada sellest parem ülevaade. Logi väljavõttest on näha, et toimus ületäitumine ja EIP register kirjutati üle. Samuti on näha WinDBG tööriistaga silumise logidest EIP registri ülekirjutamist ja MSFTEDIT.DLL failiga seotust (mõlemad logid on toodud allpool).
Väljavõte Gilasterr.log failist (erindi registrid). Registri ülekirjutamine on märgitud kollasega. Exce) esi=591429f8 edi=1aa5c3d0 ebp=19da88 esp=19d8a0 eip=5923ec45 eax=1aa5c3b8 ebx=78 ecx=78 edx=19daac f=10206 Exce) esi=591429f8 edi=1aa5c3d0 ebp=19da88 esp=19d8a0 eip=00410041 eax=1aa5c3b8 ebx=79 ecx=78 edx=19daac f=10206 Exce) esi=591429f8 edi=1aa5c3d0 ebp=19da88 esp=19d8a0 eip=41414141 eax=1aa5c3b8 ebx=80 ecx=78 edx=19daac f=10206 Silumise logi (WinDBG). Registri ülekirjutamine ning seos MSFTEDIT.DLL failiga on märgitud kollasega. 0:000> g (f2c.1638): Unknown exception - code 000006a6 (first chance) (f2c.1c18): Unknown exception - code 000006a6 (first chance) (f2c.1e80): Unknown exception - code 000006a6 (first chance) (f2c.1c18): Unknown exception - code 000006a6 (first chance) (f2c.16dc): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=644a1801 ebx=12544290 ecx=644a1801 edx=12544278 esi=12544278 edi=0018f394 eip=00410041 esp=0018dc64 ebp=0018dc7c iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210202 00410041 8b30 mov esi,dword ptr [eax] ds:002b:644a1801=???????? 0:000> g (f2c.16dc): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=644a1801 ebx=12544290 ecx=644a1801 edx=12544278 esi=12544278 edi=0018f394 eip=00410041 esp=0018dee4 ebp=0018defc iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210202 00410041 8b30 mov esi,dword ptr [eax] ds:002b:644a1801=???????? 0:000> g
(f2c.10b8): Unknown exception - code 000006a6 (first chance) (f2c.16dc): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=644a1801 ebx=12544290 ecx=644a1801 edx=12544278 esi=12544278 edi=0018f394 eip=00410041 esp=0018dc64 ebp=0018dc7c iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210202 00410041 8b30 mov esi,dword ptr [eax] ds:002b:644a1801=???????? 0:000> u 00410041 8b30 mov esi,dword ptr [eax] 644a1803 8bce mov ecx,esi 644a1805 ff1560056864 call dword ptr [MSFTEDIT!DllGetActivationFactory+0x75dc0 (64680560)] 644a180b 8bcf mov ecx,edi 644a180d ffd6 call esi 644a180f 8b7f04 mov edi,dword ptr [edi+4] 644a1812 85ff test edi,edi 644a1814 75e9 jne MSFTEDIT!CreateTextServices+0x28a4f (644a17ff) 0:000> a Antud turvaauk hinnati kõrge riskiga turvaauguks, CVSS ( common vulnerability scoring system ) hinnanguga 7,2. Selle turvaaugu ärakasutamine ei nõudnud isegi kahe Skype i kasutaja omavahelist suhtlemist ning seda sai teha ka madalate privileegidega Skype i kasutaja. Pinu põhine puhvri ületäitumine ehk stack buffer overflow Pinu ehk magasin on andmestruktuur, mis töötab viimasena sisse, esimesena välja põhimõttel (LIFO - last in first out). See tähendab, et pinusse viimasena lisatud andmed võetakse sealt esimesena välja. Kui programmis kutsutakse välja uusi funktsioone, siis arvuti mälus pinu suurus kasvab allapoole.
Pinu põhine puhvri ületäitumine esineb, kui programm kirjutab rohkem andmeid pinus olevasse puhvrisse, kui tegelikult sellele puhvrile mälu antud on. Pinus oleva puhvri ületäitumine suudab suurema tõenäosusega programmi kokku jooksutada kui kuhjas oleva puhvri ületäitumine, sest pinu sisaldab kõikide aktiivsete funktsioonide väljakutsete tagastusaadresse (ehk kust peaks kood peale funktsiooni täitmist oma tööd jätkama). Antud turvaaugu puhul sai kirjutada üle EIP registri. EIP hoiab endas mäluaadressi, mis viitabki järgmisele käsule, mida jooksutada tuleb. Kuidas sellist ületäitumist Skype is sai esile kutsuda? Ründaja lõi lokaalses masinas kaugtöölaua ühenduse ( Remote Desktop Client - RDP) teise süsteemiga ning ta pidi lubama lõikelaua funktsiooni ka kaugsüsteemile. Seda on võimalik lubada RDP seadistustest. Seejärel ründaja liikus RDP süsteemi ning tegi ekraanitõmmise. See laetakse lokaalse süsteemi vahemälusse ja edasi sai ründaja minna lokaalse masina Skype i vestlusaknasse ning kleepida lõikelauale kopeeritud ekraanitõmmis sõnumiaknasse. Selle peale viskas Skype lõikelaua erindi (vt joonis 1), kuna pildivormingu suurus oli teadmata.seejärel jooksis Skype kokku ( crash is) mitmete juurdepääsu ületustega ( access violations ) (vt joonis 2). Joonis 1. Lõikelaua erind.
Joonis 2. Juurdepääsu ületus. Lahendus Seda turvaauku saab parandada erinevat moodi. Saab kleepimisel piirata kaugsüsteemist lõikelauale kopeeritud andmete hulka ja suurust, keelata andmete saatmist, kui need ei asu masinas, millest andmeid saadetakse. Tuleks lisada turvalisem erinditöötlus, et ennetada järgmisele mäluaadressile liikumist, kui esinevad püüdmata või ootamatute vigade erindid. Teiseks lahenduseks oleks lõikelaud deaktiveerida, kui andmed, mida päritakse lõikelaualt, ei ole pärit lokaalsest süsteemist. Need parandused tagaksid selle, et ründaja ei saa kasutada lõikelauda ületäitumise tekitamiseks. Arendajate meeskond parandas turvaaugu Skype i versioonis 7.37.178.
Kasutatud materjalid 1. https://www.skype.com/et/about/ 2. https://www.vulnerability-lab.com/get_content.php?id=2071 3. https://payatu.com/understanding-stack-based-buffer-overflow/ 4. https://www.vulnerability-db.com/?q=articles/2017/05/28/stack-buffer-overflow-zero-day -vulnerability-uncovered-microsoft-skype-v72-v735