Reduciendo la resolución de los temporizadores como mitigación contra Meltdown y Specter

3

He leído que la versión actual de Firefox mitigación against Meltdown and Spectre (desde 57.x) consiste en lo siguiente:

  
  • La resolución de performance.now () se reducirá a 20µs.
  •   
  • La función SharedArrayBuffer se está deshabilitando de forma predeterminada.
  •   

¿Es correcto suponer que reducir sustancialmente la cantidad de información que se puede obtener de la sincronización (como reducir la resolución a 20 µs en este caso) es una forma muy efectiva de abordar el problema en el caso de los tiempos de ejecución de JavaScript, pero esa sería una buena idea? introduzca muchos (y demasiados) efectos secundarios no deseados cuando aplique algo como este "martillo" al kernel de Linux (de ahí la necesidad adicional de KPTI , etc.)?

    
pregunta Drux 09.01.2018 - 08:44
fuente

1 respuesta

3

La razón por la que solo se aplica a los navegadores es porque no hay manera de eliminar completamente la información de tiempo de alta resolución del código que se ejecuta de forma nativa. Por ejemplo, la instrucción RDTSC proporciona información precisa sobre el tiempo de resolución en sub-nanosegundos para cualquier proceso. Si bien es posible deshabilitar esta instrucción haciéndola ejecutable solo por un código privilegiado (al establecer el CR4.TSD bit), gran parte del usuario depende de ella. Sin embargo, incluso si lo deshabilitó exitosamente sin romperse, un temporizador de resolución similar podría ser manipulado incrementando una variable en un ciclo rápido. El código de espacio de usuario siempre tendrá información de tiempo de precisión de nanosegundos. Dicho temporizador podría implementarse fácilmente:

register volatile unsigned long counter;

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

La función counter_thread() se ejecutaría en su propio hilo, y en otro hilo, el valor de counter podría muestrearse en un momento arbitrario. Como la tasa de incremento del contador sería muy alta y bastante constante, proporcionaría un temporizador de alta resolución similar a RDTSC .

Como resultado, no hay forma de ocultar información precisa de tiempo de ningún proceso que se ejecute directamente en la CPU. Solo es posible en JavaScript porque es un lenguaje administrado de alto nivel que no tiene acceso directo a las instrucciones de la CPU, y el tiempo debe ir a través de API dedicadas como performance.now() , que puede tener su granularidad ajustada modificando el motor de JavaScript. .

    
respondido por el forest 09.01.2018 - 09:07
fuente

Lea otras preguntas en las etiquetas