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

เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ„เบ‡เบเบฒเบ™ Grsecurity เปเบšเปˆเบ‡เบ›เบฑเบ™ ะฟะพัƒั‡ะธั‚ะตะปัŒะฝะพะน ะธัั‚ะพั€ะธะตะน, ะดะตะผะพะฝัั‚ั€ะธั€ัƒัŽั‰ะตะน ะบะฐะบ ะฝะตะพะฑะดัƒะผะฐะฝะฝะพะต ัƒัั‚ั€ะฐะฝะตะฝะธะต ะฟั€ะตะดัƒะฟั€ะตะถะดะตะฝะธะน ะบะพะผะฟะธะปัั‚ะพั€ะฐ ะผะพะถะตั‚ ะฟั€ะธะฒะตัั‚ะธ ะบ ะฟะพัะฒะปะตะฝะธัŽ ัƒัะทะฒะธะผะพัั‚ะตะน ะฒ ะบะพะดะต. ะ’ ะบะพะฝั†ะต ะผะฐั ะดะปั ัะดั€ะฐ Linux ะฑั‹ะปะพ ะฟั€ะตะดะปะพะถะตะฝะพ ะธัะฟั€ะฐะฒะปะตะฝะธะต ะฝะพะฒะพะณะพ ะฒะตะบั‚ะพั€ะฐ ัะบัะฟะปัƒะฐั‚ะฐั†ะธะธ ัƒัะทะฒะธะผะพัั‚ะธ Spectre ั‡ะตั€ะตะท ัะธัั‚ะตะผะฝั‹ะน ะฒั‹ะทะพะฒ ptrace.

ะ’ ะฟั€ะพั†ะตััะต ั‚ะตัั‚ะธั€ะพะฒะฐะฝะธั ะฟะฐั‚ั‡ะฐ ั€ะฐะทั€ะฐะฑะพั‚ั‡ะธะบะธ ะพะฑั€ะฐั‚ะธะปะธ ะฒะฝะธะผะฐะฝะธะต, ั‡ั‚ะพ ะฟั€ะธ ัะฑะพั€ะบะต ะบะพะผะฟะธะปัั‚ะพั€ ะฒั‹ะฒะพะดะธั‚ ะฟั€ะตะดัƒะฟั€ะตะถะดะตะฝะธะต ะพ ัะผะตัˆะธะฒะฐะฝะธะธ ะบะพะดะฐ ะธ ะพะฟั€ะตะดะตะปะตะฝะธะน (ัั‚ั€ัƒะบั‚ัƒั€ะฐ ะฑั‹ะปะฐ ะพะฟั€ะตะดะตะปะตะฝะฐ ะฟะพัะปะต ะบะพะดะฐ ั ะฟั€ะธัะฒะพะตะฝะธะตะผ ะทะฝะฐั‡ะตะฝะธั ััƒั‰ะตัั‚ะฒัƒัŽั‰ะตะน ะฟะตั€ะตะผะตะฝะฝะพะน):

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

ะ›ะธะฝัƒั ะฟั€ะธะฝัะป เบเบฒเบ™เปเบเป‰เป„เบ‚ ะฒ ัะฒะพัŽ master-ะฒะตั‚ะบัƒ, ะธะทะฑะฐะฒะธะฒัˆะธััŒ ะพั‚ ะฟั€ะตะดัƒะฟั€ะตะถะดะตะฝะธั ะฟัƒั‚ั‘ะผ ะฟะตั€ะตะฝะพัะฐ ะพะฟั€ะตะดะตะปะตะฝะธั ะฟะตั€ะตะผะตะฝะฝะพะน ะฒ ะฑะปะพะบ 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. ะกะพะฟั€ะพะฒะพะถะดะฐัŽั‰ะธะต ัั‚ะฐะฑะธะปัŒะฝั‹ั… ะฒะตั‚ะพะบ ั‚ะฐะบะถะต ัั‚ะพะปะบะฝัƒะปะธััŒ ั ะฟั€ะตะดัƒะฟั€ะตะถะดะตะฝะธะตะผ ะธ ะฒะผะตัั‚ะพ ั‚ะพะณะพ, ั‡ั‚ะพะฑั‹ ะฟั€ะพะฒะตั€ะธั‚ัŒ, ะฝะต ัƒัั‚ั€ะฐะฝะตะฝะพ ะปะธ ะพะฝะพ ัƒะถะต ะฒ master-ะฒะตั‚ะบะต ะ›ะธะฝัƒัะฐ, ัะพะฑัั‚ะฒะตะฝะฝะพั€ัƒั‡ะฝะพ ะฒะฝะตัะปะธ ะธัะฟั€ะฐะฒะปะตะฝะธะต. ะŸั€ะพะฑะปะตะผะฐ ะฒ ั‚ะพะผ, ั‡ั‚ะพ ะพะฝะธ, ะพัะพะฑะพ ะฝะต ะทะฐะดัƒะผั‹ะฒะฐัััŒ, ะฟั€ะพัั‚ะพ เป‚เบญเบ™ ะพะฟั€ะตะดะตะปะตะฝะธะต ัั‚ั€ัƒะบั‚ัƒั€ั‹ ะฒะฒะตั€ั…, ั‚ะฐะบ, ั‡ั‚ะพ ะฒั‹ะทะพะฒ 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

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