Tässä blogikirjoituksessa tarkastelemme, miten suorittimen suorituskyvyn parantamiseksi käyttöön otetut teknologiat aiheuttivat tietoturvahaavoittuvuuksia, kuten Meltdownin ja Spectren.
Jos olet kiinnostunut IT-uutisista, saatat muistaa jonkin aikaa sitten ilmenneet tietoturvaongelmat nimeltä "Meltdown" ja "Spectre". Nämä kaksi bugia ovat tehokkaita haavoittuvuuksia, jotka mahdollistavat tietojen varastamisen kenenkään tietämättä, kohteen tyypistä riippumatta. Virustorjuntaohjelmistot havaitsevat helposti perinteiset hyökkäystyökalut, kuten virukset ja haittaohjelmat, koska ne jättävät jälkiä hyökkäyksistään. Meltdown ja Spectre voivat kuitenkin päästä tietokoneohjelmien ytimeen jättämättä jälkiä. Tämä johtuu Meltdownin ja Spectren taustalla olevista periaatteista. Tässä artikkelissa selitämme, miten nykyaikaiset tietokoneet toimivat ja mitkä ovat tätä hyödyntävän Meltdown-bugin periaatteet.
Ensinnäkin tarkastellaan, miten tietokoneet toimivat. Tietokoneet voidaan karkeasti jakaa laskelmia suorittaviin suorittimiin (CPU) ja tallennusta suorittavaan RAM-muistiin (RAM). CPU on lyhenne sanoista Central Processing Unit, joka vastaa tietojen laskemisesta ja käsittelystä ohjeiden mukaisesti. RAM on lyhenne sanoista Random Access Memory, joka tallentaa sarjan komentoja, jotka CPU:n on suoritettava, sekä laskelmien välituloksia. Nämä laskelmat sisältävät ohjelmatietoja, jotka vaihtelevat pienistä tiedoista, kuten pelaajan kunnosta parhaillaan pelattavassa pelissä, suuriin tietoihin, kuten tietoihin käyttöjärjestelmästä ja ytimestä, jotka ovat keskeisiä tietokoneen toiminnan kannalta.
RAM-muistia käytettäessä suoritin tallentaa tiedot osoitteiden avulla. Tietokoneet eivät voi tallentaa numeroita ja kirjaimia vapaasti kuten kannettavalla tietokoneella. Kaikki tietueet tehdään tavuina, jotka ovat kahdeksan nollan ja ykkösen sarja. Desimaalilukumuotoon muunnettuna RAM-muistiin voidaan tallentaa vain numeroita 0–1. Merkkejä tallennettaessa jokainen merkki muunnetaan vastaavaksi numeroksi ja tallennetaan. Esimerkiksi merkkijono "omena" muunnetaan numeroiksi 0, 255, 97, 112 ja 112 ja tallennetaan RAM-muistiin järjestyksessä.
RAM-muisti oli mullistava nopeuden suhteen alun perin kehitettäessään, mutta tietokoneiden kehittyessä RAM-muistia nopeampi muisti tuli välttämättömäksi. Tyypillinen esimerkki tästä on välimuisti. Välimuistilla on samanlainen tehtävä kuin RAM-muistilla, mutta se on erillisessä paikassa sijaitseva muistitila. Välimuisti on pohjimmiltaan sisäänrakennettu suorittimeen ja on paljon nopeampi kuin RAM, mutta sen kapasiteetti on pienempi. Suoritin parantaa huomattavasti prosessointinopeutta tallentamalla laskutoimitusten tulokset, joita todennäköisesti käytetään usein käskyjen käsittelyn aikana, välimuistiin RAM-muistin sijaan.
Samaan aikaan tietokoneen suorituskyvyn parantuessa myös ohjelmien vaatima prosessointinopeus kasvoi, eikä suoritin enää kyennyt vastaamaan klassisen peräkkäisen prosessointimenetelmän käyttävien ohjelmien vaatimuksiin. Se oli saavuttanut fyysiset rajansa. Siksi suoritinvalmistajat esittelivät 2000-luvun tienoilla uuden ominaisuuden nimeltä epäjärjestyksessä suoritus. Komennot tallennetaan peräkkäin RAM-muistiin, mutta suoritin suorittaa ensin tulevat komennot ja tallentaa tulokset. Kun myöhemmin tarvitaan muita komentoja, suoritin hakee nopeasti välimuistiin tallennetut laskutulokset, mikä parantaa prosessointinopeutta.
Jos etukäteen suoritettu komento myöhemmin havaitaan virheelliseksi, miten suoritin reagoi? Esimerkiksi jos pyydetään RAM-muistiin tallennettua järjestelmänvalvojan tilin salasanaa, suorittimen on lopetettava komennon suorittaminen. Ei-peräkkäisessä suorituksessa komento kuitenkin suoritetaan tarkistamatta sen kelvollisuutta ja tulostiedot tallennetaan välimuistiin. Jos ohjelma pyytää näitä tulostietoja normaalilla tavalla, vaikka komento olisi suoritettu etukäteen, pyyntö hylätään, mutta tässä rakenteessa tapahtuu virhe, ja Meltdown hyödyntää tätä heikkoutta.
Tarkastellaanpa nyt Meltdown-hyökkäysohjelman rakennetta. Tarvitset vain sekuntikelloa, jolla mittaat datan lukemiseen kuluvan ajan. Ensin tyhjennä välimuisti laskemalla sen kapasiteetti. Tämä alustaa välimuistissa olevat tiedot ja poistaa mahdolliset yhteensattumat. Seuraavaksi hae tiedot tietystä RAM-muistin osoitteesta, joka sisältää haluamasi tärkeät tiedot (kutsutaan tätä tietoa α:ksi), ja tallenna satunnaisia tietoja samaan tilaan kuin muistin 1000+α-osoite. Tämä komento hylätään, koska se yrittää hakea tietoja suojatusta osoitteesta (joka on suojattava, koska se sisältää käyttöjärjestelmätietoja), mutta epäperäkkäisen käsittelyn vuoksi se suoritetaan ennen hylkäämistä, ja osoitteessa 1000+α olevat tiedot tallennetaan välimuistiin.
Hyökkääjä lukee sitten muistin läpi ja mittaa ajan, joka kuluu datan lukemiseen kustakin osoitteesta. Yleensä lukunopeus on vakio, mutta joidenkin osoitteiden havaitaan lukevan dataa huomattavasti nopeammin kuin toisten. Nämä ovat juuri laskettuja ja tallennettuja 1000+α-osoitteita. Lopulta, kun välimuistiin tallennetut osoitteet on tunnistettu, 1000+α:n arvo voidaan määrittää ja α:n arvo eli tärkeä järjestelmätieto voidaan löytää. Toistamalla tätä prosessia on mahdollista saada selville kaikki tietokoneen turvallisuuden kannalta tärkeät tiedot, mukaan lukien järjestelmänvalvojan tilin salasana.
Meltdown on niin pelottava, koska ei-peräkkäinen suoritustekniikka on tekniikka, jota käytetään kaikissa Intelin suorittimissa, ja vaikka Intel ei itse tekisikään niin, sitä käyttävät myös Qualcomm ja Samsung, jotka valmistavat suorittimia pääasiassa mobiililaitteille. Toisin sanoen lähes kaikki elektroniset laitteet maapallolla ovat alttiina tälle uhalle. Intelin kilpailija AMD ei ole alttiina Meltdownille, koska se tarkistaa ensin komennot suorittaessaan epäjärjestyksen mukaista suoritusta, mutta se on alttiina Spectre-virheelle, joka on vaikeampi käsitellä ja joka hyökkää spekulatiivisen suorituksen haavoittuvuuksiin, jotka eivät ole epäjärjestyksen mukaista suoritusta. Tämän seurauksena kaikki suorittimet ovat alttiina Spectre-Meltdown-virheelle.
Monet käyttöjärjestelmät, mukaan lukien Windows, ovat julkaisseet hätäkorjauksia näiden virheiden korjaamiseksi, mutta koska hyökkäykset eivät jätä jälkiä, on mahdotonta tietää, hyökättiinkö tietokoneeseen ennen korjauksen asentamista. Lisäksi jopa korjauksen asentamisen jälkeen, joka ei ollut perustavanlaatuinen ratkaisu, vaan ainoastaan tapa estää epäperäkkäinen suorittaminen, tietokoneen prosessointinopeudet hidastuivat merkittävästi. Koska tämä on suorittimen suunnittelun ongelma, ainoa ratkaisu on laitteiston vaihtaminen.
Tähän mennessä olemme selittäneet, miten nykyaikaiset tietokoneet toimivat ja miten Meltdown hyödyntää tätä. Tietokoneiden laskennasta vastaavalla suorittimella on ei-peräkkäinen suoritustoiminto, joka suorittaa komentoja etukäteen, tallentaa ne ja hakee ne tarvittaessa, mikä parantaa merkittävästi prosessointinopeutta. Tästä prosessista johtuvat haavoittuvuudet ovat kuitenkin johtaneet vakaviin tietoturva-aukkoihin. Järjestelmässä on myös Spectre-niminen vika, mutta koska Spectren selittäminen vaatii lisäselvitystä spekulatiivisesta suorituksesta ja hyökkäystekniikoista, emme selitä sitä tässä. Spectre on kuitenkin myös tapaus, jossa suorittimen suorituskyvyn parantamiseksi käyttöön otettu teknologia aiheutti ongelmia. Toivomme, että tämä toimii ennakkotapauksena sille, että pohdimme syvällisesti suorituskyvyn parantamista muillakin aloilla kuin tietokoneissa ja tarkastelemme, puuttuuko meiltä jotain tärkeää.