Retbleed – новая атака на механизм спекулятивного выполнения CPU Intel и AMD

Группа исследователей из Швейцарской высшей технической школы Цюриха выявила новый вариант атаки на механизм спекулятивного выполнения косвенных переходов в CPU, позволяющий извлечь информацию из памяти ядра или организовать атаку на хост-систему из виртуальных машин. Уязвимости получили кодовое имя Retbleed (CVE-2022-29900, CVE-2022-29901) и близки по своей сути к атакам Spectre-v2. Отличие сводится к организации спекулятивного выполнения произвольного кода при обработке инструкции “ret” (return), извлекающей адрес для перехода из стека, вместо косвенного перехода при помощи инструкции “jmp” с загрузкой адреса из памяти или регистра CPU.

Атакующий может создать условия для неверного предсказания перехода и организовать целенаправленный спекулятивный переход на блок кода, не предусмотренный логикой выполнения программы. В конечном счёте, процессор определит, что предсказание ветвления не оправдалось и откатит операцию в исходное состояние, но обработанные в процессе спекулятивного выполнения данные осядут в кэше и микроархитектурных буферах. Если ошибочно выполненный блок осуществляет обращение к памяти, то его спекулятивное выполнение приведёт к оседанию в общем кэше и данных, прочитанных из памяти.

Для определения данных, оставшихся в кэше после спекулятивного выполнения операций, атакующий может использовать методы определения остаточных данных по сторонним каналам, например, анализировать изменения времени доступа к прокэшированным и не прокэшированным данным. Для целенаправленного извлечения информации из областей в другом уровне привилегий (например, из памяти ядра) используются “гаджеты” – присутствующие в ядре последовательности команд, пригодные для спекулятивного чтения данных из памяти в зависимости от внешних условий, на которые может влиять атакующий.

Для защиты от классических атак класса Spectre, в которых используются инструкции условного и косвенного перехода, в большинстве операционных систем применяется техника “retpoline“, основанная на замене операций косвенного перехода на инструкцию “ret”, для которой в процессорах применяется отдельный блок предсказания состояния стека, не использующий блок предсказания переходов. При внедрении retpoline в 2018 году считалось, что похожие на Spectre манипуляции с адресами неприменимы на практике для спекулятивного перехода при помощи инструкции “ret”.

Исследователи, разработавшие метод атаки Retbleed, продемонстрировали возможность создания микроархитектурных условий для инициирования спекулятивного перехода при помощи инструкции “ret” и опубликовали готовый инструментарий для выявления в ядре Linux подходящих для эксплуатации уязвимости последовательностей инструкций (гаджетов), в которых проявляются подобные условия.

В ходе исследования подготовлен рабочий эксплоит, позволяющий на системах c CPU Intel из непривилегированного процесса в пространстве пользователя извлекать произвольные данные из памяти ядра со скоростью 219 байт в секунду и точностью 98%. На процессорах AMD эффективность работы эксплоита гораздо выше – скорость утечки составляет 3.9 КБ в секунду. В качестве практического примера показано, как при помощи предложенного эксплоита определить содержимое файла /etc/shadow. На системах с CPU Intel атака для определения хэша пароля пользователя root была проведена за 28 минут, а на системах с CPU AMD – за 6 минут.



Возможность совершения атаки подтверждена для 6-8 поколений процессоров Intel, которые выпускались до 3 квартала 2019 года (включая Skylake), и процессоров AMD на базе микроархитектур Zen 1, Zen 1+ и Zen 2, которые выпускались до второго квартала 2021 года. В более новых моделях процессоров, таких как AMD Zen3 и Intel Alder Lake, а также в процессорах ARM, проблема блокируется имеющимися механизмами защиты. Например, применение инструкций IBRS (Indirect Branch Restricted Speculation) помогает защититься от атаки.

Для ядра Linux и гепервизора Xen подготовлен набор изменений, на старых CPU блокирующих проблему программным путём. Предложенный для ядра Linux патч изменяет 68 файлов, добавляет 1783 строк и удаляет 387 строк. К сожалению защита приводит к существенным накладным расходам – в проведённых текстах на процессорах AMD и Intel снижение производительности оценивается от 14% до 39%. Более предпочтительным является применение защиты на основе инструкций IBRS, доступных в новых поколениях CPU Intel и поддерживаемых начиная с ядра Linux 4.19.

На процессорах Intel подстановка адреса для спекулятивного косвенного перехода осуществляется благодаря особенности, проявляющейся при переполнении через нижнюю границу (underflow) в буфере предсказания содержимого стека (Return Stack Buffer). При возникновении подобных условий для инструкции “ret” начинает применяться логика выбора адреса, аналогичная той, что используется при обычных косвенных переходах. В ядре Linux найдено более тысячи мест, создающих условия инициирования подобного обратного переполнения и доступных через системные вызовы.

На процессорах AMD спекулятивное выполнение инструкции “ret” осуществляется без привязки к специфичному для стека буферу (Return Address Stack) и блок предсказания переходов рассматривает инструкцию “ret” не как возврат управления, а как косвенный переход, и, соответственно, использует при предсказании данные для косвенных переходов. При подобных условиях фактически любая операция “ret”, достижимая через системный вызов, может использоваться для эксплуатации.

Дополнительно, в CPU AMD также выявлена ещё одна проблема (CVE-2022-23825, Branch Type Confusion), связанная с осуществлением фиктивных переходов – условия для предсказания перехода могут возникать даже без необходимых инструкций ветвления, что позволяет влиять на буфер предсказания переходов без инструкции “ret”. Данная особенность существенно усложняет реализацию защиты и требует более активной очистки буфера предсказании переходов. Ожидается, что добавление полной защиты в ядро приведёт к снижению производительности на 209%.

Release. Ссылка here.