Dalam beberapa tahun terakhir, sejumlah besar laporan tentang semua jenis kerentanan di prosesor Intel mulai muncul . Yang paling terkenal di antaranya adalah Spectre and Meltdown , berdasarkan kesalahan dalam implementasi eksekusi perintah spekulatif. Pada Juni 2020, sebuah pesan muncul tentang kerentanan baru yang disebut Crosstalk .
Berbeda dengan kerentanan yang disebutkan di atas, Crosstalk adalah kerentanan transfer data dari satu inti ke inti lainnya. Jadi, pelindung kerentanan yang dirancang untuk mengatasi kebocoran eksekusi spekulatif di dalam kernel tidak dapat melindungi dari Crosstalk. Untuk memahami esensi dari jenis kebocoran data ini, Anda perlu mengetahui apa itu eksekusi instruksi spekulatif, bagaimana pipeline prosesor bekerja, dan bagaimana data ditransfer antar inti. Marilah kita menyentuh secara singkat masing-masing topik ini.
Komputasi spekulatif
Eksekusi spekulatif dari instruksi oleh prosesor adalah salah satu metode perangkat keras untuk mendeteksi paralelisme pada level instruksi. Perhitungan dilakukan secara bersamaan untuk beberapa jalur eksekusi program. Contoh paling sederhana adalah evaluasi spekulatif dari dua cabang di cabang bersyarat.
Konveyor
, , . , . , , . 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. , , , .