Intel MPX

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

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]. Поддержка удалена в версии ядра 4.20 (24 декабря 2018) [11][12].

Поддерживались в компиляторе GCC в версиях с 5.2[6][13] до 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.
  2. Introduction to Intel Memory Protection Extensions. Intel (16 июля 2013). Дата обращения 10 сентября 2013.
  3. Discussion of Intel Memory Protection Extensions (MPX) and comparison with AddressSanitizer. code.google.com. Дата обращения 4 ноября 2013.
  4. Intel Memory Protection Extensions (Intel MPX) support in the GCC compiler. gcc.gnu.org. Дата обращения 4 ноября 2013.
  5. 1 2 Intel Architecture Instruction Set Extensions Programming Reference (PDF). Intel (December 2013). Дата обращения 17 января 2014. Архивировано 1 февраля 2014 года.
  6. 1 2 3 4 Intel® Memory Protection Extensions (Intel® MPX) for Linux* | 01.org, 2016
  7. Intel Software Development Emulator. Intel (15 июня 2012). Дата обращения 4 ноября 2013.
  8. Intel Software Development Emulator. Intel.
  9. Linux kernel 3.19, Section 1.2. Support for the Intel Memory Protection Extensions. kernelnewbies.org (February 9, 2015). Дата обращения 9 февраля 2015.
  10. Jonathan Corbet. Supporting Intel MPX in Linux. LWN.net (January 29, 2014). Дата обращения 9 февраля 2015.
  11. http://lkml.iu.edu/hypermail/linux/kernel/1812.0/04478.html
  12. https://www.theregister.co.uk/2019/04/25/qemu_4/ "x86 MPX support has already been yanked from the Linux kernel"
  13. Intel Memory Protection Extensions (Intel MPX) support in the GCC compiler. gcc.gnu.org. Дата обращения 4 ноября 2013.
  14. https://gcc.gnu.org/gcc-9/changes.html
  15. https://www.phoronix.com/scan.php?page=news_item&px=GCC-Patch-To-Drop-MPX
  16. https://istep2016.ru/files/presentations/IntelR%20Compilers.pdf#page=26 Архивировано 21 ноября 2016 года.
  17. https://blogs.msdn.microsoft.com/vcblog/2016/01/20/visual-studio-2015-update-1-new-experimental-feature-mpx/
  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", arΧiv:1702.00719 [cs.CR] 
  19. Konstantin Serebryany - Research at Google. research.google.com.
  20. Discussion of Intel Memory Protection Extensions (MPX) and comparison with AddressSanitizer. Дата обращения 4 ноября 2013.
  21. Oleksenko, Oleksii; Kuvaiskii, Dmitrii; Bhatotia, Pramod; Felber, Pascal & Fetzer, Christof (2018), "A Systematic Evaluation of Transient Execution Attacks and Defenses", arΧiv:1811.05441 [cs.CR] 

Ссылки[править | править код]