Предотвращение доступа в режиме супервизора
Предотвращение доступа в режиме супервизора ( SMAP ) — это функция некоторых реализаций ЦП , таких как микроархитектура Intel Broadwell , которая позволяет программам режима супервизора дополнительно устанавливать в пространстве пользователя сопоставления памяти , чтобы доступ к этим сопоставлениям из режима супервизора вызывал ловушку. сложнее Из-за этого вредоносным программам «обмануть» ядро, заставив его использовать инструкции или данные из программы пользовательского пространства. [1] [2]
История [ править ]
Предотвращение доступа в режиме супервизора разработано в дополнение к предотвращению выполнения в режиме супервизора (SMEP), которое было представлено ранее. SMEP можно использовать для предотвращения непреднамеренного выполнения кода пользовательского пространства в режиме супервизора. SMAP расширяет эту защиту на чтение и запись. [2]
Преимущества [ править ]
Без предотвращения доступа в режиме супервизора код супервизора обычно имеет полный доступ на чтение и запись к сопоставлениям памяти в пространстве пользователя (или имеет возможность получить полный доступ). Это привело к разработке нескольких эксплойтов безопасности, в том числе эксплойтов повышения привилегий , которые заставляют ядро обращаться к памяти пользовательского пространства, когда оно этого не предполагало. [3] Операционные системы могут блокировать эти эксплойты, используя SMAP для принудительного непреднамеренного доступа к памяти пользовательского пространства, вызывающего страничные ошибки . Кроме того, SMAP может раскрыть ошибочный код ядра, который не соответствует предполагаемым процедурам доступа к памяти пользовательского пространства. [1]
Однако использование SMAP в операционной системе может привести к увеличению размера ядра и замедлению доступа к памяти пользовательского пространства из кода супервизора, поскольку SMAP необходимо временно отключать каждый раз, когда код супервизора намеревается получить доступ к памяти пользовательского пространства. [4]
Технические подробности [ править ]
Процессоры указывают на поддержку предотвращения доступа в режиме супервизора через лист расширенных функций CPUID .
SMAP активируется, когда подкачка памяти активна бит SMAP в регистре управления CR4 и установлен . SMAP можно временно отключить для явного доступа к памяти, установив флаг EFLAGS.AC (проверка выравнивания). stac
(Установить флаг переменного тока) и clac
Инструкции (Сброс флага переменного тока) можно использовать для простой установки или сброса флага. [5]
Когда бит SMAP в CR4 установлен, явные операции чтения и записи памяти на страницы пользовательского режима, выполняемые кодом, работающим с уровнем привилегий меньше 3, всегда будут приводить к ошибке страницы, если флаг EFLAGS.AC не установлен. Неявное чтение и запись (например, в таблицы дескрипторов ) на страницы пользовательского режима всегда будут вызывать ошибку страницы, если SMAP включен, независимо от значения EFLAGS.AC. [5]
Поддержка операционной системы [ править ]
Поддержка ядра Linux для предотвращения доступа в режиме супервизора была реализована Х. Питером Анвином . [1] Он был объединен с основным ядром Linux 3.7 (выпущенным в декабре 2012 г.) и включен по умолчанию для процессоров, поддерживающих эту функцию. [4]
FreeBSD поддерживает предотвращение выполнения в режиме супервизора с 2012 года. [6] и предотвращение доступа в режиме супервизора с 2018 года. [7]
OpenBSD поддерживает предотвращение доступа в режиме супервизора и связанное с ним предотвращение выполнения в режиме супервизора с 2012 года. [8] OpenBSD 5.3 стал первым выпуском с включенной поддержкой этой функции. [9]
Поддержка NetBSD для предотвращения выполнения в режиме супервизора (SMEP) была реализована Максимом Вилларом в декабре 2015 года. [10] Поддержка предотвращения доступа в режиме супервизора (SMAP) также была реализована Максимом Вилларом в августе 2017 года. [11] NetBSD 8.0 была первой версией, в которой поддерживались и включались обе функции. [12]
Поддержка Haiku для предотвращения выполнения в режиме супервизора (SMEP) была реализована Жеромом Дювалем в январе 2018 года. [13]
macOS поддерживает SMAP, по крайней мере, с момента выпуска macOS 10.13 в 2017 году. [14]
См. также [ править ]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б с Корбет, Джонатан (26 сентября 2012 г.). «Предотвращение доступа в режиме супервизора» . LWN.net . Проверено 4 августа 2017 г.
- ^ Jump up to: Перейти обратно: а б Малникс, Дэвид (22 мая 2015 г.). «Технический обзор семейства процессоров Intel Xeon D: защита доступа в режиме супервизора (SMAP) 4» . Интел . Проверено 4 августа 2017 г.
- ^ Корбет, Джонатан (20 июля 2009 г.). «Забава с NULL-указателями, часть 1» . LWN.net . Проверено 4 августа 2017 г.
- ^ Jump up to: Перейти обратно: а б Ларабель, Майкл (2 октября 2012 г.). «Intel SMAP пытается улучшить безопасность Linux» . Фороникс . Проверено 4 августа 2017 г.
- ^ Jump up to: Перейти обратно: а б «Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 3A: Руководство по системному программированию, часть 1» (PDF) . Интел. июль 2017 года . Проверено 4 августа 2017 г.
- ^ Белоусов, Константин (01 ноября 2012 г.). «Редакция 242433» . Проверено 19 января 2018 г.
- ^ Белоусов, Константин (29 июля 2018 г.). «Редакция 336876» . Проверено 30 июля 2018 г.
- ^ Хендерсон, Стюарт (26 марта 2017 г.). «Re: Есть ли в OpenBSD реализация SMEP и SMAP? Или MPX?» . Проверено 4 августа 2017 г. - через marc.info .
- ^ «ОпенБСД 5.3» . OpenBSD . 01.05.2013 . Проверено 4 августа 2017 г.
- ^ «Значительные изменения с NetBSD 7.0 на 8.0» . НетБСД . 12.10.2017 . Проверено 9 января 2018 г.
- ^ Максим Виллар (23 августа 2017 г.). «amd64: поддержка smap» . Проверено 9 января 2018 г.
- ^ «Анонс NetBSD 8.0 (17 июля 2018 г.)» . НетБСД . 17 июля 2018 г. Проверено 29 июля 2018 г.
- ^ «ядро: поддержка Intel SMAP и SMEP на x86_64» . Хайку (операционная система) . 2018-01-30 . Проверено 4 сентября 2018 г.
- ^ "/osfmk/x86_64/idt64.s.auto.html" . Apple Inc. 25 сентября 2017 г. Проверено 19 сентября 2018 г.