Раскрыта (http://openwall.com/lists/oss-security/2018/05/08/4) информация об уязвимости (https://everdox.net/popss.pdf) CVE-2018-8897 (https://security-tracker.debian.org/tracker/CVE-2018-8897), которая вызвана неверной интерпретацией описания поведения инструкций MOV SS/POP SS в документации и может привести к получению доступа к закрытым областям памяти, вызова отказа в обслуживании или повышения привилегий в системе. Проблема проявляется на 64-разрядных процессорах x86 (AMD и Intel) в большинстве операционных систем и гипервизоров, включая Linux, FreeBSD, Windows, macOS, Xen, KVM и VMware.
Причиной возникновения уязвимости является недостаточно ясная трактовка в официальной документации (https://software.intel.com/en-us/articles/intel-sdm) ("System Programming Guide of the Intel 64 and IA-32") поведения MOV SS/POP SS при возникновении отладочных исключений (#DB (https://xem.github.io/minix86/manual/intel-x86-and-64-manual.... На системах x86 стек представлен комбинацией из сегмента стека (SS) и указателя позиции в стеке (SP), которые всегда должны быть синхронизированы для корректного выполнения операций. Для блокирования рассинхронизации инструкции, выполняющие манипуляции с сегментом стека, содержат специальный обработчик для обеспечения согласованности с изменением указателя стека.
Разработчики полагали, что попадание инструкции MOV SS в точку останова приводит к генерации исключения #DB сразу после завершения MOV SS, но на деле исключение откладывается до границы следующей инструкции и вызывается только после выполнения инструкции, идущей следом за MOV SS. Если следом за MOV SS выполняется одна из инструкций, приводящих к переключению контекста и передаче управления операционной системе (SYSCALL, SYSENTER, INT $N, INT3, INTO), например, осуществляется системный вызов, то обработчик исключения #DB вызывается уже в контексте ядра, а не в контексте пользователя. Для решения проблемы в контексте ядра следовало очистить значение регистра DR6 (https://en.wikipedia.org/wiki/X86_debug_register#DR6_-_Debug... определить обработчик #DB в стиле обработчика NMI или подменить стек при помощи IST (Interrupt Stack Table).
Уязвимость позволяет непривилегированному пользователю инициировать ситуацию при которой можно получить контроль за указателем стека и указателем GSBASE в обработчике прерываний, вызванного в контексте ядра, что позволит получить доступ к структурам ядра и повлиять на ход выполнения низкоуровневых функций операционной системы (прототип эксплоита (https://marc.info/?l=linux-kernel&m=152580052406931) для Linux, вызывающего крах ядра). Например, атакующий может настроить отладочный регистр для срабатывания точки останова при доступе к данным в вершине стека, после чего выполнить инструкцию 'pop %ss; int 3'. Данная инструкция приведёт к возникновению исключения DB#, но оно будет вызвано только после выполнения 'int 3' и переходу в контекст ядра (исключение на адрес в пространстве пользователя возникнет в контексте ядра).
Работа по формированию обновлений для устранения уязвимости велась согласованно с назначением эмбарго, поэтому проблема была устранена в большинстве систем ещё до публичного анонса. Подверженность (https://www.kb.cert.org/vuls/id/631579) уязвимости различных систем:
- Linux: уязвимость может привести только к краху ядра, возможность атаки по повышению привилегий исключена (https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2018-8897) (в Linux используется IST (https://www.kernel.org/doc/Documentation/x86/kernel-stacks), но один слот для #BP и #DB, что позволяет совершить DoS). Обновления пакетов с ядром выпущены для Debian (https://security-tracker.debian.org/tracker/CVE-2018-8897), RHEL (https://access.redhat.com/errata/RHSA-2018:1318), Fedora, openSUSE (https://lists.opensuse.org/opensuse-security-announce/2018-0... SUSE (https://www.suse.com/security/cve/CVE-2018-8897/) и Ubuntu (https://people.canonical.com/~ubuntu-security/cve/2018/CVE-2.... Исправления включены в свежие выпуски поддерживаемых веток ядра Linux (https://www.kernel.org/);
- Системы виртуализации на базе KVM (CVE-2018-1087 (http://openwall.com/lists/oss-security/2018/05/08/5)): непривилегированный пользователь гостевой системы может использовать уязвимость для поднятия своих привилегий внутри гостевой системы (
прототип эксплоита (https://lkml.kernel.org/r/67e08b69817171da8026e0eb3af0214b06...
- Гипервизор Xen (XSA-260 (http://seclists.org/oss-sec/2018/q2/91)): пользователь гостевой системы, работающей в режиме паравиртуализации (PV), может поднять свои привилегии до уровня гипервизора (ring0);
- FreeBSD (https://www.freebsd.org/security/advisories/FreeBSD-SA-18:06...: уязвимость устранена в ветках 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 (https://www.dragonflydigest.com/2018/05/09/21231.html): исправление уязвимости включено в ядро DragonFly_RELEASE_5_2;
- Windows (https://portal.msrc.microsoft.com/en-US/security-guidance/ad...: уязвимость можно использовать для повышения привилегий и получения полного контроля за системой;
- macOS (https://support.apple.com/en-us/HT208742): локальный пользователь может поднять свои привилегии в системе и выполнить код с правами ядра;
- OpenBSD и NetBSD не подвержены уязвимости.
Описание в документации Intel (https://software.intel.com/en-us/articles/intel-sdm), которое было неверно истолковано разработчиками:
URL: http://openwall.com/lists/oss-security/2018/05/08/4
Новость: https://www.opennet.ru/opennews/art.shtml?num=48569