في السنوات الأخيرة ، بدأ يظهر عدد كبير من التقارير عن جميع أنواع الثغرات الأمنية في معالجات Intel . أشهرها Specter و Meltdown ، استنادًا إلى أخطاء في تنفيذ تنفيذ الأوامر التخمينية. في يونيو 2020 ، ظهرت رسالة حول ثغرة أمنية جديدة تسمى Crosstalk .
على عكس الثغرات الأمنية المذكورة أعلاه ، فإن Crosstalk هو ثغرة أمنية لنقل البيانات من نواة إلى أخرى. وبالتالي ، فإن أدوات حماية الثغرات الأمنية المصممة للتغلب على تسريبات التنفيذ التخمينية داخل النواة لا يمكنها الحماية من الحديث المتبادل. لفهم جوهر هذا النوع من تسرب البيانات ، يجب أن تعرف ما هو تنفيذ التعليمات التخمينية ، وكيف يعمل خط أنابيب المعالج ، وكيف يتم نقل البيانات بين النوى. دعونا نتطرق بإيجاز إلى كل من هذه الموضوعات.
الحوسبة التخمينية
يعد التنفيذ التخميني للتعليمات من قبل المعالج إحدى طرق الأجهزة للكشف عن التوازي على مستوى التعليمات. يتم إجراء الحسابات في وقت واحد لعدة مسارات لتنفيذ البرنامج. أبسط مثال على ذلك هو التقييم التأملي لفرعين في فرع شرطي.
ناقل
, , . , . , , . 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. , , , .