Уразливості в eBPF, що дозволяють обійти захист від атаки Spectre 4

У ядрі Linux виявлено дві вразливості, що дозволяють використовувати підсистему еBPF для захисту захисту від атаки Spectre v4 (SSB, Speculative Store Bypass). За допомогою непривілейованої BPF програми атакуючий може створити умови для спекулятивного виконання певних операцій і визначити вміст довільних областей пам'яті ядра. Супровідні підсистеми eBPF в ядрі отримали доступ до прототипу експлоїту, що демонструє можливість атак на практиці. Проблеми усунуті у формі патчів (1, 2), які увійдуть до складу найближчого оновлення ядра Linux. Оновлення в дистрибутивах поки що не сформовані (Debian, RHEL, SUSE, Arch, Fedora, Ubuntu).

Метод атаки Spectre 4 базується на відновленні осіли в процесорному кеші даних після відкидання результату спекулятивного виконання операцій при обробці операцій запису, що чергуються, і читання з використанням непрямої адресації. Коли операція читання слідує за операцією запису (наприклад, mov [rbx + rcx], 0x0; mov rax, [rdx + rsi]), зміщення адреси для читання вже може бути відоме через виконання схожих операцій (операції читання виконуються значно частіше і читання може бути виконано з кеша) і процесор може спекулятивно виконати читання раніше запису, не чекаючи поки буде обчислено зсув непрямої адресації для запису.

Якщо після обчислення зміщення виявлено перетин областей пам'яті для запису та читання, процесор просто відкине вже спекулятивно отриманий результат читання та повторить цю операцію. Ця особливість дозволяє інструкції читання отримати доступ до старого значення за деякою адресою під час доки операція збереження ще не завершена. Після відкидання невдалої спекулятивної операції в кеші залишаються сліди від її виконання, після чого для його вилучення може застосовуватися один із способів визначення вмісту кешу на основі аналізу зміни часу доступу до прокешованих та не прокешованих даних.

Перша вразливість (CVE-2021-35477) викликана недоробкою у механізмі перевірки програм BPF. Для захисту від атаки Spectre 4 верифікатор додає після потенційно проблемних операцій збереження до пам'яті додаткову інструкцію, що зберігає нульове значення для витіснення слідів минулої операції. Передбачалося, що операція запису нуля виконається дуже швидко і блокує спекулятивне виконання, оскільки залежить тільки від покажчика на кадр стека BPF. Але насправді, виявилося можливим створення умов, за яких інструкція, що призводить до спекулятивного виконання, встигає виконатися до операції збереження, що витісняє.

Друга вразливість (CVE-2021-3455) пов'язана з тим, що при виявленні верифікатором BPF потенційно небезпечних операцій збереження в пам'ять не враховуються неініціалізовані області стека BPF, перша операція запису в які не захищається. Подібна особливість призводить до можливості здійснення спекулятивної операції читання, залежної від неініціалізованої області пам'яті перед виконанням інструкції збереження. Нова пам'ять для BPF-стека виділяється без перевірки вмісту, вже наявного в пам'яті, і на стадії до запуску BPF-програми є спосіб управління вмістом області пам'яті, яка потім буде виділена під стек BPF.

Джерело: opennet.ru

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