Meltdown/Spettro

Panoramica

Il 3 gennaio Project Zero ha rivelato le vulnerabilità nelle CPU moderne che un processo può utilizzare per leggere (nella peggiore delle ipotesi) la memoria arbitraria, inclusa la memoria che non appartiene a quel processo. Queste vulnerabilità sono state denominate Spectre e Meltdown. Che cosa sta facendo Chrome per contribuire a garantire la sicurezza del web e cosa dovrebbero fare gli sviluppatori web per i loro siti?

TL; RE

In qualità di utente che naviga sul web, assicurati di mantenere aggiornati il sistema operativo e il browser. Inoltre, gli utenti di Chrome possono prendere in considerazione l'attivazione dell'isolamento dei siti.

Se sei uno sviluppatore web, il team di Chrome ti consiglia:

  • Se possibile, impedisci ai cookie di inserire la memoria del processo di rendering utilizzando gli attributi dei cookie SameSite e HTTPOnly ed evitando di leggere da document.cookie.
  • Assicurati che i tipi MIME siano corretti e specifica un'intestazione X-Content-Type-Options: nosniff per tutti gli URL con contenuti specifici o sensibili dell'utente, in modo da ottenere il massimo dal blocco della lettura su più origini per gli utenti che hanno attivato l'isolamento dei siti.
  • Attiva l'isolamento dei siti e informa il team di Chrome se causa problemi al tuo sito.

Se ti stai chiedendo perché questi passaggi sono utili, continua a leggere.

Il rischio

Sono state fornite molte spiegazioni di queste vulnerabilità, quindi non ne aggiungerò un'altra. Se ti interessa come sfruttare queste vulnerabilità, ti consiglio di dare un'occhiata al post del blog dei miei colleghi del team di Google Cloud.

Sia Meltdown che Spectre consentono potenzialmente a un processo di leggere la memoria che non dovrebbe essere in grado di leggere. A volte, più documenti provenienti da siti diversi possono condividere un processo in Chrome. Questo può accadere quando una delle due ha aperto l'altra utilizzando window.open, <a href="..." target="_blank"> o iframe. Se un sito web contiene dati specifici dell'utente, è possibile che un altro sito utilizzi queste nuove vulnerabilità per leggere questi dati.

Mitigazioni

Il team di tecnici di Chrome e V8 stanno eseguendo il deployment di diversi sforzi per mitigare questa minaccia.

Isolamento dei siti

L'impatto dello sfruttamento corretto di Spectre può essere ridotto notevolmente impedendo che i dati sensibili condividano un processo con codice controllato da un malintenzionato. Il team di Chrome sta lavorando a una funzionalità per raggiungere questo obiettivo chiamata "isolamento dei siti":

L'isolamento dei siti non è ancora stato attivato per impostazione predefinita poiché esistono un paio di problemi noti e il team di Chrome vorrebbe che vengano effettuati più test sul campo possibile. Se sei uno sviluppatore web, dovresti attivare l'isolamento dei siti e verificare se il tuo sito funziona. Se vuoi attivare ora l'opzione, abilita chrome://flags#enable-site-per-process. Se trovi un sito che non funziona, aiutaci segnalando un bug e indicando che l'isolamento dei siti è attivato.

Blocco di documenti su più siti

Anche quando tutte le pagine cross-site vengono inserite in processi separati, le pagine possono comunque richiedere legittimamente alcune sottorisorse tra siti, come immagini e JavaScript. Per evitare la fuga di informazioni sensibili, l'isolamento dei siti include una funzionalità di "blocco di documenti tra siti" che limita le risposte di rete inviate al processo del renderer.

Un sito web può richiedere a un server due tipi di dati: "documenti" e "risorse". Qui i documenti sono file HTML, XML, JSON e testo. Un sito web è in grado di ricevere documenti dal proprio dominio o da altri domini con intestazioni CORS permissive. Le risorse includono immagini, JavaScript, CSS e caratteri. Le risorse possono essere incluse da qualsiasi sito.

Il criterio di blocco dei documenti tra siti impedisce a un processo di ricevere "documenti" da altre origini se:

  1. Hanno un tipo HTML, XML, JSON o testo/MIME normale e
  2. Hanno un'intestazione della risposta HTTP X-Content-Type-Options: nosniff o una rapida analisi dei contenuti ("sniffing") che conferma che il tipo è corretto
  3. CORS non consente esplicitamente l'accesso al documento

I documenti bloccati da questo criterio vengono presentati al processo come vuoti, anche se la richiesta avviene ancora in background.

Ad esempio, supponiamo che un utente malintenzionato crei un tag <img> che include un file JSON con dati sensibili, come <img src="https://yourbank.com/balance.json">. Senza l'isolamento dei siti, i contenuti del file JSON vengono inseriti nella memoria del processo di rendering, dopodiché il renderer nota che non si tratta di un formato dell'immagine valido e non esegue il rendering di un'immagine. Con Spectre, invece, ora esiste un modo per leggere potenzialmente quel blocco di memoria. Il blocco dei documenti tra siti impedisce ai contenuti di questo file di inserire mai nella memoria del processo in cui è in esecuzione il renderer, poiché il tipo MIME è bloccato dal blocco dei documenti su più siti.

In base alle metriche utente, esistono molti file JavaScript e CSS che vengono pubblicati con i tipi MIME text/html o text/plain. Per evitare di bloccare le risorse che vengono contrassegnate accidentalmente come documenti, Chrome tenta di sniffare la risposta per assicurarsi che il tipo MIME sia corretto. Questo sniffing è imperfetto, quindi se hai la certezza di impostare le intestazioni Content-Type corrette sul tuo sito web, il team di Chrome ti consiglia di aggiungere l'intestazione X-Content-Type-Options: nosniff a tutte le risposte.

Se vuoi provare il blocco dei documenti tra siti, attiva l'isolamento dei siti come descritto sopra.

SameSite cookie

Torniamo all'esempio precedente: <img src="https://yourbank.com/balance.json">. Questo funziona solo se tuabanca.it ha memorizzato un cookie che consente all'utente di accedere automaticamente. In genere i cookie vengono inviati per tutte le richieste al sito web che lo imposta, anche se la richiesta viene effettuata da una terza parte utilizzando un tag <img>. I cookie SameSite sono un nuovo attributo che specifica che un cookie deve essere associato solo a una richiesta che ha origine dallo stesso sito, da cui deriva il nome. Purtroppo, al momento della stesura di questo attributo, solo Chrome e Firefox 58 e versioni successive supportano questo attributo.

HTTPOnly e document.cookie

Se i cookie del tuo sito vengono utilizzati solo lato server e non tramite JavaScript del client, esistono modi per interrompere l'inserimento dei dati dei cookie nel processo del renderer. Puoi impostare l'attributo dei cookie HTTPOnly, che impedisce esplicitamente l'accesso al cookie tramite lo script lato client nei browser supportati, come Chrome. Se non è possibile impostare HTTPOnly, puoi limitare l'esposizione del caricamento dei dati dei cookie nel processo di rendering evitando di leggere document.cookie, a meno che non sia assolutamente necessario.

Quando esegui il collegamento a un'altra pagina utilizzando target="_blank", la pagina aperta ha accesso all'oggetto window, può accedere alla pagina a un URL diverso e senza l'isolamento dei siti seguirà lo stesso processo della pagina. Per proteggere meglio la tua pagina, i link a pagine esterne che si aprono in una nuova finestra devono sempre specificare rel="noopener".

Timer ad alta risoluzione

Per sfruttare Meltdown o Spectre, un utente malintenzionato deve misurare il tempo necessario per leggere un certo valore dalla memoria. A questo scopo, è necessario un timer affidabile e preciso.

Un'API offerta dalla piattaforma web è performance.now(), con una precisione di 5 microsecondi. Come mitigazione, tutti i principali browser hanno ridotto la risoluzione di performance.now() per rendere più difficile l'implementazione degli attacchi.

Un altro modo per ottenere un timer ad alta risoluzione è utilizzare un SharedArrayBuffer. Il buffer è utilizzato da un worker dedicato per incrementare un contatore. Il thread principale legge questo contatore e lo utilizza come timer. Per il momento i browser hanno deciso di disattivare SharedArraybu fino a quando non saranno implementate altre mitigazioni.

V8

Per sfruttare Spectre, è necessaria una sequenza appositamente creata di istruzioni CPU. Il team V8 ha implementato le mitigazioni per i proof of concept degli attacchi noti e sta lavorando alle modifiche in TurboFan, il compilatore di ottimizzazione, che rendono sicuro il codice generato anche quando vengono attivati questi attacchi. Tuttavia, queste modifiche alla generazione del codice possono comportare una penalità delle prestazioni.

Proteggiamo il web

C'è stata molta incertezza sulla scoperta di Spectre e Meltdown e sulle loro implicazioni. Spero che questo articolo abbia fatto luce su cosa stanno facendo i team di Chrome e V8 per mantenere sicura la piattaforma web e su come gli sviluppatori web possono essere d'aiuto utilizzando le funzionalità di sicurezza esistenti. Per qualsiasi domanda, non esitare a contattarmi su Twitter.