Riduzione della risoluzione dei timer come mitigazione contro Meltdown e Spectre

3

Ho letto che l'attuale mitigazione di Firefox contro Meltdown and Spectre (da 57.x) consiste di quanto segue:

  • The resolution of performance.now() will be reduced to 20µs.
  • The SharedArrayBuffer feature is being disabled by default.

È corretto presumere che ridurre sostanzialmente la quantità di informazioni ottenibili dai tempi (come la riduzione della risoluzione a 20μs è questo caso) è un modo molto efficace per affrontare il problema nel caso dei runtime JavaScript, ma quello introdurre molti (troppi) effetti collaterali indesiderati quando si applica qualcosa come questo "martello" al kernel di Linux (da qui la necessità aggiuntiva di KPTI , ecc.)?

    
posta Drux 09.01.2018 - 08:44
fonte

1 risposta

3

Il motivo per cui è applicato solo ai browser è perché non c'è modo di eliminare completamente le informazioni di temporizzazione ad alta risoluzione dal codice eseguito in modo nativo. Ad esempio, l'istruzione RDTSC fornisce informazioni precise sulla temporizzazione della risoluzione a nanosecondi a qualsiasi processo. Mentre è possibile disabilitare questa istruzione rendendola eseguibile solo tramite codice privilegiato (impostando il CR4.TSD bit), gran parte di userland si affida a questo. Tuttavia, anche se lo si è disabilitato con successo senza interruzioni, un timer di risoluzione simile potrebbe essere jerry-rig attraverso l'incremento di una variabile in un loop veloce. Il codice spazio utente sempre ha informazioni di temporizzazione precise al nanosecondo. Tale timer potrebbe essere implementato facilmente:

register volatile unsigned long counter;

void counter_thread(void)
{
    while (1) counter++;
}

La funzione counter_thread() verrebbe eseguita nel proprio thread e in un altro thread, il valore di counter potrebbe essere campionato in un tempo arbitrario. Poiché la velocità del contatore incrementato sarebbe molto alta e abbastanza costante, fornirebbe un timer ad alta risoluzione simile a RDTSC .

Di conseguenza, non c'è modo di nascondere informazioni di temporizzazione precise da qualsiasi processo eseguito direttamente sulla CPU. È possibile solo in JavaScript perché è un linguaggio gestito e di alto livello che non ha accesso alle istruzioni della CPU e il tempo deve passare attraverso API dedicate come performance.now() , che può essere regolata con la sua granularità modificando il motore JavaScript .

    
risposta data 09.01.2018 - 09:07
fonte

Leggi altre domande sui tag