[Golem] Technical deep dive Meltdown + Spectre [was: Re: Calendario giugno 2018]

Dario Faggioli raistlin@linux.it
Ven 15 Giu 2018 11:58:58 CEST


On Fri, 2018-06-15 at 09:23 +0200, Dario Faggioli wrote:
> On Thu, 2018-06-14 at 11:43 +0200, Dario Faggioli wrote:
> >
> Ed ecco i link.
> 
> [...]
>
> * Spiegazioni con esempi:
>   https://www.raspberrypi.org/blog/why-raspberry-pi-isnt-vulnerable-t
> o-spectre-or-meltdown/
>   https://medium.com/@mattklein123/meltdown-spectre-explained-6bc8634
> cc0c2
> 
L'ultima cosa, e poi mi taccio, a proposito delle domande che erano
sorte circa Spectre-v1 (Bounds check bypass), ovvero relativamente a
questo pezzetto di codice di esempio, preso dall'ultimo link qua sopra:

if (x < array1_size) {
  y = array2[array1[x] * 256];
}

L'ho riguardato. Da quello che capisco io, il punto e` leggere quello
che c'e` in array1 e lo si fa, similmente all'esempio su Meltdown,
andando a vedere quale degli elementi di array2 e` stato portato in
cache (misurando quanto ci vuole a leggerli).

Ora, una delle domande era, visto che Spectre funziona all'interno
dello spazio di indirizzamento di un processo, perche` non leggo
direttamente?

Bene. Intanto, Spectre permette di leggere pezzi arbitrari della
memoria che un processo puo` accedere, ovvero che e` mappata nella
memoria virtuale del processo attraverso le sue tabelle delle pagine.
Senza la Kernel Page Table Isolation --ovvero la misura software che
mitiga Meltdown-- la memoria del kernel (che a sua volta, di solito,
mappa tutta la memoria fisica del sistema) _e`_ presente nello spazio
di indirizzamento virtuale del processo. Quindi, analizzando le
vulnerabilita` singolarmente, ovvero guardando Spectre-v1, assumendo di
_non_ aver applicato/abilitato la patch che implementa KPTI per
mitigare Meltdown, vien fuori che, per una sorta di proprieta`
transitiva, anche con Spectre si puo` leggere la memoria kernel o in
generale (almeno potenzialmente) tutta la memoria del sistema.

Ad ogni modo, assumiamo di aver "risolto" Meltdown. Il processo puo`
accedere solo ai suoi propri dati, perche` non accederci direttamente,
e passare da Spectre? Bene, confermo quello che piu` o meno dicevamo
anche l'altra sera, ovvero che sfruttare il bug puo` essere utile per
recuperare dati e informazioni che, per quanto gia` "di proprieta`" del
processo, potrebbero non essere accessibili e/o disponibili da
specifiche parti di esso. Ovvero, ad esempio, i browser tipicamente
eseguono il codice javascript o java all'interno di "sandbox" piu` o
meno restrittive (a seconda del browser, della configurazione, ecc). 

Ergo, uno script javascript o un add java non ha, in condizioni
normali, accesso a tutta la memoria del "processo browser". Per questo
sfruttare Spectre da uno di questi contesti, e` stato considerato il
caso d'uso piu` appetibile per i malintenzionati.

Inoltre, ricordiamo che non e` detto che l'attacker _possa_ eseguire
codice --ad esempio una variante dello spezzone di cui sopra--
all'interno del(lo spazio di indirizzamento del) processo. Questo
Spectre e Meltdown non lo permettono. Lo puo` fare se riesce, per
esempio, a sfruttare una ulteriore vulnerabilita` che gli permette di
fare (arbitrary) code injection. Ma se cosi` non e`, non puo`
semplicemente assegnare ad un puntatore/variabile l'indirizzo di
memoria al quale vuole accedere, e deve fare affidamento "solo" sul
provare a sfruttare in modo malevolo (appunto ingannando i vari branch
predictor) il codice esistente... un po' come per Spectre-v2, che si
basa sui gadgets. Di fatto, il discorso dei vari java e javascript e`
interessante proprio per questo, ossia perche` essi permettono (piu` o
meno, ed in maniera controllata) di eseguire codice all'interno di un
processo.

Il che ci riporta al motivo per cui "rubare le password memorizzate nel
browser" e` il caso d'uso indicato come il piu` tipico per Spectre.
Tuttavia, se non si vuole pensare per forza solo ai browser, si pensi
alle tecnologie di isolamento e pseudo-virtualizzazione tipo
containers, ovvero che quelle che non fanno affidamento sul supporto
hardware alla virtualizzazione che, di fatto, isola gli spazi di
indirizzamento.

Spero di aver chiarito (e non reso ancora piu` oscuro!) un punto che
l'altra sera era rimasto un po' appeso. :-D

Ciao di nuovo,
Dario
-- 
<<This happens because I choose it to happen!>> (Raistlin Majere)
-----------------------------------------------------------------
Dario Faggioli, Ph.D, http://about.me/dario.faggioli
Software Engineer @ SUSE https://www.suse.com/
-------------- parte successiva --------------
Un allegato non testuale รจ stato rimosso....
Nome:        signature.asc
Tipo:        application/pgp-signature
Dimensione:  833 bytes
Descrizione: This is a digitally signed message part
URL:         <http://lists.linux.it/pipermail/golem/attachments/20180615/8d91cf29/attachment.sig>


Maggiori informazioni sulla lista golem