Spook.js, een eng verhaal voor het slapengaan

Hoe Spook.js, de eerste praktische Spectre-gebaseerde aanval, in zijn werkt gaat.

Ter vergelijking, een phishing-aanval is logisch: u klikt op een link, belandt op een schadelijke pagina, voert wat gegevens in, en de aanvaller steelt deze. Maar kijk dan eens hiernaar: U klikt op een link en de aanvaller steelt uw gegevens. Dat klopt, vandaag hebben we het over schadelijke pagina’s die misbruik maken van een fundamentele CPU-functie om gegevens te stelen zonder dat een slachtoffer iets hoeft in te voeren. En de kwetsbaarheid die we hier bespreken is erg moeilijk, zo niet onmogelijk, op te lossen.

In 2018 bewezen onderzoekers dat het scenario theoretisch mogelijk was, door de eerste twee varianten van de Spectre-kwetsbaarheid te onthullen. Drie jaar later, in september 2021, vond de eerste echte aanval plaats met Spectre v1. Het aanvalsconcept, bekend onder de naam Spook.js, is ingewikkeld, maar we zullen proberen het te ontleden.

Spectre v1-achtergrond

Nieuws over de eerste twee aanvallen uit deze familie — Spectre en Meltdown — was er voor het eerst in 2018. De aanvallen maakten gebruik van het branch prediction-mechanisme (een mechanisme voor de voorspelling van vertakkingen), dat ontworpen is om de uitvoering van commando’s te versnellen en dat in alle moderne CPU’s aanwezig is.

Logo Spectre-kwetsbaarheid

Wanneer een gebruiker een wachtwoord invoert om in te loggen op een website, wordt, indien het wachtwoord correct is, één reeks instructies uitgevoerd. Zo niet, wordt er een andere reeks uitgevoerd. Maar — en hier komt de branch prediction om de hoek kijken — voordat de CPU het antwoord heeft ontvangen, begint hij al met het uitvoeren van de reeks instructies die hij het meest waarschijnlijk nodig denkt te hebben.

In ons voorbeeld, als het wachtwoord al honderd keer eerder correct is ingevoerd, zal de CPU aannemen dat het deze keer niet anders zal zijn. Als hij het correct raadt, krijgt de gebruiker een prestatieboost. Zo niet, dan verwijdert de CPU de speculatief uitgevoerde instructies en voert het de andere reeks uit.

Bij een Spectre-kwetsbaarheidsaanval wordt geprobeerd een gegevensgebied te lezen waar het programma geen toegang toe heeft. In de eerste fase van de aanval worden meerdere oproepen gedaan naar datagebieden met open toegang, waarbij het branch prediction-systeem wordt “getraind” om ook de verboden leesoperatie uit te voeren. Met branch prediction voert de CPU de bewerking van tevoren uit, omdat hij gewend is dat het programma vraagt om gegevens te lezen die het ook daadwerkelijk mag lezen. Maar bij controle blijkt dat het programma geen toegang heeft tot de gegevens, zodat de speculatief uitgevoerde berekeningen worden genegeerd. Tot zover gaat alles goed — maar de door de CPU gelezen gegevens worden enige tijd opgeslagen in de cache, het eigen geheugen van de CPU.

Daarna volgt het interessantste gedeelte: Aangezien er geen manier is om de vertrouwelijke gegevens rechtstreeks uit de cache van de CPU te lezen, gebruikt het schadelijke proces een zogenaamde side-channel-aanval om ze te stelen. Dit omvat het meten van de toegangssnelheid tot bepaalde informatie. Als die relatief snel is, betekent dit dat de gegevens zich in de cache bevinden. Als het langer duurt, wordt hij via reguliere RAM geladen. Een vaste reeks leespogingen resulteert in een lek van de geheime informatie.

Het resultaat is een fundamentele fout in de CPU die alleen kan worden verholpen door de branch prediction volledig uit te schakelen, waardoor de prestaties ernstig worden aangetast. Dat gezegd hebbende, Spectre-aanvallen kennen vele beperkingen:

  • De aanvaller moet in staat zijn programmacode uit te voeren op de doelcomputer of het mobiele apparaat;
  • De aanval vereist een specifiek doelprogramma dat zo is gecodeerd dat het de voorwaarden voor een succesvolle aanval creëert;
  • Zelfs indien de aanval slaagt, is de gegevensextractie uiterst traag — tientallen of honderden bytes per seconde — en leesfouten zijn verre van onmogelijk;
  • In het algemeen is er voor het stelen van de bedoelde geheime gegevens, zoals wachtwoorden, encryptiesleutels, enzovoort, een combinatie van voorwaarden vereist.

Spook.js — een echte toepassing van Spectre v1

We zouden kunnen concluderen dat Spectre heus niet zo gevaarlijk is. Immers, als een aanvaller code kan uitvoeren op een doelcomputer, zou het veel eenvoudiger zijn om een van de vele kwetsbaarheden in het besturingssysteem of in geïnstalleerde programma’s uit te buiten om privileges te laten escaleren en zo gegevens te stelen.

Dat klopt inderdaad, maar moderne webpagina’s bevatten ook grote hoeveelheden programmacode die wordt uitgevoerd op de computer van de gebruiker, binnen de browser. Dat is ook hoe Spook.js-aanvallen de Spectre v1-kwetsbaarheid benutten: Er wordt een geïnfecteerde pagina geladen, de browser voert de code uit, en de cybercrimineel steelt vertrouwelijke gegevens.

De schrijvers van het rapport demonstreerden een aantal aanvallen in de praktijk. Eerst hebben ze een gebruikerswachtwoord van Tumblr gestolen. Vervolgens stalen ze gegevens van LastPass. Ten derde onderschepten ze een door een gebruiker geüploade afbeelding van een privé-opslag op een Google-server.

Een functie van de Google Chrome-browser maakte dit allemaal mogelijk. Sinds de bekendmaking van informatie over Spectre hebben de ontwikkelaars van Chrome maatregelen genomen om potentiële aanvallen af te weren door websites te dwingen geïsoleerd te laden. Omdat elke website zijn eigen proces creëert, kan schadelijke code op de ene pagina niet worden gebruikt om gegevens van een andere bron te stelen. Maar er bestaat één uitzondering: meerdere pagina’s van dezelfde site of hetzelfde domein worden samengevoegd in een gemeenschappelijk browserproces. Als de schadelijke code (geschreven in JavaScript, vandaar de .js in de naam van de aanval) wordt uitgevoerd op een van deze pagina’s, kunnen gegevens op andere pagina’s worden gestolen.

Spectre.js-aanval op Tumblr

Als een collectieve blog kan Tumblr in theorie schadelijke code hosten. Op die manier, met een schadelijke pagina geopend in een tabblad, als een gebruiker probeert in te loggen op zijn/haar account op de dienst in een ander tabblad, bewaart de browser deze gegevens en vult hij automatisch de gebruikersnaam en het wachtwoord in, die de schadelijke code op zijn beurt weer kan stelen.

Door misbruik te maken van de Spectre-kwetsbaarheid kan een aanval tangentieel inwerken op een ander tabblad van dezelfde site en op indirecte wijze gegevens stelen. Een succesvolle aanval die op deze aanpak is gebaseerd laat nauwelijks sporen achter.

Specter.js-aanval op LastPass

De aanval op de wachtwoordbeheerder LastPass was anders, in die zin dat de code om gegevens te stelen met Spectre v1 was ingebed in een schadelijke extensie voor Google Chrome. De LastPass-extensie draaide ook in de browser. In sommige gevallen worden de extensies ook uitgevoerd in een gemeenschappelijk browserproces, waardoor gegevensdiefstal mogelijk wordt.

Specter.js-aanval op Google Cloud Storage

Een ander voorbeeld gebruikt aanvallen op Google Cloud Storage: één browsertabblad bevat een schadelijke pagina die wordt gehost op sites.google.com; een ander laat gebruikers afbeeldingen uploaden naar hun privé-opslag in de G Suite-dienst. In dit scenario kan een aanvaller schadelijke code gebruiken om toegang tot de afbeeldingen te krijgen.

Vergelijking van de originele afbeelding met de afbeelding gestolen uit Google Cloud-opslag met behulp van een Spook.js-aanval

Originele afbeelding (links) en de gestolen afbeeldingen van Google Cloud Storage met gebruik van een Spook.js-aanval Source

Beperkingen van de methode

Onderzoekers hebben aangetoond hoe de aanval kan worden uitgevoerd op verschillende CPU’s, waaronder verschillende moderne van Intel en zelfs de nieuwe op ARM gebaseerde Apple M1. In al deze gevallen werd de aanval voltooid in Google Chrome. In principe maken verschillende unieke kenmerken van de browser Spook.js mogelijk. Andere op Chromium gebaseerde browsers, zoals Microsoft Edge, zijn ook kwetsbaar voor deze aanval.

Er is echter sprake van bepaalde beperkingen. Ten eerste is er de lage snelheid van gegevensdiefstal (400-600 bytes per seconde, afhankelijk van de CPU), waardoor het doelbestand in de laatste demo erg klein is. Ten tweede is er het grote aantal fouten bij het stelen van gegevens uit de CPU-cache. Tot 4% van de gegevens is foutief; vandaar de artefacten in de gestolen kopie van het beeld.

De aanval werkt niet op AMD-processors of in Mozilla Firefox, waarvan de JavaScript-engine anders werkt. De onderzoekers sluiten niet uit dat er een succesvolle aanval op AMD-chips en in de Firefox-browser is geweest, maar om dat te verifiëren is meer onderzoek nodig.

Ten slotte vereist een aanval het uploaden van schadelijke code naar een pagina met dezelfde domeinnaam, zoals in het geval van collectieve blogs of hosting. Deze methode toepassen op bijvoorbeeld de website van een bank zal waarschijnlijk niet werken.

Geen reden voor paniek

Het onderzoek naar Spook.js is belangrijk omdat onderzoekers er voor het eerst in geslaagd zijn om met een vrij realistisch scenario op te proppen te komen voor de exploitatie van een van de Spectre-kwetsbaarheden. De kans op een aanval in de echte wereld is echter klein. Ten eerste hebben de ontwikkelaars van Google Chrome, op basis van dit onderzoek, het mechanisme voor het isoleren van geladen sites van elkaar versterkt. Ten tweede hebben cybercriminelen veel eenvoudigere manieren om gebruikersgegevens te stelen, van traditionele malware tot social engineering, en deze methode vereist serieuze kennis van de low-level werking van moderne CPU’s.

Als wetenschappelijk werk zal Spook.js het softwarelandschap veranderen door de invoering van nieuwe aanbevelingen voor de beveiliging van websites (de auteurs stellen bijvoorbeeld voor om autorisatiepagina’s naar een aparte domeinnaam te verplaatsen). In vervolgstudies kunnen manieren worden gevonden om aanvallen iets gemakkelijker te maken, maar waarschijnlijk zullen deze leiden tot meer rondes van beveiligingsverbeteringen. Zelfs als kwetsbaarheden van het Spectre-type massaal kunnen worden uitgebuit, zullen de beschermingsmiddelen dezelfde zijn als voor elke andere malware. Beveiligingsleveranciers zullen de nieuwe soorten aanvallen gewoon toevoegen aan de lijst van aanvallen die moeten worden gecontroleerd en geblokkeerd voordat ze worden uitgevoerd.

Het is ook mogelijk dat onderzoekers op een dag op een kenmerk van Spectre-achtige kwetsbaarheden stuiten dat een ingrijpende herbewerking van het hele moderne IT-ecosysteem noodzakelijk maakt. Maar dat blijft onwaarschijnlijk. Laten we niet vergeten dat het drie jaar heeft geduurd om van een theoretische kwetsbaarheid tot de eerste praktische aanval te komen (en dan nog gaat het om een aanval met vele beperkingen).

Spectre kan ook worden gebruikt voor gerichte aanvallen waarbij de potentiële opbrengsten van de gestolen gegevens groter zijn dan de kosten van de operatie zelf. Zelfs als dat scenario relevant is voor uw organisatie, kunt u aanvallen gemakkelijk bemoeilijken door verschillende browsers te gebruiken voor verschillende inhoud. Open bijvoorbeeld geen pagina’s en webdiensten met gevoelige informatie in dezelfde browser als die u voor uw online amusement gebruikt. In het ideale geval behandelt u vertrouwelijke informatie in een geïsoleerde omgeving, op een virtuele machine of gewoon op een apart apparaat.

Tips