НСобдуманноС исправлСниС ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ ΡƒΡΡ‚Ρ€Π°Π½Π΅Π½ΠΈΡŽ уязвимости Spectre Π² ядрС Linux

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° 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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ