ืชื™ืงื•ืŸ ืœื ืฉืงื•ืœ ื”ื‘ื™ื ืœืชื™ืงื•ืŸ ืœื ืฉืœื ืœืคื’ื™ืขื•ืช Spectre ื‘ืœื™ื‘ืช ืœื™ื ื•ืงืก

ืžืคืชื—ื™ ืคืจื•ื™ืงื˜ Grsecurity ืžืฉื•ืชืฃ ืกื™ืคื•ืจ ืื–ื”ืจื” ื”ืžื“ื’ื™ื ื›ื™ืฆื“ ื‘ื™ื˜ื•ืœ ื—ืกืจ ืžื—ืฉื‘ื” ืฉืœ ืื–ื”ืจื•ืช ืžื”ื“ืจ ื™ื›ื•ืœ ืœื”ื•ื‘ื™ืœ ืœืคืจืฆื•ืช ื‘ืงื•ื“. ื‘ืกื•ืฃ ืžืื™ ื”ื•ืฆืข ืชื™ืงื•ืŸ ืœื’ืจืขื™ืŸ ื”ืœื™ื ื•ืงืก ืœื•ืงื˜ื•ืจ ื—ื“ืฉ ืฉืœ ื ื™ืฆื•ืœ ืฉืœ ืคื’ื™ืขื•ืช Spectre ื‘ืืžืฆืขื•ืช ืงืจื™ืืช ืžืขืจื›ืช ptrace.

ื‘ื–ืžืŸ ื‘ื“ื™ืงืช ื”ืชื™ืงื•ืŸ, ื”ืžืคืชื—ื™ื ืฉืžื• ืœื‘ ืฉื‘ืžื”ืœืš ื”ื‘ื ื™ื™ื”, ื”ืžื”ื“ืจ ืžืฆื™ื’ ืื–ื”ืจื” ืœื’ื‘ื™ ืขืจื‘ื•ื‘ ืงื•ื“ ื•ื”ื’ื“ืจื•ืช (ื”ืžื‘ื ื” ื”ื•ื’ื“ืจ ืœืื—ืจ ื”ืงื•ื“, ืชื•ืš ื”ืงืฆืืช ืขืจืš ืœืžืฉืชื ื” ืงื™ื™ื):

int index = n;
if (n < HBP_NUM) { index = array_index_nospec(index, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

ืœื™ื ื•ืก ืงื™ื‘ืœ ืชื™ืงื•ืŸ ืœืกื ื™ืฃ ื”ืžืืกื˜ืจ ืฉืœืš, ืœืื—ืจ ืฉื ืคื˜ืจื• ืžื”ืื–ื”ืจื” ืขืœ ื™ื“ื™ ื”ืขื‘ืจืช ื”ื’ื“ืจืช ื”ืžืฉืชื ื” ืœื‘ืœื•ืง if:

if (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

ื‘ื™ื•ืœื™, ื”ืชื™ืงื•ืŸ ื”ื•ืขื‘ืจ ื’ื ืœืขื ืคื™ ื”ื’ืจืขื™ืŸ ื”ื™ืฆื™ื‘ื™ื 4.4, 4.9, 4.14, 4.19 ื•-5.2. ื’ื ืžื ื”ืœื™ ืกื ื™ืคื™ ื”ืื•ืจื•ื•ื” ื ืชืงืœื• ื‘ืื–ื”ืจื” ื•ื‘ืžืงื•ื ืœื‘ื“ื•ืง ืื ื”ื™ื ืชื•ืงื ื” ื›ื‘ืจ ื‘ืกื ื™ืฃ ื”ืžืืกื˜ืจ ืฉืœ ืœื™ื ื•ืก, ื”ื ื‘ื™ืฆืขื• ืชื™ืงื•ืŸ ื‘ืขืฆืžื. ื”ื‘ืขื™ื” ื”ื™ื ืฉื‘ืœื™ ืœื—ืฉื•ื‘ ืขืœ ื–ื” ื‘ืืžืช, ื”ื ืคืฉื•ื˜ ื ึดืจื’ึธืฉื ื”ื’ื“ืจืช ื”ืžื‘ื ื” ืœืžืขืœื”, ื›ืš ืฉื”ืงืจื™ืื” ืœ-array_index_nospec, ื”ืžืกืคืงืช ื™ืฉื™ืจื•ืช ื”ื’ื ื” ืžืคื ื™ ื”ืคื’ื™ืขื•ืช, ืื™ื ื” ืžืฉืžืฉืช ืขื•ื“ ื‘ืขืช ื”ื’ื“ืจืช ื”ืžื‘ื ื”, ื•ื‘ืžืงื•ื ื”ืžืฉืชื ื” "index" ืชืžื™ื“ ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืžืฉืชื ื” "n":

int index = n;
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
index = array_index_nospec(index, HBP_NUM);

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”