Patch เบ—เบตเปˆเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบšเปเปˆเบ”เบตเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเปเปˆเบ„เบปเบšเบ–เป‰เบงเบ™เบชเปเบฒเบฅเบฑเบšเบŠเปˆเบญเบ‡เป‚เบซเบงเปˆ Spectre เปƒเบ™ Linux kernel

เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ„เบ‡เบเบฒเบ™ Grsecurity เปเบšเปˆเบ‡เบ›เบฑเบ™ เบ™เบดเบ—เบฒเบ™เบ—เบตเปˆเบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบเบฒเบ™เบเปเบฒเบˆเบฑเบ”เบ„เปเบฒเป€เบ•เบทเบญเบ™ compiler เบ—เบตเปˆเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบ„เบดเบ”เบชเบฒเบกเบฒเบ”เบ™เปเบฒเป„เบ›เบชเบนเปˆเบ„เบงเบฒเบกเบญเปˆเบญเบ™เปเบญเปƒเบ™เบฅเบฐเบซเบฑเบ”. เปƒเบ™เบ—เป‰เบฒเบเป€เบ”เบทเบญเบ™เบžเบถเบ”เบชเบฐเบžเบฒ, เบเบฒเบ™เปเบเป‰เป„เบ‚เป„เบ”เป‰เบ–เบทเบเบชเบฐเป€เบซเบ™เบตเบชเปเบฒเบฅเบฑเบš Linux kernel เบชเปเบฒเบฅเบฑเบš vector เปƒเบซเบกเปˆเบ‚เบญเบ‡เบเบฒเบ™เบ‚เบธเบ”เบ„เบปเป‰เบ™เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆ Spectre เป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™เป‚เบ—เบซเบฒเบฅเบฐเบšเบปเบš ptrace.

เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš patch, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป„เบ”เป‰เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบงเปˆเบฒเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡, compiler เบชเบฐเปเบ”เบ‡เบ„เปเบฒเป€เบ•เบทเบญเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เบฐเบชเบปเบกเบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบ„เปเบฒเบ™เบดเบเบฒเบก (เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เป„เบ”เป‰เบ–เบทเบเบเปเบฒเบ™เบปเบ”เบซเบผเบฑเบ‡เบˆเบฒเบเบฅเบฐเบซเบฑเบ”, เบเปเบฒเบ™เบปเบ”เบ„เปˆเบฒเปƒเบซเป‰เบเบฑเบšเบ•เบปเบงเปเบ›เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง):

int index = n;
เบ–เป‰เบฒ (n < HBP_NUM) { index = array_index_nospec(index, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

Linus เบเบญเบกเบฎเบฑเบš เบเบฒเบ™เปเบเป‰เป„เบ‚ เป€เบ–เบดเบ‡โ€‹เบชเบฒโ€‹เบ‚เบฒโ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹, เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบเปเบฒโ€‹เบˆเบฑเบ”โ€‹เบ‚เบญเบ‡โ€‹ เบˆเบฒเบเบเบฒเบ™เป€เบ•เบทเบญเบ™เป‚เบ”เบเบเบฒเบ™เบเป‰เบฒเบเบ„เปเบฒเบ™เบดเบเบฒเบกเบ•เบปเบงเปเบ›เป„เบ›เป€เบ›เบฑเบ™ if block:

เบ–เป‰เบฒ (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. เบœเบนเป‰เบฎเบฑเบเบชเบฒเบชเบฒเบ‚เบฒเบ—เบตเปˆเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡เบเบฑเบ‡เบžเบปเบšเบเบฑเบšเบ„เปเบฒเป€เบ•เบทเบญเบ™เปเบฅเบฐ, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเปเบเป‰เป„เบ‚เปเบฅเป‰เบงเปƒเบ™เบชเบฒเบ‚เบฒเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡ Linus, เบžเบงเบเป€เบ‚เบปเบฒเป„เบ”เป‰เปเบเป‰เป„เบ‚เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡. เบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบงเปˆเบฒเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบเปเปˆเบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบกเบฑเบ™, เบžเบงเบเป€เบ‚เบปเบฒเบžเบฝเบ‡เปเบ•เปˆ เป‚เบญเบ™ เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เป‚เบ—เบซเบฒ array_index_nospec, เป€เบŠเบดเปˆเบ‡เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบ„เบงเบฒเบกเบญเปˆเบญเบ™เปเบญ, เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบญเบตเบเบ•เปเปˆเป„เบ›เป€เบกเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เปเบฅเบฐเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ› "index" เบ•เบปเบงเปเบ› "n" เปเบกเปˆเบ™เปƒเบŠเป‰เบชเบฐเป€เบซเบกเบต:

int index = n;
เบ–เป‰เบฒ (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
index = array_index_nospec(index, HBP_NUM);

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: opennet.ru

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™