Необдумане виправлення призвело до неповного усунення вразливості Spectre у ядрі Linux

Розробники проекту Grsecurity поділилися повчальною історією, що демонструє як необдумане усунення попереджень компілятора, може призвести до появи вразливостей у коді. Наприкінці травня для ядра Linux було запропоновано виправлення нового вектора експлуатації уразливості Spectre через системний виклик ptrace.

У процесі тестування патча розробники звернули увагу, що при складанні компілятор виводить попередження про змішування коду та визначень (структура була визначена після коду із присвоєнням значення існуючої змінної):

int index = n;
if (n ptrace_bps [index];

Лінус прийняв виправлення у свою master-гілку, позбувшись від попередження шляхом перенесення визначення змінної до блоку if:

if (n ptrace_bps [index];

У липні виправлення також було портовано стабільні гілки ядра 4.4, 4.9, 4.14, 4.19 і 5.2. Супровідні стабільні гілки також зіткнулися з попередженням і замість того, щоб перевірити, чи не усунуто воно вже в master-гілці Лінуса, власноруч внесли виправлення. Проблема в тому, що вони, особливо не замислюючись, просто перенесли визначення структури вгору, отже, виклик array_index_nospec, безпосередньо забезпечує захист від уразливості, перестав використовуватися щодо структури, і замість змінної «index» завжди використовувалася змінна «n»:

int index = n;
if (n ptrace_bps [index];
index = array_index_nospec(index, HBP_NUM);

Джерело: opennet.ru

Додати коментар або відгук