Эта статья показывает, как гаджеты спекулятивного выполнения TIKTAG могут утекать теги памяти ARM MTE, делая возможными практические атаки на повреждение памяти против Chrome и LinuxЭта статья показывает, как гаджеты спекулятивного выполнения TIKTAG могут утекать теги памяти ARM MTE, делая возможными практические атаки на повреждение памяти против Chrome и Linux

Исследование описывает практические атаки, которые обходят защиту MTE в Chrome и Linux

2025/12/24 17:00

Резюме

1. Введение

2. Предпосылки

  • Расширение маркировки памяти
  • Атака спекулятивного выполнения

3. Модель угроз

4. Поиск гаджетов утечки тегов

  • Шаблон утечки тегов
  • Фаззинг утечки тегов

5. Гаджеты TIKTAG

  • TIKTAG-v1: Эксплуатация сжатия спекуляции
  • TIKTAG-v2: Эксплуатация пересылки от хранения к загрузке

6. Атаки в реальных условиях

6.1. Атака на Chrome

7. Оценка

8. Связанные работы

9. Заключение и ссылки

\

Атаки в реальных условиях

Чтобы продемонстрировать эксплуатируемость гаджетов TIKTAG в средствах защиты на основе MTE, в этом разделе разрабатываются две реальные атаки против Chrome и ядра Linux (Рисунок 9). Существует несколько проблем при запуске реальных атак с использованием гаджетов TIKTAG. Во-первых, гаджеты TIKTAG должны выполняться в целевом адресном пространстве, требуя от атакующего создать или найти гаджеты из целевой системы. Во-вторых, атакующий должен контролировать и наблюдать состояние кэша для утечки результатов проверки тегов. Далее мы демонстрируем реальные атаки с использованием гаджетов TIKTAG на двух реальных системах: браузере Google Chrome (§6.1) и ядре Linux (§6.2), а также обсуждаем стратегии смягчения.

\ 6.1. Атака на Chrome

Браузер Веб-браузер является основной поверхностью атаки для веб-атак, поскольку он обрабатывает недоверенный веб-контент, такой как JavaScript и HTML. Сначала мы представляем обзор модели угроз (§6.1.1) и предоставляем гаджет TIKTAG, созданный в движке JavaScript V8 (§6.1.2). Затем мы демонстрируем эффективность гаджетов TIKTAG при эксплуатации браузера (§6.1.3) и обсуждаем стратегии смягчения (§6.1.4).

\ ==6.1.1. Модель угроз.== Мы следуем типичной модели угроз атак браузера Chrome, где атакующий стремится эксплуатировать уязвимости повреждения памяти в процессе рендеринга. Мы предполагаем, что пользователь-жертва посещает веб-сайт, контролируемый атакующим, который предоставляет вредоносную веб-страницу. Веб-страница включает специально созданные HTML и JavaScript, которые эксплуатируют уязвимости повреждения памяти в процессе рендеринга жертвы. Мы предполагаем, что все современные техники смягчения Chrome применены, включая ASLR [18], CFI [15], изоляцию сайтов [53] и песочницу V8 [56]. Кроме того, в качестве ортогональной защиты мы предполагаем, что процесс рендеринга включает случайную маркировку MTE в PartitionAlloc [2].

\ ==6.1.2. Создание гаджета TIKTAG.== В среде JavaScript V8 TIKTAG-v2 был успешно создан и утекал теги MTE любого адреса памяти. Однако мы не нашли создаваемого гаджета TIKTAG-v1, поскольку жесткое временное ограничение между BR и CHECK не было выполнимым в нашей технике спекулятивного побега из песочницы V8 (§A).

Гаджет V8 TikTag-v2. Рисунок 8 - это гаджет TIKTAG-v2, созданный в движке JavaScript V8, и его псевдокод на C после JIT-компиляции. С этим гаджетом атакующий может узнать, совпадает ли предполагаемый тег Tg с тегом Tm, назначенным target_addr. Атакующий подготавливает три массива: slow, victim, probe и значение idx. slow - это Unit8Array длиной 64 и доступен в BR для запуска неправильного предсказания ветвления. victim - это Float64Array длиной 64, к которому обращаются для запуска пересылки от хранения к загрузке. probe - это Uint8Array длиной 512 и доступен в

\ TEST для утечки результата проверки тегов. Значение idx типа Number используется для выхода за границы доступа к victim. Значение idx выбирается так, что victim[idx] указывает на target_addr с предполагаемым тегом Tg (т.е., (Tg«56)|target_addr). Для спекулятивного доступа к target_addr за пределами песочницы V8 мы использовали технику спекулятивного побега из песочницы V8, которую мы обнаружили в ходе нашего исследования, которую мы подробно описываем в §A. Строка 8 на Рисунке 8a - это блок BR гаджета TIKTAG-v2, запускающий неправильное предсказание ветвления с помощью slow[0].

\ Строки 12-13 - это блок CHECK, который выполняет пересылку от хранения к загрузке с помощью victim[idx], обращаясь к target_addr с предполагаемым тегом Tg. Когда этот код JIT-компилируется (Рисунок 8b), выполняется проверка границ, сравнивая idx с victim.length. Если idx - это индекс вне границ, код возвращает undefined, но если поле victim.length требует много времени для загрузки, процессор спекулятивно выполняет следующие инструкции сохранения и загрузки.

\ После этого строка 17 реализует блок TEST, который обращается к probe с переданным значением val в качестве индекса. Снова предшествует проверка границ val относительно длины probe, но эта проверка успешна, поскольку PROBE_OFFSET меньше длины массива probe. В результате probe[PROBE_OFFSET] кэшируется только тогда, когда пересылка от хранения к загрузке успешна, что происходит, когда Tg совпадает с Tm.

\ ==6.1.3. Атака обхода Chrome MTE.== Рисунок 9a иллюстрирует общую атаку обхода MTE на браузер Chrome с произвольным примитивом утечки тегов гаджетов TIKTAG. Мы предполагаем уязвимость переполнения буфера в процессе рендеринга, где эксплуатация временной уязвимости (например, use-after-free) в значительной степени аналогична. Уязвимость переполняет указатель (т.е., vuln_ptr) на уязвимый объект (т.е., objvuln), повреждая соседний объект (т.е., objtarget).

\ При применении MTE в PartitionAlloc два объекта имеют разные теги с вероятностью 14/15. Чтобы избежать вызова исключения, атакующему необходимо убедиться, что теги objvuln и objtarget одинаковы. TIKTAG-v2 может использоваться для утечки тега objvuln ( 1 ) и objtarget ( 2 ). Если оба утекших тега одинаковы, атакующий эксплуатирует уязвимость, которая не вызовет ошибку проверки тегов ( 3 ). В противном случае атакующий освобождает и перераспределяет objtarget и возвращается к первому шагу, пока теги не совпадут.

\ ==Запуск побочного канала кэша.== Для успешной эксплуатации гаджета TIKTAG атакующему необходимо выполнить следующие требования:

i) обучение ветвления,

ii) управление кэшем и

iii) измерение кэша. Все три требования могут быть выполнены в JavaScript.

Во-первых, атакующий может обучить предсказатель ветвлений, запустив гаджет с ненулевым slow[0] и idx в пределах границ, и запустить неправильное предсказание ветвления в BR с нулевым значением в slow[0] и idx вне границ.

Во-вторых, атакующий может вытеснить строки кэша slow[0], victim.length и probe[PROBE_OFFSET] с помощью техник вытеснения кэша JavaScript [8, 21, 70].

В-третьих, атакующий может измерить состояние кэша probe[PROBE_OFFSET] с помощью таймера высокого разрешения на основе SharedArrayBuffer [16, 58].

\ ==Эксплуатация уязвимостей повреждения памяти.== Учитывая утекшие теги MTE, атакующий может эксплуатировать пространственные и временные уязвимости повреждения памяти в рендерере. Стратегия атаки в значительной степени аналогична традиционным атакам повреждения памяти, но должна обеспечить, чтобы уязвимость не вызывала ошибку проверки тегов, используя утекшие теги. Мы более подробно описываем стратегию атаки в §C.

\ ==6.1.4. Смягчение.== Для смягчения атак обхода MTE на основе гаджетов TIKTAG в процессе рендеринга браузера можно использовать следующие меры смягчения:

i) Песочница, учитывающая спекулятивное выполнение: Чтобы остановить атакующих от запуска атак на основе TIKTAG из изолированной среды, такой как песочница V8, песочница может быть укреплена путем предотвращения любого спекулятивного доступа к памяти за пределами области памяти песочницы. Хотя современные веб-браузеры используют песочницу для изоляции недоверенного веб-контента от рендерера, они часто упускают из виду спекулятивные пути.

\ Например, песочница Chrome V8 [56] и песочница Safari Webkit [1] не полностью опосредуют спекулятивные пути [27]. На основе текущих техник сжатия указателей [64] спекулятивные пути могут быть ограничены областью песочницы путем маскировки старших битов указателей.

\ ii) Барьер спекуляции: Как предложено в §5, размещение барьера спекуляции после BR для потенциальных гаджетов TIKTAG может предотвратить спекулятивные атаки утечки тегов. Однако это смягчение может быть неприменимо в критичной к производительности среде браузера, поскольку может внести значительные накладные расходы на производительность.

\ iii) Предотвращение создания гаджетов: Как предложено в §5.2, гаджет TIKTAG-v2 может быть смягчен путем добавления инструкций между инструкциями сохранения и загрузки. Гаджет TIKTAGv1, хотя мы не нашли эксплуатируемого, может быть смягчен путем добавления инструкций между ветвлением и доступом к памяти, как описано в §5.1.

\ 6.2. Атака на ядро Linux

Ядро Linux на ARM широко используется для мобильных устройств, серверов и устройств IoT, что делает его привлекательной целью атаки. Эксплуатация уязвимости повреждения памяти в ядре может повысить привилегии пользователя, и поэтому MTE является перспективным механизмом защиты для ядра Linux. Атаки на основе TIKTAG против ядра Linux представляют уникальные проблемы, отличные от атаки на браузер (§6.1).

\ Это связано с тем, что адресное пространство атакующего изолировано от адресного пространства ядра, где будет выполняться гаджет. Далее мы сначала представляем обзор модели угроз ядра Linux (§6.2.1) и предоставляем доказательство концепции гаджета TIKTAG, который мы обнаружили в ядре Linux (§6.2.2). Наконец, мы демонстрируем эффективность гаджетов TIKTAG при эксплуатации уязвимостей ядра Linux (§6.2.3).

\ ==6.2.1. Модель угроз.== Модель угроз здесь в значительной степени аналогична модели типичных атак повышения привилегий против ядра. В частности, мы сосредотачиваемся на ядре Android Linux на базе ARM, укрепленном стандартными средствами защиты ядра (например, KASLR, SMEP, SMAP и CFI). Мы далее предполагаем, что ядро укреплено решением случайной маркировки MTE, аналогичным готовым к производству решениям MTE, Scudo [3].

\ В частности, каждый объект памяти случайно помечается, и случайный тег назначается, когда объект освобождается, тем самым предотвращая как пространственные, так и временные повреждения памяти. Атакующий способен запускать непривилегированный процесс и стремится повысить свои привилегии, эксплуатируя уязвимости повреждения памяти в ядре. Предполагается, что атакующий знает уязвимости повреждения памяти ядра, но не знает ни одного тега MTE памяти ядра. Запуск повреждения памяти между объектами ядра с

\ несовпадающими тегами вызовет ошибку проверки тегов, что нежелательно для реальных эксплойтов. Одна критическая проблема в этой атаке заключается в том, что гаджет должен быть создан путем повторного использования существующего кода ядра и выполнен системными вызовами, которые атакующий может вызвать. Поскольку архитектура ARMv8 разделяет таблицы страниц пользователя и ядра, гаджеты пользовательского пространства не могут спекулятивно получить доступ к памяти ядра. Эта настройка очень отличается от модели угроз атаки на браузер (§6.1), которая использовала код, предоставленный атакующим, для создания гаджета. Мы также исключили создание гаджетов на основе eBPF [17, 28], поскольку eBPF недоступен для непривилегированного процесса Android [33].

\ ==6.2.2. Гаджет TikTag ядра==. Как описано в §4.1, гаджеты TIKTAG должны соответствовать нескольким требованиям, и каждое требование влечет за собой проблемы в среде ядра.

Во-первых, в BR должно быть запущено неправильное предсказание ветвления с помощью cond_ptr, которое должно быть управляемым из пользовательского пространства. Поскольку последние процессоры AArch64 изолируют обучение предсказания ветвлений между пользователем и ядром [33], обучение ветвлений необходимо выполнять из пространства ядра.

Во-вторых, в CHECK должен быть разыменован guess_ptr. guess_ptr должен быть создан из пользовательского пространства таким образом, чтобы он встраивал тег предположения (Tg) и указывал на адрес ядра (т.е., target_addr) для утечки тега (Tm). В отличие от среды JavaScript браузера (§6.1), предоставленные пользователем данные сильно санитизируются в системных вызовах, поэтому создать произвольный указатель ядра сложно.

\ Например, access_ok() гарантирует, что предоставленный пользователем указатель указывает на пользовательское пространство, а макрос array_index_nospec предотвращает спекулятивный выход за границы доступа с предоставленным пользователем индексом. Таким образом, guess_ptr должен быть существующим указателем ядра, в частности уязвимым указателем, который вызывает повреждение памяти. Например, можно использовать висячий указатель в use-after-free (UAF) или указатель вне границ при переполнении буфера. Наконец, в TEST должен быть разыменован test_ptr, и test_ptr должен быть доступен из пользовательского пространства. Для облегчения измерения состояния кэша test_ptr должен быть указателем пользовательского пространства, предоставленным через аргумент системного вызова.

\ ==Обнаруженные гаджеты.== Мы вручную проанализировали исходный код ядра Linux, чтобы найти гаджет TIKTAG, отвечающий вышеупомянутым требованиям. В результате мы нашли один потенциально эксплуатируемый гаджет TIKTAG-v1 в snd_timer_user_read() (Рисунок 10). Этот гаджет выполняет требования TIKTAG-v1 (§5.1). В строке 10 (т.е., BR) оператор switch запускает неправильное предсказание ветвления со значением, управляемым пользователем, tu->tread (т.е., cond_ptr). В строках 14-17 (т.е., CHECK) tread (т.е., guess_ptr) разыменовывается четырьмя инструкциями загрузки. tread указывает на объект struct snd_timer_tread64, который атакующий может произвольно выделять и освобождать.

\ Если временная уязвимость превращает tread в висячий указатель, его можно использовать как guess_ptr. В строке 20 (т.е., TEST) указатель пользовательского пространства buffer (т.е., test_ptr) разыменовывается в copy_to_user. Поскольку этот гаджет не доступен напрямую из пользовательского пространства, мы внесли небольшое изменение в код ядра; мы удалили ранний возврат для случая по умолчанию в строке 6. Это гарантирует, что к буферу обращаются только по спекулятивному пути для наблюдения разницы состояния кэша из-за спекулятивного выполнения.

\ Хотя это изменение не реалистично в реальном сценарии, оно демонстрирует потенциальную эксплуатируемость гаджета, если будут внесены аналогичные изменения кода. Мы обнаружили еще несколько потенциально эксплуатируемых гаджетов, но не смогли наблюдать разницу состояния кэша между совпадением и несовпадением тегов. Тем не менее, мы считаем, что существует сильный потенциал для эксплуатации этих гаджетов. Запуск атак на основе TIKTAG включает сложную и чувствительную инженерию, и поэтому мы не смогли экспериментировать со всеми возможными случаями.

\ В частности, TIKTAG-v1 полагается на сжатие спекуляции при событиях неправильного пути, которые могут также включать ошибки трансляции адресов или другие исключения на пути неправильного предсказания ветвления. Поскольку системные вызовы включают сложные потоки управления, сжатие спекуляции может не быть запущено, как ожидалось. Кроме того, несколько гаджетов могут стать эксплуатируемыми при изменении кода ядра. Например, гаджет TIKTAG-v1 в ip6mr_ioctl() не проявлял поведение утечки тегов MTE при вызове из пути системного вызова (т.е., ioctl). Однако гаджет имел утечку тегов, когда был перенесен на другие системные вызовы (например, write) с простым потоком управления.

\ ==6.2.3. Атака обхода MTE ядра.== Рисунок 9b иллюстрирует атаки обхода MTE на ядро Linux. Взяв в качестве примера уязвимость use-after-free, мы предполагаем, что атакующий определил соответствующий гаджет TIKTAG, SysTikTagUAF(), способный утечь результат проверки тегов висячего указателя, созданного уязвимостью. Например, гаджет TIKTAG-v1 в snd_timer_user_read() (Рисунок 10) может утечь результат проверки тегов tread, который может стать висячим указателем из-за уязвимости use-after-free или double-free.

\ Атака продолжается следующим образом: Во-первых, атакующий освобождает объект ядра (т.е., objvuln) и оставляет его указатель (т.е., vuln_ptr) как висячий указатель ( 1 ). Далее атакующий выделяет другой объект ядра (т.е., objtarget) по адресу objvuln с помощью SysAllocTarget() ( 2 ). Затем атакующий вызывает SysTikTag() с буфером пользовательского пространства (т.е., ubuf) ( 3 ) и утекает результат проверки тегов (т.е., Tm == Tg), измеряя задержку доступа к ubuf ( 4 ). Если теги совпадают, атакующий запускает SysExploitUAF(), системный вызов, который эксплуатирует уязвимость use-after-free ( 5 ). В противном случае атакующий перераспределяет objtarget, пока теги не совпадут.

\ ==Запуск побочного канала кэша.== Как и в §6.1.3, успешная эксплуатация гаджета TIKTAG требует i) обучения ветвления, ii) управления кэшем и iii) измерения кэша. Для обучения ветвления атакующий может обучить предсказатель ветвлений и запустить спекуляцию с управляемыми пользователем условиями ветвления из пользовательского пространства. Для управления кэшем атакующий может очистить буфер пользовательского пространства (т.е., ubuf), в то время как адрес памяти ядра может быть вытеснен путем подпрыгивания строки кэша [25]. Для измерения кэша задержка доступа к ubuf может быть измерена с помощью виртуального счетчика (т.е., CNTVCT_EL0) или таймера на основе счетчика памяти (т.е., разрешение около цикла процессора).

\ ==Эксплуатация уязвимостей повреждения памяти.== Гаджеты TIKTAG позволяют обходить MTE и эксплуатировать уязвимости повреждения памяти ядра. Атакующий может вызвать гаджет TIKTAG в ядре для спекулятивного запуска повреждения памяти и получения результата проверки тегов. Затем атакующий может получить результат проверки тегов и запустить повреждение памяти только в том случае, если теги совпадают. Мы подробно описываем процесс атаки обхода MTE ядра Linux в §D.

\ ==6.2.4. Смягчение.== Для смягчения гаджета TIKTAG в ядре Linux разработчики ядра должны рассмотреть следующие меры смягчения:

i) Барьер спекуляции: Барьеры спекуляции могут эффективно смягчить гаджет TIKTAG-v1 в ядре Linux. Чтобы предотвратить утечку атакующими результата проверки тегов через буфер пользовательского пространства, функции ядра, которые обращаются к адресам пользовательского пространства, такие как copy_to_user и copy_from_user, могут быть укреплены барьерами спекуляции. Как описано в §5.1, утечка результатов проверки тегов с помощью доступа к хранилищу может быть смягчена путем размещения барьера спекуляции перед доступом к хранилищу (т.е., TEST).

\ Например, для смягчения гаджетов, использующих copy_to_user, барьер спекуляции может быть вставлен перед вызовом copy_to_user. Для гаджетов, использующих доступ загрузки к буферу пользовательского пространства, барьеры смягчают гаджеты, если вставлены между ветвлением и доступом к памяти ядра (т.е., CHECK). Например, для смягчения гаджетов, использующих copy_from_user, разработчики ядра должны тщательно проанализировать кодовую базу ядра, чтобы найти шаблон условного ветвления, доступа к памяти ядра и copy_from_user(), и вставить барьер спекуляции между ветвлением и доступом к памяти ядра.

\ ii) Предотвращение создания гаджетов: Чтобы устранить потенциальные гаджеты TIKTAG в ядре Linux, исходный код ядра может быть проанализирован и исправлен. Поскольку гаджеты TIKTAG также могут быть созданы оптимизациями компилятора, может быть проведен бинарный анализ. Для каждого обнаруженного гаджета инструкции могут быть переупорядочены или дополнительные инструкции могут быть вставлены для предотвращения создания гаджета, следуя стратегиям смягчения в §5.1 и §5.2.

:::info Авторы:

  1. Juhee Kim
  2. Jinbum Park
  3. Sihyeon Roh
  4. Jaeyoung Chung
  5. Youngjoo Lee
  6. Taesoo Kim
  7. Byoungyoung Lee

:::

:::info Эта статья доступна на arxiv по лицензии CC 4.0.

:::

\

Возможности рынка
Логотип KernelDAO
KernelDAO Курс (KERNEL)
$0.07041
$0.07041$0.07041
+0.08%
USD
График цены KernelDAO (KERNEL) в реальном времени
Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу service@support.mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.