Раскрыта информация об уязвимости CVE-2018-8897, которая вызвана неверной интерпретацией описания поведения инструкций MOV SS/POP SS в документации и может привести к получению доступа к закрытым областям памяти, вызова отказа в обслуживании или повышения привилегий в системе. Проблема проявляется на 64-разрядных процессорах x86 (AMD и Intel) в большинстве операционных систем и гипервизоров, включая Linux, FreeBSD, Windows, macOS, Xen, KVM и VMware.

Причиной возникновения уязвимости является недостаточно ясная трактовка в официальной документации («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’ и перехода в контекст ядра (исключение на адрес в пространстве пользователя возникнет в контексте ядра).

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

  • Linux: уязвимость может привести только к краху ядра, возможность атаки по повышению привилегий исключена (в Linux используется IST, но один слот для #BP и #DB, что позволяет совершить DoS). Обновления пакетов с ядром выпущены для Debian, RHEL, Fedora, openSUSE, SUSE и Ubuntu. Исправления включены в свежие выпуски поддерживаемых веток ядра Linux;
  • Системы виртуализации на базе KVM (CVE-2018-1087): непривилегированный пользователь гостевой системы может использовать уязвимость для поднятия своих привилегий внутри гостевой системы (прототип эксплоита);
  • Гипервизор Xen (XSA-260): пользователь гостевой системы, работающей в режиме паравиртуализации (PV), может поднять свои привилегии до уровня гипервизора (ring0);
  • FreeBSD: уязвимость устранена в ветках stable/11, 11.2-PRERELEASE, releng/11.1, 11.1-RELEASE-p10, stable/10, 10.4-STABLE, releng/10.4, 10.4-RELEASE-p9. В ходе атаки можно получить доступ к содержимому памяти ядра, потенциально поднять свои привилегии или вызвать крах ядра;
  • DragonFly BSD: исправление уязвимости включено в ядро DragonFly_RELEASE_5_2;
  • Windows: уязвимость можно использовать для повышения привилегий и получения полного контроля за системой;
  • macOS: локальный пользователь может поднять свои привилегии в системе и выполнить код с правами ядра;
  • OpenBSD и NetBSD не подвержены уязвимости.