Предотвращение доступа в режиме супервизора - Supervisor Mode Access Prevention
Предотвращение доступа в режиме супервизора (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
Инструкции (Clear AC Flag) можно использовать для простой установки или сброса флага.[5]
Когда бит SMAP в CR4 установлен, явная память читает и записывает на страницы пользовательского режима, выполняемые кодом, работающим с уровень привилегий меньше 3 всегда будет приводить к ошибке страницы, если флаг EFLAGS.AC не установлен. Неявные чтения и записи (например, сделанные в таблицы дескрипторов ) на страницы пользовательского режима всегда будет вызывать отказ страницы, если SMAP включен, независимо от значения EFLAGS.AC.[5]
Поддержка операционной системы
Ядро Linux поддержка предотвращения доступа в режиме супервизора была реализована Х. Питер Анвин.[1] Он был объединен с основным ядром Linux 3.7 и включен по умолчанию для процессоров, поддерживающих эту функцию.[4]
FreeBSD поддерживает предотвращение выполнения в режиме супервизора с 2012 г.[6] и предотвращение доступа в режиме супервизора с 2018 года.[7]
OpenBSD поддерживает предотвращение доступа в режиме супервизора и соответствующее предотвращение выполнения в режиме супервизора с 2012 года,[8] при этом OpenBSD 5.3 является первым выпуском с включенной поддержкой этой функции.[9]
NetBSD поддержка Supervisor Mode Execution Prevention (SMEP) была реализована Максимом Виллардом в декабре 2015 г.[10]. Поддержка предотвращения доступа в режиме супервизора (SMAP) была также реализована Максимом Виллардом в августе 2017 года.[11] NetBSD 8.0 была первым выпуском, в котором обе функции были поддержаны и включены.[12]
Хайку Поддержка режима Supervisor Mode Execution Prevention (SMEP) была реализована Жеромом Дювалем в январе 2018 года.[13]
macOS поддерживает SMAP по крайней мере с момента выпуска macOS 10.13 2017.[14]
Смотрите также
Рекомендации
- ^ а б c Корбет, Джонатан (26 сентября 2012). «Предотвращение доступа в режиме супервизора». LWN.net. Получено 2017-08-04.
- ^ а б Мулникс, Дэвид (2015-05-22). "Технический обзор семейства процессоров Intel Xeon D: защита доступа в режиме супервизора (SMAP) 4". Intel. Получено 2017-08-04.
- ^ Корбет, Джонатан (20 июля 2009 г.). «Веселье с указателями NULL, часть 1». LWN.net. Получено 2017-08-04.
- ^ а б Ларабель, Майкл (2012-10-02). «Intel SMAP пытается улучшить безопасность Linux». Фороникс. Получено 2017-08-04.
- ^ а б "Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 3A: Руководство по системному программированию, часть 1" (PDF). Intel. Июль 2017 г.. Получено 2017-08-04.
- ^ Белоусов, Константин (01.11.2012). «Редакция 242433». Получено 2018-01-19.
- ^ Белоусов, Константин (29.07.2018). «Ревизия 336876». Получено 2018-07-30.
- ^ Хендерсон, Стюарт (26 марта 2017 г.). «Re: Есть ли в OpenBSD реализация SMEP и SMAP? Или MPX?». Получено 2017-08-04 - через marc.info.
- ^ "OpenBSD 5.3". OpenBSD. 2013-05-01. Получено 2017-08-04.
- ^ «Значительные изменения с NetBSD 7.0 на 8.0». NetBSD. 2017-10-12. Получено 2018-01-09.
- ^ Максим Виллар (2017-08-23). "amd64: поддержка smap". Получено 2018-01-09.
- ^ «Анонс NetBSD 8.0 (17 июля 2018 г.)». NetBSD. 2018-07-17. Получено 2018-07-29.
- ^ «Ядро: поддержка Intel SMAP и SMEP на x86_64». Haiku (операционная система). 2018-01-30. Получено 2018-09-04.
- ^ "/osfmk/x86_64/idt64.s.auto.html". Apple Inc. 2017-09-25. Получено 2018-09-19.