10.05.2018
Причиной возникновения уязвимости является недостаточно ясная трактовка в официальной документации ("System Programming Guide of the Intel 64 and IA-32") поведения MOV SS/POP SS при возникновении отладочных исключений (#DB). На системах x86 стек представлен комбинацией из сегмента стека (SS) и указателя позиции в стеке (SP), которые всегда должны быть синхронизированы для корректного выполнения операций. Инструкции, выполняющие манипуляции с сегментом стека, для блокирования рассинхронизации содержат специальный обработчик для обеспечения согласованности с изменением указателя стека.
Разработчики многих операционных систем полагали, что попадание инструкции MOV SS в точку останова приводит к генерации исключения #DB сразу после завершения MOV SS, но на деле исключение откладывается до границы следующей инструкции и вызывается только после выполнения инструкции, идущей следом за MOV SS. Если следом за MOV SS выполняется одна из инструкций, приводящих к переключению контекста и передаче управления операционной системе (SYSCALL, SYSENTER, INT $N, INT3, INTO), например, осуществляется системный вызов, то обработчик исключения #DB вызывается уже в контексте ядра, а не в контексте пользователя. Для решения проблемы в контексте ядра следовало очистить значение регистра DR6, определить обработчик #DB в стиле обработчика NMI или подменить стек при помощи IST (Interrupt Stack Table).
Уязвимость позволяет непривилегированному пользователю инициировать ситуацию при которой можно получить контроль за указателем стека и указателем GSBASE в обработчике прерываний, вызванном в контексте ядра, что позволит получить доступ к структурам ядра и повлиять на ход выполнения низкоуровневых функций операционной системы (прототип эксплоита для Linux). Например, атакующий может настроить отладочный регистр для срабатывания точки останова при доступе к данным в вершине стека, после чего выполнить инструкцию 'pop %ss; int 3'. Данная инструкция приведёт к возникновению исключения DB#, но оно будет вызвано только после выполнения 'int 3' и перехода в контекст ядра (исключение на адрес в пространстве пользователя возникнет в контексте ядра).
Работа по формированию обновлений для устранения уязвимости велась согласованно с соблюдением эмбарго, поэтому проблема была устранена в большинстве систем ещё до публичного анонса. Подверженность уязвимости различных систем: