Retbleed என்பது Intel மற்றும் AMD CPUகளின் ஊக செயலாக்க பொறிமுறையின் மீதான ஒரு புதிய தாக்குதலாகும்.

Группа исследователей из Швейцарской высшей технической школы Цюриха выявила новый вариант атаки на механизм спекулятивного выполнения косвенных переходов в 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%.

ஆதாரம்: opennet.ru

கருத்தைச் சேர்