Даниэль Могими (Daniel Moghimi) из компании Google, занимающийся исследовательской деятельностью в Калифорнийском университете в Сан-Диего, выявил новую уязвимость (CVE-2022-40982) в системе спекулятивного выполнения инструкций процессоров Intel, позволяющую определить содержимое векторных регистров XMM, YMM и ZMM, до этого использованных в других процессах при выполнении инструкций AVX (Advanced Vector Extensions) на том же ядре CPU. Уязвимости присвоено имя Downfall, а техника атаки названа Gather Data Sampling (GDS).
Непривилегированный атакующий, имеющий возможность выполнить свой код в системе, может использовать уязвимость для организации утечки данных из процессов других пользователей, ядра системы, изолированных анклавов Intel SGX и виртуальных машин. Подверженные утечке векторные регистры активно применяются при шифровании, в функциях копирования памяти и при обработке строк, например, среди прочего данные регистры применяются в библиотеке Glibc в функциях memcpy, strcmp и strlen. С практической стороны уязвимость можно использовать для определения данных, обрабатываемых в инструкциях AES-NI или REP-MOVS (применяется в функции memcpy) в других процессах, что может привести к утечке ключей шифрования, конфиденциальных данных и паролей пользователей.
В качестве демонстрации работы метода опубликованы прототипы эксплоитов для извлечения криптографических ключей из процесса другого пользователя, организации утечки данных после их копирования функцией memcpy в ядре Linux и перехвата печатных символов, остающихся в векторных регистрах после работы других процессов. Например, показана возможность определения ключей AES, применяемых для шифрования данных в процессе другого пользователя, использующего библиотеку OpenSSL.
Метод показал высокую эффективность: при проведении эксперимента со 100 различными ключами было определено 100% ключей AES-128 и 86% ключей AES-256 при продолжительности каждой попытки определения не более 10 секунд. В облачных системах атака может использоваться для определения данных, обрабатываемых в других виртуальных машинах. Не исключена возможность эксплуатации уязвимости через запуск JavaScript-кода в web-браузере.
Как и в недавно выявленной уязвимости Zenbleed, затрагивающей процессоры AMD Zen2, причиной появления уязвимости Downfall является утечка данных из регистровых файлов (RF, Register File), которые используются для совместного хранения содержимого регистров во всех задачах на том же ядре CPU. Утечка происходит из-за спекулятивной пересылки данных при выполнении инструкции GATHER, доступной в расширениях AVX2 и AVX-512, и предназначенной для предоставления быстрого доступа к разрозненным данным в памяти. В ходе выполнения инструкции GATHER старые данные из регистрового файла используются при спекулятивном выполнении зависимых инструкций. Указанные данные напрямую не отражаются в программных регистрах, но могут быть определены при помощи методов атаки по сторонним каналам, разработанных для атак класса Meltdown, таких как анализ остаточных данных в кэше CPU.
Компания Intel была информирована о проблеме 24 августа 2022 года, а публично сведения об уязвимости были обнародованы 9 августа 2023 года на конференции BlackHat USA. Уязвимость проявляется в процессорах Intel, имеющих поддержку расширенных наборов инструкций AVX2 и AVX-512 (c 6 по 11 поколение Intel Core), т.е. в процессорах, выпускаемых с 2014 года (Sky Lake, Tiger Lake, Ice Lake, Rocket Lake и т.п.). Процессоры Intel на базе микроархитектур Alder Lake, Raptor Lake и Sapphire Rapids проблеме не подвержены. Все ранее доступные методы защиты от атак, связанных со спекулятивным выполнением инструкций в CPU, не блокируют проблему. Средства для защиты от уязвимости Downfall предложены в свежем обновлении микрокода, но блокирование уязвимости может приводить к снижению производительности до 50% при использовании в коде инструкции GATHER.
Исправления для защиты от уязвимости включены в состав обновлений ядра Linux 6.4.9, 6.1.44, 5.15.125, 5.10.189, 5.4.252, 4.19.290, 4.14.321. Для систем, для которых недоступно устранение проблемы при помощи микрокода, реализовано отключение поддержки всех расширений AVX (отдельно AVX2 и AVX512 отключить невозможно). Для управления включением защиты добавлен параметр ядра "gather_data_sampling" и информационный файл "/sys/devices/system/cpu/vulnerabilities/gather_data_sampling". В обновлении микрокода Intel также предоставлена возможность использования интерфейса MSR (Model-specific register) для выборочного отключения защиты в контексте отдельных процессов.
Среди возможных мер для предотвращения негативного влияния защиты от уязвимости Downfall на производительность упоминается внесение изменений компиляторы для отключения использования инструкции GATHER (в GCC можно использовать опцию "-mtune-ctrl=^use_gather,^use_gather_2parts,^use_gather_4parts ") или добавляющих сразу после GATHER инструкцию LFENCE, которая запрещает упреждающее выполнение следующих инструкций, до того как будет завершена фиксация всех предыдущих операций (приводит к существенному снижению производительности). Проследить за появлением защиты от уязвимости в дистрибутивах можно на следующих страницах: Debian, Ubuntu, Gentoo, RHEL, SUSE, Fedora, Arch, OpenBSD, FreeBSD, NetBSD.
Отмечается, что реализованное отключение AVX может нарушить работу некоторого кода в пространстве пользователя, который некорректно определяет наличие поддержки AVX2. В частности, проблемы возникают, если приложение проверяет только наличие поддержки AVX, но не учитывает информацию о поддержке XSAVE YMM. Судя по всему, данная логика применяется достаточно часто, так как, например, перестала работать команда 'wc -l'.