Intel MPX (англ. Memory Protection Extensions — расширения защиты памяти) — расширение набора инструкций для архитектуры x86/x86-64, предложенное в 2013 году. С поддержкой со стороны компилятора, библиотек среды выполнения и операционной системы, расширение Intel MPX увеличивает безопасность программ по отношению к доступу к памяти, добавляя проверки доступа по указателям, в частности, для предотвращения атак, использующих переполнение буфера.

Поддержка расширения была удалена из многих программных продуктов в конце 2018 — начале 2019 года.

Расширения править

MPX вводит новые регистры границ и несколько инструкций, которые обрабатывают эти регистры. Дополнительно вводится понятие «таблиц границ», которые хранят описания диапазонов памяти, в случае нехватки регистров границ.[1][2][3][4]

MPX определяет четыре новых 128-разрядных регистра границ, BND0..BND3, каждый из которых хранит пару 64-битных нижних границ (LB) и верхних границ (UB) значений какого-то объекта в памяти, например буфера или массива. Верхняя граница хранится в формате дополнения до единицы, преобразование происходит при загрузке значения инструкциями BNDMK и BNDCU. В архитектуру добавлен пользовательский регистр конфигурации BNDCFGU, привилегированный регистр конфигурации IA32_BNDCFGS (в состав MSR-регистров), и регистр состояния BNDSTATUS, который предоставляет информацию об ошибочном адресе в памяти и код ошибки в случае исключения.[5]

Приложение может использовать каталог границ — Bounds Directory (BD) из нескольких таблиц границ — Bounds Tables (BT), которые содержат линейные адреса указателя на буфер, вместе с границами буфера. Таблицы организованы как двухуровневое radix-дерево от линейного адреса указателя[6]. Два инструкции загрузки и сохранения — BNDLDX и BNDSTX — синхронизируют значения регистров BNDx с границами, указанными в каталоге.[5] Две инструкции, вставляемые компилятором, BNDCL и BNDCU, производят проверку указателя на нахождение в пределах указанных границ (нижней и верхней соответственно) и приводят к генерации исключения при выходе за границы.

Применение MPX требует дополнительной памяти для описания границ. В наихудшем случае для 4 килобайтов различных указателей (1024 или 512) потребуется 16 килобайт таблиц границ (каждая граница хранит 4 величины размером с указатель). Загрузка границ из таблиц или в таблицы является обращением в память и может несколько замедлять работу некоторых программ[6].

Поддержка править

Расширения Intel МРХ были введены в микроархитектуре Skylake.[7] Микроархитектуры Intel Goldmont (Atom) также поддерживают Intel MPX.[8]

Поддержка в ядре Linux появилась в версии 3.19 (8 февраля 2015),[9][10] дополнена с версии 4.1[6]. В 2018 году было предложено удалить поддержку Intel MPX из предстоящего релиза ядра Linux 4.20[11][12], однако соответствующие изменения были приняты только к версии 5.6. Поддержка MPX была удалена в вышедшей в марте 2020 года версии ядра Linux 5.6[13].

Поддерживались в компиляторе GCC в версиях с 5.2[6][4] до 9.0 (май 2019)[14][15]. Реализованы в Intel Compiler 15.0[16], а также Microsoft Visual Studio 2015 Update 1[17].

Анализ Intel MPX править

В 2017 был опубликован независимый обзор расширения и сравнение технологии с тремя современными программными системами обеспечения безопасности памяти (AddressSanitizer, SAFECode, SoftBound).[18]

  • Несмотря на аппаратные блоки, используемые в Intel MPX, он не приводит к более быстрому исполнению программ по сравнению с программными методами защиты. Новые инструкции MPX в худшем приводят к четырехкратному замедлению, а при использовании оптимизаций в среднем замедление составляет около 50 %.
  • В отличие от других методов, MPX не защищает от нарушений безопасной работы с памятью во времени.
  • Intel MPX не содержит явных способов поддержки многопоточности, что может приводить к состоянию гонки в устаревших многопоточных приложениях если компиляторы не используют явную синхронизацию границ.
  • Intel MPX не поддерживает несколько часто применяемых идиом языков C/C++ из-за ограничений на расположение участков памяти.
  • Intel MPX не в полной степени совмести с отдельными расширениями, в частности возможны проблемы производительности и безопасности при смешивании с Intel TSX и Intel SGX.
  • При выполнении операций MPX на старых поколениях процессоров (например, Haswell) происходит замедление примерно на 15 %.

Обзор пришел к неготовности MPX к использованию в промышленном применении и указал, что AddressSanitizer является более качественным вариантом.[18] Такое же мнение высказал разработчик AddressSanitizer, сотрудник транснациональной корпорации Google, Kostya Serebryany[19][20].

Изучение MPX в свете уязвимостей Meltdown и Spectre[21] показало, что Meltdown-атаки не останавливаются при помощи Intel MPX и что возможно проведение утечки данных (фильтрации данных) через побочный канал по методике Flush+Reload при обращениях вне границ массива, защищенного MPX.

Примечания править

  1. Intel ISA Extensions. Intel. Дата обращения: 4 ноября 2013. Архивировано 10 ноября 2013 года.
  2. Introduction to Intel Memory Protection Extensions. Intel (16 июля 2013). Дата обращения: 10 сентября 2013. Архивировано 28 июля 2013 года.
  3. Discussion of Intel Memory Protection Extensions (MPX) and comparison with AddressSanitizer. code.google.com. Дата обращения: 4 ноября 2013. Архивировано 4 июля 2015 года.
  4. 1 2 Intel Memory Protection Extensions (Intel MPX) support in the GCC compiler. gcc.gnu.org. Дата обращения: 4 ноября 2013. Архивировано 11 июня 2019 года.
  5. 1 2 Intel Architecture Instruction Set Extensions Programming Reference (PDF). Intel (декабрь 2013). Дата обращения: 17 января 2014. Архивировано 1 февраля 2014 года.
  6. 1 2 3 4 Intel® Memory Protection Extensions (Intel® MPX) for Linux* | 01.org Архивная копия от 2 апреля 2017 на Wayback Machine, 2016
  7. Intel Software Development Emulator. Intel (15 июня 2012). Дата обращения: 4 ноября 2013. Архивировано 16 октября 2013 года.
  8. Intel Software Development Emulator. Intel. Дата обращения: 21 ноября 2016. Архивировано 6 мая 2019 года.
  9. Linux kernel 3.19, Section 1.2. Support for the Intel Memory Protection Extensions. kernelnewbies.org (9 февраля 2015). Дата обращения: 9 февраля 2015. Архивировано 12 февраля 2015 года.
  10. Jonathan Corbet. Supporting Intel MPX in Linux. LWN.net (29 января 2014). Дата обращения: 9 февраля 2015. Архивировано 9 февраля 2015 года.
  11. The Linux Kernel Might Drop Memory Protection Extensions Support. Phoronix. Дата обращения: 31 марта 2020. Архивировано 28 апреля 2020 года.
  12. [GIT PULL] x86: remove Intel MPX. Дата обращения: 1 августа 2019. Архивировано 7 августа 2019 года.
  13. Intel MPX Support Is Dead With Linux 5.6 - Phoronix. www.phoronix.com. Дата обращения: 31 марта 2020. Архивировано 29 февраля 2020 года.
  14. GCC 9 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF). Дата обращения: 1 августа 2019. Архивировано 19 февраля 2022 года.
  15. GCC 9 Looks Set To Remove Intel MPX Support - Phoronix. Дата обращения: 1 августа 2019. Архивировано 9 февраля 2019 года.
  16. https://istep2016.ru/files/presentations/IntelR%20Compilers.pdf#page=26 Архивировано 21 ноября 2016 года.
  17. Visual Studio 2015 Update 1: New Experimental Feature - MPX | C++ Team Blog. Дата обращения: 1 августа 2019. Архивировано 15 января 2019 года.
  18. 1 2 Oleksenko, Oleksii; Kuvaiskii, Dmitrii; Bhatotia, Pramod; Felber, Pascal; Fetzer, Christof (2017). "Intel MPX Explained: An Empirical Study of Intel MPX and Software-based Bounds Checking Approaches". arXiv:1702.00719 [cs.CR].
  19. Konstantin Serebryany - Research at Google. research.google.com. Дата обращения: 1 августа 2019. Архивировано 16 сентября 2016 года.
  20. Discussion of Intel Memory Protection Extensions (MPX) and comparison with AddressSanitizer. Дата обращения: 4 ноября 2013. Архивировано 12 января 2019 года.
  21. Oleksenko, Oleksii; Kuvaiskii, Dmitrii; Bhatotia, Pramod; Felber, Pascal; Fetzer, Christof (2018). "A Systematic Evaluation of Transient Execution Attacks and Defenses". arXiv:1811.05441 [cs.CR].

Ссылки править