Suicide
04.09.2019, 20:16
Разработчики проекта Grsecurity поделились (https://grsecurity.net/teardown_of_a_failed_linux_lts_spectre_fix.php) поучительной историей, демонстрирующей как необдуманное устранение предупреждений компилятора может привести к появлению уязвимостей в коде. В конце мая для ядра Linux было предложено исправление нового вектора эксплуатации уязвимости Spectre через системный вызов ptrace.
В процессе тестирования патча разработчики обратили внимание, что при сборке компилятор выводит предупреждение о смешивании кода и определений (структура была определена после кода с присвоением значения существующей переменной):
int index = n;
if (n ptrace_bps[index];
Линус принял исправление (https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/commit/arch/x86/kernel/ptrace.c?id=31a2fbb390fee4231281b939e1979e810f9454 15) в свою master-ветку, избавившись (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=223cea6a4f0552b86fb25e3b8bbd00469816cd7a) от предупреждения путём переноса определения переменной в блок if:
if (n ptrace_bps[index];
В июле исправление также было портировано в стабильные ветки ядра 4.4, 4.9, 4.14, 4.19 и 5.2. Сопровождающие стабильных веток также столкнулись с предупреждением и вместо того, чтобы проверить, не устранено ли оно уже в master-ветке Линуса, собственноручно внесли исправление. Проблема в том, что они, особо не задумываясь, просто перенесли (https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/arch/x86/kernel/ptrace.c?h=v5.2.11&id=d1ba61ae4be5e5a5727e303c827591517b6188bb) определение структуры вверх, так, что вызов array_index_nospec, непосредственно обеспечивающий защиту от уязвимости, перестал использоваться при определении структуры, и вместо переменной "index" всегда использовалась переменная "n":
int index = n;
if (n ptrace_bps[index];
index = array_index_nospec(n, HBP_NUM);
4.09.2019
http://www.opennet.ru/opennews/art.shtml?num=51419
В процессе тестирования патча разработчики обратили внимание, что при сборке компилятор выводит предупреждение о смешивании кода и определений (структура была определена после кода с присвоением значения существующей переменной):
int index = n;
if (n ptrace_bps[index];
Линус принял исправление (https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/commit/arch/x86/kernel/ptrace.c?id=31a2fbb390fee4231281b939e1979e810f9454 15) в свою master-ветку, избавившись (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=223cea6a4f0552b86fb25e3b8bbd00469816cd7a) от предупреждения путём переноса определения переменной в блок if:
if (n ptrace_bps[index];
В июле исправление также было портировано в стабильные ветки ядра 4.4, 4.9, 4.14, 4.19 и 5.2. Сопровождающие стабильных веток также столкнулись с предупреждением и вместо того, чтобы проверить, не устранено ли оно уже в master-ветке Линуса, собственноручно внесли исправление. Проблема в том, что они, особо не задумываясь, просто перенесли (https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/arch/x86/kernel/ptrace.c?h=v5.2.11&id=d1ba61ae4be5e5a5727e303c827591517b6188bb) определение структуры вверх, так, что вызов array_index_nospec, непосредственно обеспечивающий защиту от уязвимости, перестал использоваться при определении структуры, и вместо переменной "index" всегда использовалась переменная "n":
int index = n;
if (n ptrace_bps[index];
index = array_index_nospec(n, HBP_NUM);
4.09.2019
http://www.opennet.ru/opennews/art.shtml?num=51419