Исследователи безопасности из Университета Цинхуа и Университета Мэриленда обнаружили новую атаку по сторонним каналам, которая затрагивает несколько поколений процессоров Intel и приводит к утечке данных через регистр флагов EFLAGS.
Вместо того, чтобы основываться на системе кеширования, как многие атаки по сторонним каналам, новый вектор атаки использует уязвимость переходного выполнения (Transient execution). Недостаток позволяет извлекать конфиденциальные данные из пространства пользовательской памяти с помощью анализа тайминга.
Атака работает так же, как уязвимость Meltdown, которая использует спекулятивное исполнение, позволяющее злоумышленнику обходить механизмы изоляции памяти для доступа к конфиденциальной информации, хранящейся в памяти ядра – пароли, ключи шифрования и другие личные данные.
Новая атака по стороннему каналу (Side-channel attack) использует недостаток в изменении регистра EFLAGS при переходном выполнении, влияющий на синхронизацию инструкций JCC (jump on condition code).
Регистр EFLAGS – это регистр ЦП, который содержит различные флаги, связанные с состоянием процессора, а инструкция JCC – это инструкция ЦП, которая допускает условное ветвление на основе содержимого регистра EFLAGS.
Атака выполняется в два этапа:
- Киберпреступник запускает переходное выполнение и кодирует конфиденциальные данные через регистр EFLAGS;
- Злоумышленник замеряет время выполнения инструкции JCC для декодирования данных.
Обзор атаки
Экспериментальные данные показали, что атака достигла 100% извлечения данных (утечки) в Intel i7-6700 и Intel i7-7700, а также в более новом процессоре Intel i9-10980XE, но в отдельных случаях. Эксперимент проводился на Ubuntu 22.04 Jammy Jellyfish с ядром Linux версии 5.15.0.
По словам исследователей, эта атака по времени не так надежна, как атака по сторонним каналам на основе кэша, и чтобы получить лучшие результаты в процессорах последних поколений, атаку пришлось бы повторять тысячи раз.
Было обнаружено, что влияние регистра EFLAGS на время выполнения инструкции JCC не такое постоянное, как состояние кэша. Примерно в течение 6-9 циклов после начала переходного исполнения время выполнения JCC не будет способствовать созданию стороннего канала. Эмпирически атака должна повторяться тысячи раз для большей точности.
Специалисты предлагают применить некоторые нетривиальные меры, такие как изменение реализации инструкции JCC, чтобы предотвратить вредоносное выполнение, или переписывание EFLAGS после переходного выполнения, чтобы уменьшить его влияние на инструкцию JCC.