Intel MPX
Intel MPX ( Memory Protection Extensions ) je rozšíření instrukční sady pro architekturu x86 / x86-64 , navržené v roce 2013. S podporou kompilátoru , runtime knihoven a operačního systému zvyšuje rozšíření Intel MPX bezpečnost programů s ohledem na přístup do paměti přidáním kontrol přístupu ukazatelů , zejména k zabránění útokům přetečením vyrovnávací paměti .
Podpora pro rozšíření byla z mnoha softwarových produktů odstraněna koncem roku 2018/začátkem roku 2019.
Rozšíření
MPX zavádí nové hraniční registry a několik instrukcí , které tyto registry zpracovávají. Navíc je zaveden koncept „tabulek hranic“, které uchovávají popisy paměťových rozsahů pro případ nedostatku hraničních registrů. [1] [2] [3] [4]
MPX definuje čtyři nové 128bitové registry hranic BND0..BND3, z nichž každý ukládá pár 64bitových dolních hranic (LB) a horních hranic (UB) hodnot nějakého objektu v paměti, jako je vyrovnávací paměť nebo pole. . Horní mez je uložena ve formátu doplňku a ke konverzi dojde, když je hodnota načtena pomocí instrukcí BNDMKa BNDCU. Architektura přidala uživatelský konfigurační registr BNDCFGU, privilegovaný konfigurační registr IA32_BNDCFGS(jako součást MSR registrů ) a stavový registr BNDSTATUS, který poskytuje informace o chybné adrese v paměti a chybovém kódu v případě výjimky. [5]
Aplikace může používat Bounds Directory (BD) několika tabulek Bounds (BT), které obsahují lineární adresy ukazatele vyrovnávací paměti spolu s hranicemi vyrovnávací paměti. Tabulky jsou organizovány jako dvouúrovňový radixový strom z lineární adresy ukazatele [6] . Tyto dvě instrukce načítají a ukládají - BNDLDXa BNDSTX - synchronizují hodnoty registru BNDxs hranicemi určenými v adresáři. [5] Dvě instrukce vložené kompilátorem BNDCLa BNDCU, zkontrolují, zda se ukazatel nachází ve specifikovaných mezích (dolní a horní, v tomto pořadí) a vedou k výjimce mimo meze.
Použití MPX vyžaduje další paměť pro popis hranic. V nejhorším případě by 4 kilobajty různých ukazatelů (1024 nebo 512) vyžadovaly 16 kilobajtů tabulek hranic (každá hranice ukládá 4 hodnoty o velikosti ukazatele). Načítání hranic z nebo do tabulek je zásah do paměti a může zpomalit některé programy [6] .
Podpora
Rozšíření Intel MPX byla představena v mikroarchitektuře Skylake . [7]
Mikroarchitektury Intel Goldmont (Atom) také podporují Intel MPX. [osm]
Podpora v linuxovém jádře se objevila ve verzi 3.19 (8. února 2015), [9] [10] doplněna z verze 4.1 [6] . V roce 2018 bylo navrženo odstranění podpory pro Intel MPX z nadcházejícího vydání linuxového jádra 4.20 [11] [12] , nicméně odpovídající změny byly přijaty pouze pro verzi 5.6. Podpora pro MPX byla odstraněna ve vydání linuxového jádra 5.6 z března 2020 [13] .
Podporováno v kompilátoru GCC od 5.2 [6] [4] do 9.0 (květen 2019) [14] [15] . Implementováno v Intel Compiler 15.0 [16] a Microsoft Visual Studio 2015 Update 1 [17] .
Analýza Intel MPX
V roce 2017 byla publikována nezávislá rozšiřující revize a srovnání technologie se třemi moderními softwarovými systémy pro bezpečnost paměti ( AddressSanitizer , SAFECode, SoftBound). [osmnáct]
- Navzdory hardwarovým blokům použitým v Intel MPX nevede k rychlejšímu spouštění programu ve srovnání s metodami softwarové ochrany. Nové instrukce MPX vedou přinejhorším ke čtyřnásobnému zpomalení a při použití optimalizací je průměrné zpomalení asi 50 %.
- Na rozdíl od jiných metod MPX nechrání před časově bezpečným porušením zabezpečení paměti.
- Intel MPX neobsahuje explicitní podporu multithreadingu, což může vést ke konfliktům ve starších aplikacích s více vlákny, pokud kompilátory nepoužívají explicitní synchronizaci hranic.
- Intel MPX nepodporuje několik běžně používaných jazykových idiomů C/C++ kvůli omezením umístění paměti.
- Intel MPX není plně kompatibilní s jednotlivými rozšířeními, zejména při kombinaci s Intel TSX a Intel SGX mohou nastat problémy s výkonem a zabezpečením .
- Při provádění MPX operací na starších generacích procesorů (například Haswell) dochází ke zpomalení cca 15 %.
Přezkum dospěl k závěru, že MPX není připraven k použití v průmyslových aplikacích a ukázal, že AddressSanitizer je lepší volbou. [18] Kostya Serebryany [19] [20] , vývojář AddressSanitizer, zaměstnanec nadnárodní korporace Google, vyjádřil stejný názor .
Studie MPX ve světle zranitelností Meltdown a Spectre [21] ukázala, že útoky Meltdown nejsou zastaveny pomocí Intel MPX a že je možné provést únik dat (filtrování dat) postranním kanálem pomocí metody Flush + Reload při přístupu mimo hranice pole chráněné MPX.
Poznámky
- ↑ Rozšíření Intel ISA . Intel . Získáno 4. listopadu 2013. Archivováno z originálu 10. listopadu 2013. (neurčitý)
- ↑ Úvod do rozšíření Intel Memory Protection Extensions . Intel (16. července 2013). Získáno 10. září 2013. Archivováno z originálu 28. července 2013. (neurčitý)
- ↑ Diskuse o Intel Memory Protection Extensions (MPX) a srovnání s AddressSanitizer . code.google.com . Získáno 4. listopadu 2013. Archivováno z originálu dne 4. července 2015. (neurčitý)
- ↑ 1 2 Podpora rozšíření Intel Memory Protection Extensions (Intel MPX) v kompilátoru GCC . gcc.gnu.org . Získáno 4. listopadu 2013. Archivováno z originálu 11. června 2019. (neurčitý)
- ↑ 1 2 Intel Architecture Instruction Set Extensions Programming Reference (PDF). Intel (prosinec 2013). Datum přístupu: 17. ledna 2014. Archivováno z originálu 1. února 2014. (neurčitý)
- ↑ 1 2 3 4 Intel® Memory Protection Extensions (Intel® MPX) pro Linux* | 01.org Archivováno 2. dubna 2017 na Wayback Machine , 2016
- ↑ Intel Software Development Emulator . Intel (15. června 2012). Získáno 4. listopadu 2013. Archivováno z originálu 16. října 2013. (neurčitý)
- ↑ Intel Software Development Emulator . Intel. Získáno 21. listopadu 2016. Archivováno z originálu 6. května 2019. (neurčitý)
- ↑ Linuxové jádro 3.19, Oddíl 1.2. Podpora pro rozšíření Intel Memory Protection Extensions . kernelnewbies.org (9. února 2015). Získáno 9. února 2015. Archivováno z originálu 12. února 2015. (neurčitý)
- ↑ Jonathan Corbet. Podpora Intel MPX v Linuxu . LWN.net (29. ledna 2014). Získáno 9. února 2015. Archivováno z originálu 9. února 2015. (neurčitý)
- ↑ Linuxové jádro může zahodit podporu rozšíření ochrany paměti . Phoronix . Získáno 31. března 2020. Archivováno z originálu dne 28. dubna 2020. (neurčitý)
- ↑ [GIT PULL x86: odebrat Intel MPX] . Získáno 1. srpna 2019. Archivováno z originálu dne 7. srpna 2019. (neurčitý)
- ↑ Podpora Intel MPX je v Linuxu 5.6 - Phoronix mrtvá . www.phoronix.com . Získáno 31. března 2020. Archivováno z originálu dne 29. února 2020. (neurčitý)
- ↑ GCC 9 Release Series – Změny, nové funkce a opravy – GNU Project – Free Software Foundation (FSF) . Získáno 1. srpna 2019. Archivováno z originálu 19. února 2022. (neurčitý)
- ↑ Zdá se, že GCC 9 je nastaven na odstranění podpory Intel MPX - Phoronix . Získáno 1. srpna 2019. Archivováno z originálu 9. února 2019. (neurčitý)
- ↑ https://istep2016.ru/files/presentations/IntelR%20Compilers.pdf#page=26 Archivováno 21. listopadu 2016.
- ↑ Visual Studio 2015 Update 1: Nová experimentální funkce – MPX | Blog týmu C++ . Staženo 1. srpna 2019. Archivováno z originálu 15. ledna 2019. (neurčitý)
- ↑ 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].
- ↑ Konstantin Serebryany – Výzkum ve společnosti Google . research.google.com . Získáno 1. srpna 2019. Archivováno z originálu 16. září 2016. (neurčitý)
- ↑ Diskuse o Intel Memory Protection Extensions (MPX) a srovnání s AddressSanitizer . Získáno 4. listopadu 2013. Archivováno z originálu 12. ledna 2019. (neurčitý)
- ↑ 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].
Odkazy