Новая техника обхода защиты ASLR, реализуемая на JavaScript
17 февраля 2017 года
Группа исследователей из Амстердамского свободного университета разработала ( pdf 1, pdf 2) новую технику обхода механизма защиты ASLR (Address space layout randomization), позволяющую определить раскладку памяти процесса. Особенностью предложенного метода является то, что он может быть реализован на языке JavaScript, что значительно упрощает обход дополнительных уровней защиты при эксплуатации уязвимостей в web-браузерах.
По заявлению исследователей предложенный метод универсален и надёжно работает в Chrome и Firefox как минимум на 22 микроархитектурах, включая процессоры Intel Xeon, Atom, Core, Celeron (CVE-2017-5925), AMD (CVE-2017-5926), Allwinner, Samsung Exynos, NVIDIA Tegra (CVE-2017-5927 для ARM) и др. Если в обычных условиях для успешной эксплуатации новой уязвимости в Firefox требуется наличие ещё одной уязвимости, которая позволит получить сведения о ASLR-смещениях в адресном пространстве процесса, то предложенная техника позволяет выявить эти смещения путём выполнения скрипта на языке JavaScript.
Метод является разновидностью атак по сторонним каналам (side-channel attacks) и основан на косвенном определении адресов к которым ранее были обращения при обходе таблиц страниц памяти процессорным блоком MMU (Memory Management Unit) в ходе трансляции адресов виртуальной памяти в адреса физической памяти. Так как кэш CPU общий и в нём отражается как активность приложения, так и активность блока MMU, то путём оценки различий во времени доступа к данным до и после сброса кэша (разновидность атаки "EVICT+TIME") можно с высокой вероятностью подобрать адрес, по которому было обращение.
Проблема усугубляется тем, что атака основывается на аппаратных особенностях кэширования адресов в современных процессорах и с ней трудно бороться на программном уровне без отключения кэша или без выполнения манипуляций, снижающих производительность. Реализация защиты на аппаратном уровне также затруднена, так как требует создания отдельного кэша для таблиц страниц памяти.
На GitHub размещена эталонная реализация метода на языке Си. Вариант на JavaScript не опубликован с целью предотвращения появления вредоносной активности до обеспечения защиты в браузерах. Обходным путём защиты в браузерах может стать урезание доступа к высокоточному таймеру. В качестве противодействия некоторым видам атак производители браузеров ранее уже ограничили точность вызова performance.now(), но авторы исследования обошли данное ограничение через использование двух таймеров в разных потоках, совокупной точности которых оказалось достаточно.
Для полноценной защиты производителям браузеров рекомендовано переработать метод хранения JavaScript-объектов в памяти, исключив их последовательное размещение в виртуальной памяти при генерации кода JIT-компилятором. В качестве временной меры рекомендовано внести незначительные случайные смещения в работу каждого экземпляра высокоточного таймера и прекратить совместное использование значений таймера в разных потоках JavaScript. Разработчикам ОС для повышения стойкости ASLR к атаке рекомендовано увеличить уровень энтропии ASLR с 24-28 бит до 35 бит.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.