Предотвращение доступа из режима супервизора

Предотвращение доступа из режима супервизора (англ. Supervisor Mode Access Prevention, SMAP) — это функция некоторых реализаций процессоров, таких как Intel: Broadwell (микроархитектура), которая позволяет программам, работающим в режиме супервизора, при необходимости задавать отображения памяти в пользовательское пространство таким образом, чтобы доступ к этим отображениям из режима супервизора вызывал исключение. Это усложняет злоумышленникам использование зловредных программ для «обмана» ядра с целью выполнения инструкций или работы с данными пользовательских программ[1]. По состоянию на 2026 год технология считается дополнительным уровнем защиты (best-effort), а не абсолютно гарантированным барьером[2].

История

Предотвращение доступа из режима супервизора было разработано как дополнение к механизму предотвращения выполнения из режима супервизора (SMEP). SMEP позволяет препятствовать непреднамеренному выполнению кода пользовательского пространства режимом супервизора, в то время как SMAP расширяет эту защиту на чтение и запись данных. SMEP блокирует атаки с передачей управления пользовательскому коду (например, ret2usr), а SMAP вынуждает злоумышленников искать способы размещения ROP-цепочек непосредственно в пространстве ядра[3].

Преимущества

Без механизма предотвращения доступа из режима супервизора код, выполняющийся в режиме супервизора, обычно обладает полным доступом на чтение и запись к отображениям памяти пользовательского пространства (см. возможность получения полного доступа). Это привело к созданию ряда эксплойтов и методик повышения привилегий, основанных на принуждении ядра к неосознанному доступу к пользовательской памяти[4].

Операционные системы могут блокировать такие эксплойты, используя SMAP для того, чтобы любые непреднамеренные обращения к пользовательской памяти вызывали ошибки страниц. Кроме того, SMAP может выявлять дефектный код ядра, не использующий корректные процедуры доступа к пользовательской памяти[1].

Однако использование SMAP в операционной системе может приводить к росту объёма кода ядра и снижению производительности при доступе к пользовательской памяти из режима супервизора. Для намеренного доступа режиму супервизора требуется временно отключать SMAP, что тоже замедляет выполнение[5].

При использовании технологий маскирования адресов (Intel LAM, AMD UAI) возможны атаки по сторонним каналам (например, через TLB), так как трансляция адреса происходит до того, как SMAP успевает заблокировать доступ[6][7].

Технические особенности

О поддержке SMAP процессорами сигнализирует расширенный лист возможностей CPUID.

SMAP активируется, когда пагинация памяти включена и установлен бит SMAP в регистре CR4. Для явного доступа к пользовательской памяти SMAP можно временно отключать, устанавливая флаг AC (Alignment Check (проверка выравнивания), бит 18)[8] в регистре EFLAGS. Для простой установки и сброса этого флага применяются инструкции stac («установить AC») и clac («сбросить AC»).

Когда бит SMAP в CR4 установлен, явные чтения и записи памяти по пользовательским страницам из кода с уровнем привилегий ниже 3 всегда приводят к исключению страницы, если флаг AC в EFLAGS не установлен. Неявные обращения (например, операции с таблицами дескрипторов) по пользовательским страницам вызовут исключение страницы при включённом SMAP, вне зависимости от состояния флага AC в EFLAGS.

Поддержка в операционных системах

Поддержка SMAP в ядре Linux была реализована H. Peter Anvin[1]. Эта функция была включена в основную ветку ядра Linux начиная с версии 3.7 и по умолчанию активируется для процессоров, поддерживающих SMAP[5].

FreeBSD поддерживает механизм предотвращения выполнения из режима супервизора (SMEP) с 2012 года[9], а поддержку SMAP — с 2018 года[10].

В OpenBSD поддержка SMAP и связанного механизма SMEP реализована с 2012 года[11]. Первая версия с включённой поддержкой — OpenBSD 5.3[12].

В NetBSD поддержка SMEP была реализована Максимом Вийяром (Maxime Villard) в декабре 2015 года[13]; поддержка SMAP также добавлена Максимом Вийяром в августе 2017 года[14]. Первая версия NetBSD с поддержкой и SMEP, и SMAP — NetBSD 8.0[15].

В Haiku поддержка механизмов SMAP и SMEP была добавлена Жеромом Дювалем (Jérôme Duval) в конце 2017 года и вошла в версию R1/beta1[16][17].

macOS поддерживает SMAP по крайней мере начиная с выхода версии macOS 10.13 в 2017 году.

В Windows полноценное внедрение SMAP в обычное ядро столкнулось с падением производительности и проблемами совместимости, из-за чего строгая изоляция применяется только для защищённого ядра. В Windows 11 флаг AC (Alignment Check) часто оказывается установлен при системных вызовах, что позволило в 2026 году продемонстрировать успешный обход защиты[18][19].

Примечания

  1. 1 2 3 Jonathan Corbet. Supervisor mode access prevention (англ.). LWN.net. LWN.net (26 сентября 2012). Дата обращения: 27 августа 2026. Архивировано 30 октября 2017 года.
  2. SMAP не является абсолютным барьером в Windows 11. SecurityLab.ru. Дата обращения: 27 августа 2026.
  3. Обзор механизмов усиления защищенности операционных систем и пользовательских приложений. Системный администратор. Дата обращения: 27 августа 2026.
  4. Jonathan Corbet. Fun with NULL pointers, part 1 (англ.). LWN.net. LWN.net (20 июля 2009). Дата обращения: 27 августа 2026. Архивировано 11 июня 2012 года.
  5. 1 2 Michael Larabel. Intel SMAP Comes To Try To Better Secure Linux (англ.). Phoronix. Phoronix (2 октября 2012). Дата обращения: 27 августа 2026. Архивировано 3 октября 2012 года.
  6. SLAM: SMAP-Less Address Masking (PDF). VUSec (2024). Дата обращения: 27 августа 2026.
  7. SLAM Project Page. VUSec. Дата обращения: 27 августа 2026.
  8. Alignment Check (AC) Flag. docs.rs. Дата обращения: 27 августа 2026.
  9. Константин Белоусов. Revision 242433 (англ.) (1 ноября 2012). Дата обращения: 27 августа 2026. Архивировано 21 января 2018 года.
  10. Константин Белоусов. Revision 336876 (англ.) (29 июля 2018). Дата обращения: 27 августа 2026. Архивировано 30 июля 2018 года.
  11. Stuart Henderson. Re: Does OpenBSD have SMEP and SMAP implementation? or MPX? (англ.). marc.info (26 марта 2017). Дата обращения: 27 августа 2026. Архивировано 3 августа 2020 года.
  12. OpenBSD 5.3 (англ.). OpenBSD. OpenBSD (1 мая 2013). Дата обращения: 27 августа 2026. Архивировано 17 мая 2014 года.
  13. Significant changes from NetBSD 7.0 to 8.0 (англ.). NetBSD. NetBSD (12 октября 2017). Дата обращения: 27 августа 2026. Архивировано 13 октября 2017 года.
  14. Maxime Villard. amd64: smap support (англ.) (23 августа 2017). Дата обращения: 27 августа 2026. Архивировано 24 августа 2017 года.
  15. Announcing NetBSD 8.0 (July 17, 2018) (англ.). NetBSD. NetBSD (17 июля 2018). Дата обращения: 27 августа 2026. Архивировано 31 июля 2018 года.
  16. kernel: support for Intel SMAP and SMEP on x86_64. (англ.). Haiku. Haiku (30 января 2018). Дата обращения: 9 июля 2024. Архивировано 7 февраля 2019 года.
  17. R1/beta1 Release Notes. Haiku OS. Дата обращения: 27 августа 2026.
  18. Обход аппаратной защиты Intel SMAP в ядре Windows 11. SecurityLab. Дата обращения: 27 августа 2026.
  19. SMAP Pre-Disarmed Stack Pivot Exploit Reveals Windows Kernel Design Flaw (англ.). CyberHub Blog. Дата обращения: 27 августа 2026.