Memory Tagging Extension (MTE)
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Memory Tagging Extension (MTE) призначена для підвищення надійності та безпеки програмного забезпечення шляхом виявлення та запобігання помилкам, пов'язаним з пам'яттю, таким як переповнення буфера та вразливості використання після звільнення. MTE, як частина архітектури ARM, надає механізм для прикріплення невеликого тегу до кожного виділення пам'яті та відповідного тегу до кожного вказівника, що посилається на цю пам'ять. Цей підхід дозволяє виявляти незаконні доступи до пам'яті під час виконання, значно зменшуючи ризик експлуатації таких вразливостей для виконання довільного коду.
MTE працює, ділячи пам'ять на невеликі блоки фіксованого розміру, кожному блоку присвоюється тег, зазвичай розміром кілька біт.
Коли створюється вказівник на цю пам'ять, він отримує той же тег. Цей тег зберігається в невикористаних бітах вказівника пам'яті, ефективно пов'язуючи вказівник з відповідним блоком пам'яті.
Коли програма отримує доступ до пам'яті через вказівник, апаратне забезпечення MTE перевіряє, чи тег вказівника відповідає тегу блоку пам'яті. Якщо теги не збігаються, це вказує на незаконний доступ до пам'яті.
Теги всередині вказівника зберігаються в 4 бітах у верхньому байті:
Отже, це дозволяє мати до 16 різних значень тегів.
Кожні 16B фізичної пам'яті мають відповідний тег пам'яті.
Теги пам'яті зберігаються в призначеній області RAM (недоступній для звичайного використання). Маючи 4 біти тегів для кожних 16B тегів пам'яті, до 3% RAM.
ARM вводить наступні інструкції для маніпуляції цими тегами в призначеній пам'яті RAM:
ЦП перевіряє теги під час виконання інструкції, якщо є невідповідність, він викликає виключення. Це найповільніший і найнадійніший режим.
ЦП перевіряє теги асинхронно, і коли виявляється невідповідність, він встановлює біт виключення в одному з системних регістрів. Це швидше ніж попередній, але не може вказати на точну інструкцію, яка викликала невідповідність, і не викликає виключення негайно, даючи трохи часу атакуючому для завершення атаки.
???
Називається Hardware Tag-Based KASAN, MTE-based KASAN або in-kernel MTE.
Ядро виділяє пам'ять (як kmalloc
), яке викликає цей модуль, що підготує тег для використання (випадковим чином) і прикріпить його до виділеного простору ядра та до повернутого вказівника.
Зверніть увагу, що він позначить лише достатню кількість гранул пам'яті (по 16B кожна) для запитуваного розміру. Тож, якщо запитуваний розмір становив 35, а було надано блок розміром 60B, він позначить перші 16*3 = 48B цим тегом, а решта буде позначена так званим недійсним тегом (0xE).
Тег 0xF є вказівником на всі. Пам'ять з цим вказівником дозволяє використовувати будь-який тег для доступу до її пам'яті (без невідповідностей). Це може запобігти MET від виявлення атаки, якщо цей тег використовується в атакованій пам'яті.
Отже, є лише 14 значень, які можна використовувати для генерації тегів, оскільки 0xE і 0xF зарезервовані, що дає ймовірність повторного використання тегів 1/17 -> близько 7%.
Якщо ядро отримує доступ до недійсної гранули тегу, невідповідність буде виявлена. Якщо воно отримує доступ до іншого місця пам'яті, якщо пам'ять має інший тег (або недійсний тег), невідповідність буде виявлена. Якщо атакуючий щасливий і пам'ять використовує той самий тег, це не буде виявлено. Шанси становлять близько 7%.
Ще одна помилка виникає в останній гранулі виділеної пам'яті. Якщо програма запитала 35B, їй було надано гранулу з 32 до 48. Тому байти з 36 до 47 використовують той самий тег, але їх не запитували. Якщо атакуючий отримує доступ до цих додаткових байтів, це не виявляється.
Коли виконується kfree()
, пам'ять повторно тегується недійсним тегом пам'яті, тому в використанні після звільнення, коли пам'ять знову доступна, невідповідність виявляється.
Однак у випадку використання після звільнення, якщо той самий фрагмент повторно виділяється з ТИМ ЖЕ тегом, що раніше, атакуючий зможе використовувати цей доступ, і це не буде виявлено (близько 7% шанс).
Більше того, лише slab
і page_alloc
використовують теговану пам'ять, але в майбутньому це також буде використовуватися в vmalloc
, stack
і globals
(на момент відео їх все ще можна зловживати).
Коли невідповідність виявляється, ядро панікує, щоб запобігти подальшій експлуатації та спробам експлуатації (MTE не має хибнопозитивних результатів).
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)