Meltdown/spook

Overzicht

Op 3 januari onthulde Project Zero kwetsbaarheden in moderne CPU's die een proces kan gebruiken om (in het ergste geval) willekeurig geheugen te lezen – inclusief geheugen dat niet bij dat proces hoort. Deze kwetsbaarheden zijn Spectre en Meltdown genoemd. Wat doet Chrome om het web veilig te houden en wat zouden webontwikkelaars moeten doen voor hun eigen sites?

TL; DR

Als gebruiker van het web is het belangrijk om ervoor te zorgen dat uw besturingssysteem en browser up-to-date zijn. Chrome-gebruikers kunnen daarnaast overwegen om site-isolatie in te schakelen.

Als u een webontwikkelaar bent, adviseert het Chrome-team :

  • Voorkom indien mogelijk dat cookies het geheugen van het rendererproces binnendringen door de cookiekenmerken SameSite en HTTPOnly te gebruiken en door het lezen van document.cookie te vermijden.
  • Zorg ervoor dat uw MIME-typen correct zijn en geef een X-Content-Type-Options: nosniff header op voor alle URL's met gebruikerspecifieke of gevoelige inhoud. Zo haalt u het maximale uit Cross-Origin Read Blocking voor gebruikers die Site Isolation hebben ingeschakeld.
  • Schakel site-isolatie in en laat het Chrome-team weten als dit problemen voor uw site veroorzaakt.

Als u zich afvraagt ​​waarom deze stappen helpen, lees dan verder!

Het risico

Er zijn talloze verklaringen voor deze kwetsbaarheden, dus ik ga er niet nog een toevoegen. Als u geïnteresseerd bent in hoe deze kwetsbaarheden kunnen worden uitgebuit, raad ik u aan de blogpost van mijn collega's van het Google Cloud-team te lezen.

Zowel Meltdown als Spectre maken het mogelijk dat een proces geheugen kan lezen dat het eigenlijk niet zou moeten kunnen. Soms delen meerdere documenten van verschillende sites een proces in Chrome. Dit kan gebeuren wanneer de ene site de andere heeft geopend met window.open , <a href="..." target="_blank"> of iframes. Als een website gebruikerspecifieke gegevens bevat, bestaat de kans dat een andere site deze nieuwe kwetsbaarheden gebruikt om die gebruikersgegevens te lezen.

Mitigaties

Het Chrome- en V8-engineeringteam doet er alles aan om deze bedreiging te beperken.

Locatie-isolatie

De impact van succesvolle exploitatie van Spectre kan aanzienlijk worden verminderd door te voorkomen dat gevoelige gegevens ooit een proces delen met door aanvallers beheerde code. Het Chrome-team heeft gewerkt aan een functie genaamd " Site Isolation " om dit te bereiken:

Site-isolatie is nog niet standaard ingeschakeld omdat er een aantal bekende problemen zijn en het Chrome-team graag zoveel mogelijk praktijktests wil uitvoeren. Bent u een webontwikkelaar? Schakel dan site-isolatie in en controleer of uw site nog steeds werkt. Wilt u zich nu aanmelden, schakel dan chrome://flags#enable-site-per-process . Als u een site vindt die niet werkt, help ons dan door een bug te melden en te vermelden dat u site-isolatie heeft ingeschakeld.

Blokkering van cross-site documenten

Zelfs wanneer alle cross-site pagina's in aparte processen worden geplaatst, kunnen pagina's nog steeds legitiem bepaalde cross-site subresources opvragen, zoals afbeeldingen en JavaScript. Om te voorkomen dat gevoelige informatie lekt, bevat Site Isolation een functie voor het blokkeren van cross-site documenten . Deze functie beperkt welke netwerkreacties aan het renderproces worden geleverd.

Een website kan twee soorten gegevens van een server opvragen: 'documenten' en 'resources'. Documenten zijn HTML-, XML-, JSON- en tekstbestanden. Een website kan documenten ontvangen van het eigen domein of van andere domeinen met permissieve CORS-headers. Resources omvatten dingen zoals afbeeldingen, JavaScript, CSS en lettertypen. Resources kunnen van elke site worden opgenomen.

Het beleid voor het blokkeren van documenten op meerdere sites voorkomt dat een proces 'documenten' van andere bronnen ontvangt als:

  1. Ze hebben een HTML-, XML-, JSON- of text/plain MIME-type en
  2. Ze hebben ofwel een X-Content-Type-Options: nosniff HTTP-responsheader, of een snelle inhoudsanalyse (“ sniffing ”) bevestigt dat het type correct is
  3. CORS staat niet expliciet toegang tot het document toe

Documenten die door dit beleid worden geblokkeerd, worden als leeg aan het proces gepresenteerd. De aanvraag vindt echter nog steeds op de achtergrond plaats.

Stel je bijvoorbeeld voor dat een aanvaller een <img> -tag aanmaakt met een JSON-bestand met gevoelige gegevens, zoals <img src="https://yourbank.com/balance.json"> . Zonder site-isolatie zou de inhoud van het JSON-bestand in het geheugen van het renderproces terechtkomen, waarna de renderer merkt dat het geen geldig afbeeldingsformaat is en geen afbeelding rendert. Met Spectre is er nu echter een manier om dat geheugengedeelte mogelijk te lezen. Cross-site document blocking zou voorkomen dat de inhoud van dit bestand ooit in het geheugen van het proces terechtkomt waarin de renderer draait, omdat het MIME-type wordt geblokkeerd door cross-site document blocking.

Volgens gebruikersstatistieken worden veel JavaScript- en CSS-bestanden geleverd met MIME-typen text/html of text/plain . Om te voorkomen dat bronnen die per ongeluk als document zijn gemarkeerd, worden geblokkeerd, probeert Chrome de respons te scannen om te controleren of het MIME-type correct is. Deze scan is echter niet perfect. Als u er zeker van bent dat u de juiste Content-Type headers op uw website instelt, raadt het Chrome-team u aan om de header X-Content-Type-Options: nosniff aan al uw responsen toe te voegen.

Als u documentblokkering op meerdere sites wilt proberen, kiest u voor Site Isolation zoals hierboven beschreven.

SameSite -cookies

Laten we teruggaan naar het bovenstaande voorbeeld: <img src="https://yourbank.com/balance.json"> . Dit werkt alleen als yourbank.com een ​​cookie heeft opgeslagen die de gebruiker automatisch inlogt. Cookies worden doorgaans verzonden voor alle verzoeken aan de website die de cookie plaatst, zelfs als het verzoek wordt gedaan door een derde partij met behulp van een <img> -tag. SameSite-cookies zijn een nieuw kenmerk dat specificeert dat een cookie alleen mag worden gekoppeld aan een verzoek dat afkomstig is van dezelfde website, vandaar de naam. Helaas ondersteunen op dit moment alleen Chrome en Firefox 58+ dit kenmerk .

HTTPOnly en document.cookie

Als de cookies van uw site alleen aan de serverzijde worden gebruikt en niet door client-JavaScript, zijn er manieren om te voorkomen dat de gegevens van de cookie het renderproces binnenkomen. U kunt het cookiekenmerk HTTPOnly instellen, waarmee expliciet wordt voorkomen dat de cookie wordt geopend via client-side scripts in ondersteunde browsers, zoals Chrome. Als het instellen van HTTPOnly niet mogelijk is, kunt u de blootstelling van het laden van cookiegegevens aan het gerenderde proces beperken door document.cookie alleen te lezen als dit absoluut noodzakelijk is.

Wanneer u met target="_blank" naar een andere pagina linkt, heeft de geopende pagina toegang tot uw window , kan deze uw pagina naar een andere URL navigeren en bevindt deze zich, zonder site-isolatie, in hetzelfde proces als uw pagina. Om uw pagina beter te beschermen, moeten links naar externe pagina's die in een nieuw venster openen altijd rel="noopener" bevatten .

Timers met hoge resolutie

Om Meltdown of Spectre te misbruiken, moet een aanvaller meten hoe lang het duurt om een ​​bepaalde waarde uit het geheugen te lezen. Hiervoor is een betrouwbare en nauwkeurige timer nodig.

Eén API die het webplatform aanbiedt, is performance.now() , die nauwkeurig is tot op 5 microseconden. Om dit te beperken, hebben alle grote browsers de resolutie van performance.now() verlaagd om aanvallen moeilijker te maken.

Een andere manier om een ​​timer met hoge resolutie te verkrijgen, is door een SharedArrayBuffer te gebruiken. De buffer wordt door een speciale werker gebruikt om een ​​teller te verhogen. De hoofdthread leest deze teller en gebruikt deze als timer. Browsers hebben besloten om SharedArrayBuffer voorlopig uit te schakelen totdat andere maatregelen zijn getroffen.

V8

Om Spectre te exploiteren, is een specifiek ontworpen reeks CPU-instructies nodig. Het V8-team heeft maatregelen geïmplementeerd voor bekende proof-of-concept aanvallen en werkt aan wijzigingen in TurboFan, hun optimaliserende compiler, die de gegenereerde code veilig maken, zelfs wanneer deze aanvallen worden geactiveerd. Deze wijzigingen in de codegeneratie kunnen echter wel ten koste gaan van de prestaties.

Het web veilig houden

Er is veel onzekerheid ontstaan ​​rond de ontdekking van Spectre en Meltdown en de gevolgen daarvan. Ik hoop dat dit artikel wat licht werpt op wat de Chrome- en V8-teams doen om het webplatform veilig te houden en hoe webontwikkelaars kunnen helpen door bestaande beveiligingsfuncties te gebruiken. Heeft u vragen? Neem dan gerust contact met me op via Twitter .