In den letzten Jahren wurde eine große Anzahl von Berichten über alle Arten von Sicherheitslücken in Intel-Prozessoren veröffentlicht . Die bekanntesten von ihnen sind Spectre und Meltdown , basierend auf Fehlern bei der Implementierung der spekulativen Befehlsausführung. Im Juni 2020 erschien eine Meldung über eine neue Sicherheitsanfälligkeit namens Crosstalk .
Im Gegensatz zu den oben genannten Sicherheitsanfälligkeiten ist Crosstalk eine Sicherheitsanfälligkeit bezüglich der Datenübertragung von einem Kern zum anderen. Daher können Schwachstellenschutzprogramme, die zur Überwindung spekulativer Ausführungslecks im Kernel entwickelt wurden, nicht vor Übersprechen schützen. Um die Essenz dieser Art von Datenleck zu verstehen, müssen Sie wissen, was spekulative Befehlsausführung ist, wie die Prozessorpipeline funktioniert und wie Daten zwischen Kernen übertragen werden. Lassen Sie uns kurz auf jedes dieser Themen eingehen.
Spekulatives Rechnen
Die spekulative Ausführung von Befehlen durch den Prozessor ist eine der Hardwaremethoden zum Erkennen von Parallelität auf Befehlsebene. Berechnungen werden gleichzeitig für mehrere Wege der Programmausführung durchgeführt. Das einfachste Beispiel ist die spekulative Bewertung von zwei Zweigen in einem bedingten Zweig.
Förderer
, , . , . , , . 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. , , , .