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

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

Вразливість викликана недоробками у верифікаторі, який застосовується для виявлення помилок та неприпустимої активності у BPF-програмах. Верифікатор перебирає можливі шляхи виконання коду, але пропускає варіанти розгалуження, неприпустимі з погляду семантики архітектури набору команд. При виконанні BPF програми подібні варіанти розгалуження, не враховані верифікатором, можуть бути невірно передбачені процесором і виконані в спекулятивному режимі. Наприклад, при аналізі операції "load" верифікатор розраховує, що в інструкції використовується регістр з адресою, значення якого завжди знаходиться в заданих межах, але атакуючий може створити умови, за яких процесор спробує спекулятивно виконати операцію з адресою, що не відповідає умовам перевірки.

Проблема проявляється починаючи з випуску ядра 4.15 та усунена у формі патчів (1, 2, 3, 4). У дистрибутивах вразливість поки що залишається невиправленою (Debian, RHEL, Ubuntu, Fedora, SUSE, Arch).

Додатково можна відзначити замітку про вплив на продуктивність засобів захисту від уразливостей класу Spectre. У замітці узагальнені результати оптимізації відладчика rr (Record and Replay), свого часу створеного в Mozilla для налагодження помилок, що складно повторюються в Firefox. Кешування системних викликів, що використовуються для перевірки існування каталогів, дозволило скоротити виконання операції "rr sources" для тестового проекту з 3 хвилин 19 до 36 секунд.

Автор оптимізації вирішив перевірити, наскільки зміниться продуктивність після відключення захисту від Spectre. Після завантаження системи з параметром "mitigations = off" час виконання "rr sources" без оптимізації склав 2 хвилини 5 секунд (в 1.6 рази швидше), а з оптимізацією - 33 секунди (на 9% швидше). Цікаво, що відключення захисту від Spectre не тільки в 1.4 рази скоротило час виконання коду на рівні ядра (c 2m9s до 1m32s), але й удвічі зменшило час виконання у просторі користувача (c 1m9s до 0m33s), ймовірно через зниження ефективності роботи кешу CPU та скидів TLB при включеному захисті від Spectre.

Джерело: opennet.ru

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