perjantai 5. tammikuuta 2018

Meltdown & Spectre

Viime päivien uutisissa on ollut paljon melua kahdesta tietoturvaan liittyvästä bugista, Meltdownista ja Spectrestä. En ole yksityiskohtaisesti perehtynyt näiden bugien sisältöön, mutta olennaista niissä kaikissa on se, että kun mikroprosessori suorittaa useita operaatioita rinnakkain, ja kun operaatioiden suoritusjärjestys ei ole fiksattu, syntyy tilanteita joissa tietynlainen periaatteessa kielletty operaatio saadaan suoritettua ja tulos luettua.

Esimerkiksi Meltdown toimii (karkeasti ja hiukan liikaa yksinkertaistaen) näin: Luetaan tietoa muistista johon ei oikeasti ole pääsyä. Teoriassa, ja tavallaan myös käytännössä, tämä kyllä huomataan, mutta suoritus ehtii etenemään jonkin matkaa ennen kuin asia huomataan. Tietoa itseään ei anneta eteenpäin, mutta vihamielinen prosessi on voinut laskea tiettyjä laskutoimituksia joiden tulos riippuu tuosta kielletystä muistista, ja näiden laskutoimituksen tuloksia jää välimuistiin. Vihamielinen prosessi pystyy selvittämään missä välimuistin osoitteessa nämä tulokset ovat, ja näin lukea (pienen määrän) jonkun toisen prosessin muistia.

Spectre puolestaan perustuu siihen, että prosessori "ennakoi" tilannetta jossa suoritus haarautuu. Esimerkiksi, ohjelman suorituksessa voi olla ehto "Jos X niin tee näin, muuten tee noin", ja ennen kuin tiedetään onko X totta vai ei, prosessori laittaa ennakoivasti joko "näin" tai "noin" suoritettavaksi. Tämä nopeuttaa keskimäärin suoritusta paljon, kunhan prosessorin arvaus on suurimmaksi osaksi oikein; jos arvaus on väärin, niin se huomataan ja ennakoivasti suoritetun laskennan tulos vain heitetään menemään.  Nyt, vihamielinen prosessi huijaa prosessorin arvaamaan väärin, ja suorittamaan ennakoivasti koodia joka lukee kiellettyä muistialuetta. Tämäkin huomataan ja suoritus peruutetaan ennen pitkää, mutta ennakoidun suorituksen tulos on laitettu välimuistiin, josta se ehditään lukea ennen kuin asiaa korjataan.

Tämä näin karkealla tasolla; huomautan että asia ei ole aivan noin yksinkertainen, ja esimerkiksi Spectren kohdalla on käsittääkseni mahdollista tehdä samankaltainen temppu ilman välimuistia. Myöskään mainitsemani välimuistin lukeminen ei ole mikään triviaali temppu. Olisikin varsin yllättävää, jos näin triviaalin kuuloinen ongelma olisi prosessorien suunnitteluvaiheessa jäänyt huomaamatta.

Suhteeni näihin ongelmiin on vähän ambivalentti. Jos olisin vielä erittäin innostunut aiemmasta tutkimuksestani, niin näiden tapausten esiintulo saisi minut toteamaan "mitä minä sanoin", ja vaatimaan tutkimukselleni lisää rahaa. Voisin jopa hyödyntää tätä hypeä ja paniikkia, ja hakea tutkimushanketta jossa vastaavia ongelmia etsitään lisää. Osaamiselleni on näiden ongelmien myötä varmasti enemmän kysyntää. Toisaalta en todellisuudessa usko että formaalin verifioinnin olemassaolevilla tai edes vähän kehittyneemmillä menetelmillä -- jotka olisivat olemassa jos rahaa olisi annettu aiemmin -- olisi näitä virheitä löydetty alunperinkään. Nyt kun ne tunnetaan, epäilemättä moni verifiointitutkimusryhmä virittää työkalunsa niin, että he voivat jälkiviisaasti todeta että olisivat pystyneet havaitsemaan nämä virheet. Ja kuka tietää, ehkä tämän virittelyn myötä keksitään jotain uusia kikkoja tai jopa laajempia teoreettisia näkökohtia tai abstraktioita joilla voidaan jatkossa estää vastaavien virheiden synty jo suunnitteluvaiheessa.

"Happamia, sanoi kettu", voisi joku sanoa. En ole kuitenkaan mitenkään katkera. Ihmisen kyky huomata virheitä on aina vähän jäljessä ihmisen kykyä tehdä niitä. Näin se vain on. Virheistä oppii, ja ehkä tästä opitaan jotain. Ehkä. Minä olen tosin jo pikku hiljaa siirtynyt toisiin aiheisiin.

2 kommenttia:

Catilina kirjoitti...

Haistanko hivenen kaupallisuutta?

"We show that the KAISER defense
mechanism for KASLR [8] has the important (but inadvertent)
side effect of impeding Meltdown. We stress
that KAISER must be deployed immediately to prevent
large-scale exploitation"

Taivas putoaa niskaanne, mutta meillä on pelastus:

, Meltdown
allows an adversary who can run code on the vulnerable
processor to obtain a dump of the entire kernel
address space, including any mapped physical memory"


https://www.facebook.com/Kaiser-Defense-Security-Technology-1852405498320094/

Ari kirjoitti...

Eikö kaikki prosessorit ole formaalisi verifioitu? Kyllä siellä ainakin enemmän verifointia pitäisi olla kuin softapuolella. En ole perehtynyt digitaalilogiikkaan tarpeeksi.

Sattumalta luin muuten ADA sparkista ja seL4:sta (sekä esim. Integritysta) joka on formaalisti verifoitu käyttöjärjestelmä. Käytännössä kuitenkin ongelma on juuri että rautapuoli voi käyttäytyä miten sattuu.

Mitä aihetta sinä tutkit? Luulin että olit sovelletun matematiikan tutkija? En tiennytkään että sinun tutkimuksesi liittyy tämmöiseen.