Ces dernières années, un grand nombre de rapports sur toutes sortes de vulnérabilités dans les processeurs Intel ont commencé à apparaître . Les plus célèbres d'entre eux sont Spectre et Meltdown , qui sont basés sur des erreurs dans la mise en œuvre de l'exécution de commandes spéculatives. En juin 2020, un message est apparu concernant une nouvelle vulnérabilité appelée Crosstalk .
Contrairement aux vulnérabilités mentionnées ci-dessus, Crosstalk est une vulnérabilité de transfert de données d'un cœur à un autre. Ainsi, les protecteurs de vulnérabilité conçus pour surmonter les fuites d'exécution spéculatives au sein du noyau ne peuvent pas protéger contre la diaphonie. Pour comprendre l'essence de ce type de fuite de données, il est nécessaire de savoir en quoi consiste l'exécution spéculative des instructions, comment fonctionne le pipeline du processeur et comment les données sont transférées entre les cœurs. Abordons brièvement chacun de ces sujets.
Calcul spéculatif
L'exécution spéculative des instructions par le processeur est l'une des méthodes matérielles de détection du parallélisme au niveau des instructions. Les calculs sont effectués simultanément pour plusieurs chemins d'exécution du programme. L'exemple le plus simple est l'évaluation spéculative de deux branches dans une branche conditionnelle.
Convoyeur
, , . , . , , . 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. , , , .