Непривилегированная программа в Linux может перехватить аппаратное прерывание и внедрить его в промежуток между моментом, когда процессор очищает предсказатель ветвлений, и моментом, когда ядро его использует, повторно отравляя предсказатель после выполнения защиты. Исследователи MIT Даниэль Трухильо и Менджиа Ян назвали этот метод INTERRUPT INJECTION.

На компьютере AMD Zen 2 под управлением Linux 6.14 со всеми стандартными защитами Spectre v2 их эксплуатация извлекала произвольную память ядра со скоростью 5,47 байт в секунду с точностью 91,97%, достаточной для обнаружения и чтения файла /etc/shadow, хранящего хэши паролей системы, за пять попыток из десяти. Атака требует только локального выполнения кода без привилегий, поэтому риск актуален для общих систем с уязвимым процессором.

Исследователи раскрыли информацию об уязвимости компаниям AMD и Intel 5 февраля. AMD сообщила о планах выпустить патч ядра, который впоследствии был распространён через обычное обновление операционной системы. Исправление внедрено в ядро Linux в коммите от 2 июня под названием "x86/bugs: Make Safe-RET robust against interrupt injection", подготовленном Бориславом Петковым в сотрудничестве с Дэвидом Капланом, оба инженеры AMD.

AMD опубликовала бюллетень 6 августа (AMD-SB-7061) под названием "Safe RET Interrupt Vulnerability", указав на уязвимость процессоров Zen 1–Zen 4. В резюме говорится, что злоумышленник, запустивший код на уязвимой системе, может "внедрить прерывание в точный момент для нарушения Safe RET", что "может ослабить защиту и привести к раскрытию информации".

Согласно исследованиям, Intel не считает необходимым внедрение защиты. Ни в бюллетене AMD, ни в объявлении MIT нет ссылки на коммит ядра. Без номера CVE или названного выпуска ядра администратор должен знать название коммита для проверки наличия исправления.

Все механизмы защиты очищают или изолируют состояние предсказателя ветвлений, чтобы предыдущее обучение злоумышленника не смогло управлять ветвлением ядра. Intel выполняет это при входе в ядро с помощью eIBRS, AMD — непосредственно перед каждым возвратом из ядра с помощью saferet.

Исследователи назвали класс этих атак TONTOU (Time-of-Neutralization to Time-of-Use), по аналогии с известными из программирования TOCTOU гонками. Прерывания нарушают это предположение, так как они срабатывают почти везде, а Linux позволяет любому пользователю планировать их с наносекундной точностью.

На Zen 2 окно уязвимости составляет две инструкции (шесть байт). Исследователи расширили вероятность успеха, вытеснив эти байты из кэша L1 и L2, используя гиперпоток-сосед, и замедлив их, а также выбрав системный вызов write, который оставлял под их контролем два регистра. Прерывания попадали внутрь окна в 5–12% случаев.

После проникновения внутрь обработчик сам становился гаджетом обучения, вооружённым техникой Inception для заполнения буфера стека возвратов целью, выбранной злоумышленником. Ошибки предсказания обнаруживались в коде ядра на трёх из четырёх протестированных машин с успешностью 0,75% на Zen 2.

Пара представила работу на конференции Black Hat USA, и статья будет представлена на USENIX Security в Балтиморе на следующей неделе.