В ядрото на Linux е установена уязвимост (CVE-2021-33624), позволяваща използването на подсистемата eBPF за заобикаляне на защитата от уязвимости от класa Spectre, която дава възможност за идентифициране на съдържанието на паметта в резултат на създаването на условия за спекулативно изпълнение на определени операции. За атака Spectre е необходимо наличие на определена последователност от команди в привилегирования код, която води до спекулативно изпълнение на инструкции. Чрез манипулация с предавани за изпълнение BPF-програми може да се постигне генерирането на подобни инструкции в eBPF и да се получи изтичане на съдържание от паметта на ядрото и произволни области на физическата памет по странични канали.
Уязвимостта е причинена от недостатъци в верификатора, който се използва за откриване на грешки и неприемлива активност в 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 пъти (от 2m9s до 1m32s), но също така удвои времето за изпълнение в пространството на потребителя (от 1m9s до 0m33s), вероятно поради намаляване на ефективността на работа на кэша на CPU и сбросовете на TLB при активна защита от Spectre.
Източник: opennet.ru
