I det här blogginlägget ska vi titta på hur tekniker som introducerats för att förbättra CPU-prestanda skapade säkerhetsbrister som Meltdown och Spectre.
Om du är intresserad av IT-nyheter kanske du minns säkerhetsproblemen som kallas ”Meltdown” och ”Spectre” som inträffade för ett tag sedan. Dessa två buggar är kraftfulla sårbarheter som gör att information kan stjälas utan att någon vet om det, oavsett typ av mål. Traditionella attackverktyg som virus och skadlig kod upptäcks lätt av antivirusprogram eftersom de lämnar spår av sina attacker. Meltdown och Spectre kan dock komma åt kärnan i datorprogram utan att lämna några spår. Detta beror på principerna bakom Meltdown och Spectre. I den här artikeln kommer vi att förklara hur moderna datorer fungerar och principerna bakom Meltdown-buggen som utnyttjar detta.
Låt oss först titta på hur datorer fungerar. Datorer kan i stort sett delas in i processorer för beräkningar och RAM för inspelning. CPU står för Central Processing Unit, som ansvarar för den övergripande uppgiften att beräkna och bearbeta data enligt instruktioner. RAM står för Random Access Memory, som lagrar en serie kommandon som processorn måste utföra och mellanliggande resultat av beräkningar. Dessa beräkningar inkluderar programinformation, allt från små saker som en spelares hälsa i ett spel som spelas för närvarande till stora saker som information om operativsystemet och kärnan som är centrala för datorns drift.
När RAM används registrerar processorn data via adresser. Datorer kan inte fritt registrera siffror och bokstäver som vi gör på en bärbar dator. Alla poster görs i byte, som är en sekvens av åtta 0:or och 1:or. När de konverteras till decimaltal kan endast tal från 0 till 255 lagras i RAM. När tecken registreras konverteras varje tecken till ett motsvarande nummer och lagras. Till exempel konverteras teckensträngen "apple" till 97, 112, 112, 108 och 101 och lagras i RAM i ordning.
RAM var revolutionerande vad gäller hastighet när det först utvecklades, men allt eftersom datorer utvecklades blev snabbare minne än RAM nödvändigt. Ett typiskt exempel är cache. Cache har en liknande funktion som RAM, men är ett minnesutrymme som finns på en separat plats. Cache är i grunden inbyggt i processorn och är mycket snabbare än RAM, men har en mindre kapacitet. Processorn förbättrar bearbetningshastigheten avsevärt genom att lagra beräkningsresultat som sannolikt kommer att användas ofta vid bearbetning av instruktioner i cachen istället för RAM.
Samtidigt, i takt med att datorernas prestanda förbättrades, ökade även den bearbetningshastighet som krävdes av programmen, och processorn kunde inte längre uppfylla kraven från program som använde den klassiska sekventiella bearbetningsmetoden. Den hade nått sina fysiska gränser. Därför introducerade processortillverkare runt 2000-talet en ny funktion som kallas out-of-order execution (felaktig ordning). Kommandon lagras sekventiellt i RAM-minnet, men processorn kör de kommandon som kommer först och lagrar resultaten. När andra kommandon behövs senare hämtar processorn snabbt beräkningsresultaten som lagrats i cachen, vilket förbättrar den totala bearbetningshastigheten.
I så fall, om ett kommando som körts i förväg senare visar sig vara ogiltigt, hur reagerar då processorn? Om till exempel lösenordsdata för ett administratörskonto som lagras i RAM begärs, måste processorn sluta köra detta kommando. Vid icke-sekventiell körning körs dock kommandot utan att dess giltighet kontrolleras, och resultatdata lagras i cachen. Om programmet begär dessa resultatdata på normalt sätt, även om kommandot har körts i förväg, avvisas begäran, men i denna struktur uppstår ett fel, och Meltdown utnyttjar denna svaghet.
Nu ska vi titta på strukturen hos ett Meltdown-attackprogram. Det enda du behöver är ett stoppur för att mäta tiden det tar att läsa data. Först, rensa cachen genom att beräkna dess kapacitet. Detta görs för att initiera data i cachen och eliminera eventuella sammanträffanden. Hämta sedan data från en specifik adress i RAM-minnet som innehåller de viktiga data du vill veta (låt oss kalla dessa data α) och lagra slumpmässiga data i samma utrymme som 1000+α-adressen i minnet. Detta kommando avvisas eftersom det försöker hämta data från en skyddad adress (som måste skyddas eftersom den innehåller operativsysteminformation), men på grund av icke-sekventiell bearbetning körs det innan det avvisas, och data på adress 1000+α lagras i cachen.
Angriparen läser sedan igenom minnet och mäter tiden det tar att läsa data på varje adress. Generellt sett är åtkomsthastigheten konstant, men vissa adresser visar sig läsa data med en hastighet som är betydligt snabbare än andra. Det här är de 1000+α-adresser som just har beräknats och lagrats. När adresserna som lagrats i cachen har identifierats kan värdet på 1000+α bestämmas och värdet på α, dvs. viktig systeminformation, kan hittas. Genom att upprepa denna process är det möjligt att extrahera all information som är viktig för datorsäkerhet, inklusive lösenordet för administratörskontot.
Anledningen till att Meltdown är så skrämmande är att tekniken för icke-sekventiell exekvering är en teknik som tillämpas på alla Intel-processorer, och även om det inte är Intel, så används den även av Qualcomm och Samsung, som huvudsakligen producerar processorer för mobila enheter. Med andra ord är nästan alla elektroniska enheter på jorden utsatta för detta hot. Intels konkurrent AMD är inte utsatt för Meltdown eftersom den först kontrollerar kommandon när den utför exekvering i fel ordning, men den är utsatt för Spectre, en svårare bugg att hantera som attackerar sårbarheter i spekulativ exekvering, vilket inte är exekvering i fel ordning. Som ett resultat är alla processorer utsatta för Spectre-Meltdown-buggen.
Många operativsystem, inklusive Windows, har släppt nödpatchar för att åtgärda dessa buggar, men eftersom attackerna inte lämnar några spår är det omöjligt att veta om en dator attackerades innan patchen installerades. Dessutom, även efter att patchen installerats, vilket inte var en grundläggande lösning utan bara ett sätt att blockera icke-sekventiell exekvering, minskade datorns bearbetningshastigheter avsevärt. Eftersom detta är ett problem med processordesignen är den enda lösningen att byta ut hårdvaran.
Hittills har vi förklarat hur moderna datorer fungerar och hur Meltdown utnyttjar detta. CPU:n, som ansvarar för beräkningar i datorer, har en icke-sekventiell exekveringsfunktion som exekverar kommandon i förväg, lagrar dem och hämtar dem vid behov, vilket dramatiskt förbättrar bearbetningshastigheten. Sårbarheter som uppstår från denna process har dock lett till allvarliga säkerhetsbrister. Det finns också en bugg som heter Spectre, men eftersom förklaringen av Spectre kräver ytterligare förklaring av spekulativ exekvering och attacktekniker, kommer vi inte att förklara den här. Spectre är dock också ett fall där en teknik som introducerats för att förbättra CPU-prestanda orsakade problem. Vi hoppas att detta kommer att tjäna som ett prejudikat för att djupt tänka på prestandaförbättringar inom andra områden än datorer och se över om vi missar något viktigt.