Nos últimos anos, um grande número de relatórios de todos os tipos de vulnerabilidades em processadores Intel começaram a aparecer . Os mais famosos deles são Specter e Meltdown , que se baseiam em erros na implementação de execução de comandos especulativos. Em junho de 2020, uma mensagem sobre uma nova vulnerabilidade chamada Crosstalk apareceu .
Ao contrário das vulnerabilidades mencionadas acima, o Crosstalk é uma vulnerabilidade de transferência de dados de um núcleo para outro. Portanto, os protetores de vulnerabilidade projetados para superar vazamentos de execução especulativa dentro do kernel não podem proteger contra Crosstalk. Para entender a essência desse tipo de vazamento de dados, você precisa saber o que é execução de instrução especulativa, como funciona o pipeline do processador e como os dados são transferidos entre os núcleos. Vamos abordar brevemente cada um desses tópicos.
Computação especulativa
A execução especulativa de instruções pelo processador é um dos métodos de hardware para detectar paralelismo no nível de instrução. Os cálculos são realizados simultaneamente para vários caminhos de execução do programa. O exemplo mais simples é a avaliação especulativa de dois ramos em um ramo 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.