Почти десять лет назад были описаны атаки, эксплуатирующие непреднамеренный и нежелательный побочный эффект динамической памяти с произвольным доступом (DRAM), так называемый rowhammer. За это время неоднократно появлялись новые эксплойты для повышения привилегий, так или иначе использующие этот эффект. Его особенность заключается в том, что ячейки памяти электрически взаимодействуют между собой и непроизвольно могут изменять состояние своих соседей. Проблема заключается в высокой плотности современных интегральных схем. В дальнейшем были разработаны различные аппаратные методы защиты (например, target row refresh, TRR), однако по мере того как производители внедряли средства защиты, менялись и атакующие паттерны для их обхода.

Основной «ударной» силой этих атак стал двойной шаблон double-sided hammering, использующий целенаправленную активацию двух соседствующих с «жертвой» строк DRAM. Эволюция этой идеи привела к созданию фаззера Blacksmith, рвущего все существующие средства защиты практически на всех устройствах DDR4 как тузик грелку. Хотя касательно TRR вообще всё достаточно мутно, поскольку гарантии безопасности механизмов, встроенных в эту защиту, не получилось изучить в полном объёме из-за их проприетарного характера. Существует много исследований, подвергающих сомнению заверения производителей о надёжности данной защиты.

На сегодняшний день большинство предложений по полноценной защите от rowhammer либо нецелесообразны для массового развёртывания, либо недостаточны для предотвращения любых атак подобного рода.

Недавно у rowhammer был обнаружен ещё один вектор применения. Он также напрямую касается информационной безопасности, только вот совсем с другой её стороны, и речь пойдёт о конфиденциальности.

Результаты атаки можно сохранить как слепок и использовать в дальнейшем как фингерпринт или суперкуки. Чипы памяти разных производителей, как правило, имеют заметно различающиеся модели поведения под воздействием атак типа rowhammer. Поэтому эти данные можно объединить с другими пользовательскими характеристиками для идентификации конкретного устройства (такими как версия операционной системы, установленные обновления, версия браузера, cookie браузера и т. д.).

Даже невооружённым взглядом заметно, что идентичные чипы памяти одного и того же производителя, как правило, демонстрируют собственные отчётливые и обнаруживаемые шаблоны смены битов до такой степени, что отдельные из них можно однозначно распознать после повторной атаки. Пользователи настольных компьютеров редко меняют или обновляют оперативную память, а многие пользователи ноутбуков и уж тем более других мобильных устройств не могут этого сделать совсем. Поэтому такой цифровой след вполне пригоден для отслеживания и идентификации устройства даже при отсутствии большинства других данных.

Интересно, что частая смена модулей также не принесёт ничего хорошего, потому что их обнаружение становится несколько проще. Со временем модули памяти несколько меняют свои технические характеристики, и их слепки также изменяются. По иронии судьбы, модуль памяти, который со временем становится всё хуже в сопротивлении побочным эффектам переворачивания битов, по крайней мере, теоретически становится уязвимей для эксплойтов выполнения кода. Это связано с тем, что атаки будут постепенно запускать всё больше и больше переворотов битов и, таким образом, вероятно, открывать больше возможностей для эксплуатации этой уязвимости. Однако с точки зрения идентификации такой модуль станет более незаметным, потому что результат зависит от неправильного поведения чипа, которое постепенно усиливается в течение всей эксплуатации устройства.

В общем, любой фингерпринтинг использует неоднородности аппаратных и программных конфигураций для извлечения слепков устройств, а основные меры противодействия заключаются в нормализации этих атрибутов таким образом, чтобы они представляли одинаковый слепок на разных устройствах или каждый раз представляли разные слепки для одного и того же устройства.

С помощью атак в стиле rowhammer можно создавать уникальные и стабильные слепки даже на устройствах с однородными или обфусцированными аппаратными и программными конфигурациями. Поскольку в этом случае используются различия в базовых производственных процессах, приводящих к уникальным распределениям индуцированных переворотов битов в разных модулях памяти. Помимо этого использование rowhammer только для идентификации, не претендуя на привилегии суперпользователя, позволяет избежать некоторых ненужных рисков обнаружения.

Ребята из Калифорнийского университета в Дейвисе разработали программный пакет, способный проводить подобные операции — Centauri. На испытательном стенде, состоящем примерно из ста модулей DRAM, результат точности считывания слепков достиг 99,91%. При этом фингерпринты были стабильны в ежедневных экспериментах в течение 10 дней, не обнаруживая потерь в точности снятия слепков. Завидная скорость извлечения отпечатков позволяет получить рабочий слепок всего за 9,92 секунды. Так что это, пожалуй, первый практический подход к использованию атаки в стиле rowhammer для создания фингерпринтов, позволяющий эффективно и масштабно извлекать уникальные и стабильные информационные слепки устройств.

В последнее время отслеживание без сохранения состояния становится всё более актуальным в ответ на недавние контрмеры против трекинга с отслеживанием состояния с использованием cookie и идентификаторов устройств (типа, IDFA и AAID). Такое отслеживание включает в себя поиск отличительных особенностей устройства для создания слепков устройства без необходимости сохранять какое-либо состояние на стороне клиента. Чтобы его можно было использовать для трекинга, он должен обладать двумя атрибутами: уникальностью и стабильностью.

Во-первых, слепок должен иметь достаточно высокую энтропию, чтобы однозначно идентифицировать устройство в сети, а во-вторых, должен оставаться достаточно стабильным в течение длительного времени, чтобы его можно было связать с другими слепками того же устройства для повторной идентификации. Для этого существуют различные программные средства, например, широко распространенная библиотека FingerprintJS.

Фингерпринтинг подразумевает, что захваченные атрибуты меняются с течением времени и слепки требуют обновления. Эти изменения могут возникать либо в результате естественной эволюции конфигурации устройства (например, обновления программного обеспечения), либо в результате контрмер по снятию отпечатков, которые преднамеренно рандомизируют значения атрибутов на одном и том же устройстве. В любом случае с точки зрения конфиденциальности имеет смысл рассматривать наиболее сильные модели угроз, в которых слепки фиксируют фундаментальные различия в физических свойствах аппаратного обеспечения устройства, возникающих в результате технологических процессов производства CMOS. Поскольку пользователи редко модифицируют аппаратное обеспечение своего устройства, эти отпечатки остаются наиболее стабильными.

Атака в стиле rowhammer приводит к переворачиванию битов в соседних строках памяти, а вот модель этого обращения уже может быть использована для создания отпечатка устройства, так как паттерн переворотов достаточно уникален и стабилен для однозначной идентификации вычислительных устройств. 

Операционные системы ограничивают доступ к выделению и распределению памяти без привилегий суперпользователя, а эти ограничения не позволяют снимать местоположение битовых переворотов без напильника и бубна. Однако никому и не нужен доступ ко всей памяти, для однозначной идентификации достаточно снятия распределения перестановок битов в смежных двухмегабайтных фрагментах памяти (самый большой непрерывный фрагмент, который может быть надёжно выделен без использования административных привилегий), так как оно уже является уникальным и постоянным.

Также в модулях памяти реализованы средства защиты от rowhammer, такие как уже упомянутое TRR, и для успешного фингерпринта эти средства надо как-то обойти.

Ну что же, теперь подробней.

Основы DRAM

Все технологии DRAM следуют типовым базовым архитектурам. В этой статье разговор пойдёт о пакетах DRAM на основе DIMM для простоты тестирования, но полученные результаты применимы и к другим методам упаковки. Каждый физический модуль памяти DRAMDual Inline Memory Module (DIMM) устанавливается на канал DRAM на материнской плате. Каналы позволяют выполнять одновременные запросы к нескольким модулям DIMM. Каждый отдельный модуль DIMM содержит несколько микросхем, которые равномерно разделены на логические структуры (банки). Банк представляет собой двумерный массив ячеек, организованных в строки и столбцы. Каждая ячейка содержит конденсатор и транзистор доступа, при этом заряженное состояние конденсатора соответствует одному биту. Количество ячеек в столбце определяется шириной (x8, x16 и т. д.) модуля DIMM. Каждая строка модуля DIMM DDR4 содержит 65 536 конденсаторов. Количество структур и описывает геометрию модуля DIMM.

Контроллер памяти выдаёт команды DRAM для выполнения операций с памятью с точностью до строки. Команда ACT активирует строку, загружая её в буфер строк перед чтением или записью в неё. Команда PRE деактивирует строку и подготавливает буфер строк для загрузки другой строки путём восстановления ранее сохраненных значений. Контроллер памяти также периодически выдает команды REFI, которые обновляют заряд, удерживаемый конденсаторами, поскольку со временем заряд естественным образом истощается. Каждый конденсатор DRAM обычно обновляется не реже одного раза в 64 миллисекунды.

А теперь «долбанём» молотом

Современные модули DIMM подвержены повреждению памяти в результате электрических помех между ячейками. И атака искажает данные, хранящиеся в некоторых конденсаторах, что приводит к переворачиванию битов в памяти. В частности, инициируется перестановка битов по определённому адресу, многократно обращаясь к соседним адресам. Это приводит к повторной активации и деактивации строк, содержащих адреса, к которым осуществляется доступ. Возникающая в результате электромагнитная связь между агрессивными строками, к которым осуществляется доступ и соседними с ними строками-жертвами, ускоряет скорость рассеивания заряда конденсаторов в строках-жертвах. Как только эти конденсаторы потеряли достаточное количество заряда, обновление DRAM не может восстановить их значение, что приводит к повреждению памяти. Технология TRR смягчает последствия rowhammer. Хотя существуют различные её реализации, все они по существу отслеживают доступ к памяти для идентификации строк-агрессоров и выдают дополнительные обновления для связанных строк-жертв.

Скорость, с которой конденсатор теряет свой заряд, зависит от его физических свойств, отличающихся из-за особенностей технологических процессов. В результате распределение потерь конденсаторов также зависит от конкретного атакуемого чипа. В основной модели угроз сканер отпечатков запускает код на устройстве пользователя. Пользователи либо запускают приложение, либо посещают веб-сайт, содержащий SDK/библиотеку для снятия слепков.

Так что там за Centauri

На верхнем уровне Centauri инициирует перевороты битов на нескольких смежных участках памяти на устройстве пользователя и использует распределение сработавших переворотов в качестве фингерпринта. Дальше используется метрика для сравнения слепков, извлечённых ранее, чтобы определить, выполнялись ли сеансы на этом устройстве. Работа программы состоит из трёх этапов, а именно: создание паттерна атаки, rowhammering (собственно сама атака) и сопоставление:

  • на этапе подготовки шаблона атаки ищутся способы обхода защиты устройства от rowhammer,

  • на этапе атаки выполняется код на устройствах пользователей и запускается переворот битов, после чего создаётся распределение вероятностей для более надёжной идентификации слепка,

  • на этапе сопоставления сравнивается фингерпринт, извлечённый с устройства пользователя, с другими эталонными отпечатками, чтобы идентифицировать устройство. Для поддержания актуальности данных текущий слепок обновляется в базе.

Измерение энтропии и продолжительности атаки

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

В тесте программы измерялась фактическая энтропия в наборе из 3611 фрагментов в 36 модулях DIMM. Как я уже писал выше, для работы использовались блоки размером 2 МБ, так как это самый большой непрерывный блок памяти, который можно надёжно получить от операционной системы, не требуя привилегий суперпользователя. Перевороты битов уникальны для разных фрагментов и, несмотря на недетерминированное поведение, сохраняются в каждом фрагменте.

Теоретический энтропийный анализ

Если учесть, что на планете существует примерно триллион модулей DIMM, причём каждый модуль DIMM состоит примерно из 10 банков, а каждый банк примерно из 100k строк, в общей сложности будет 1018 возможных строк. Потребуется примерно log2(1018) = 59,79 ≈ 60 бит энтропии для представления всех этих строк. Поскольку строки в модулях DRAM DIMM обладают более высокой степенью детализации, чем количество модулей DIMM (и, соответственно, количество устройств), 60 бит энтропии будет достаточно для представления всех устройств на планете.

Каждая строка модуля DRAM DIMM содержит 65 536 конденсаторов. Если процесс приводит к тому, что rowhammer запускает ровно один переворот бита в строке, можно идентифицировать количество строк, эквивалентное 16 битам энтропии и достаточное для представления всех возможных строк во всех модулях DIMM. Сплошная оранжевая линия на графике показывает количество энтропии, доступное для представления всех строк с различным числом переворотов битов, наблюдаемых в каждой строке, а пунктирная оранжевая линия показывает требуемую энтропию. Из графика видно, что переворота 5 бит в строке (т. е. 73 бита энтропии) вполне достаточно для представления всех возможных строк.

Анализ, представленный до сих пор, ограничивает нас наблюдением за переворачиванием битов только в пределах одной строки, однако с непрерывным двухмегабайтным фрагментом памяти можно получить доступ к нескольким строкам из каждого банка. Например, в случае двухранговых модулей памяти с разрядностью в 8 бит, непрерывный двухмегабайтный блок памяти соответствует набору из 8 последовательных рядов (что-то около 524 288 конденсаторов) в каждом банке. В этом случае потребуется 57-битная энтропия для представления всех фрагментов во всех модулях DIMM. Так получается, что достаточно всего 4 битов (71 бит энтропии).

Поскольку смежные фрагменты памяти чередуются между банками, можно получить доступ к этим последовательным строкам во всех банках. Если мы рассмотрим все 16 777 216 конденсаторов, разбросанных по всем банкам в блоке, мы увидим, что 3 переворота битов дают 54 бита энтропии, а этого уже вполне достаточно для представления всех фрагментов в триллионе модулей DIMM. Серая и синяя сплошные линии на графике показывают изменение энтропии при различном количестве переворотов битов. Пунктирные линии одного цвета показывают требуемую энтропию в обоих случаях. Таким образом, анализ показывает, что распределение переворотов битов, запускаемых rowhammer, в отдельных двухмегабайтных смежных фрагментах памяти потенциально уникально, даже если произойдёт всего 5 переворотов битов. 

Эмпирический энтропийный анализ полностью подтвердил теоретические выкладки. Однако перевороты битов не являются детерминированными, и в результате простого измерения энтропии распределения переворотов недостаточно для извлечения надёжного отпечатка памяти. Поэтому исследователи обратились к распределениям переворотов битов при повторных измерениях одних и тех же фрагментов в модулях памяти.

Во время эксперимента на тестовом стенде было проанализировано в общей сложности 3611 фрагментов. В 99,77% из них произошел, по крайней мере, один переворот битов, и их количество варьировалось от 1 до 1799 битовых переворотов, в среднем 711 битовых переворотов на фрагмент. Во всех сработавших фрагментах на тестовом стенде 12 битов энтропии соответствует максимально возможной нормализованной энтропии, что демонстрирует, что каждый фрагмент имеет уникальный набор битовых переворотов. Экстраполяция результатов, основанная на среднем значении 711 переворотов битов на фрагмент, даёт более 7700 бит энтропии, что значительно выше, чем 60 бит, необходимых для представления таких фрагментов на триллионе модулей памяти. Таким образом, можно сделать однозначный вывод о том, что каждый непрерывный блок памяти размером 2 МБ имеет уникальный набор битовых переворотов при атаке rowhammer.

Чтобы использовать эти результаты в качестве отпечатков памяти недостаточно гарантированно высокой энтропии в разных фрагментах, если только они также не будут сохраняться в одном и том же фрагменте. При проведении повторной инициализации областей с теми же данными и повторной обработке результатов было замечено, что нет никакой гарантии, что тот же самый бит изменится. Другими словами, биты, которые переворачиваются внутри данного фрагмента, не детерминированы. Таким образом, нельзя стопроцентно повторно идентифицировать конкретный фрагмент, просто используя установленную метрику подобия, такую как коэффициент Жаккара.

Было принято решение вычислять распределение вероятностей для перестановки битов в каждом фрагменте и сопоставлять сходство распределений для идентификации фрагментов. Чтобы извлечь распределение вероятностей переворотов, атака проводилась несколько раз, а после этого для вычисления сходства распределений использована дивергенция Йенсена-Шеннона. На рисунке ниже сравнение распределений для трёх случайно выбранных фрагментов из трёх разных модулей DIMM при трёх разных попытках взлома. Наблюдается сходство распределений вероятностей, рассчитанных для одного и того же фрагмента.

Итак, биты обладают разной вероятностью переворота, однако распределение вероятностей уникально для смежных двухмегабайтных фрагментов памяти и сохраняется в пределах каждого из них.

Эффективность, количественно определяемая временем, необходимым для создания фингерпринтов, является ещё одним важным показателем для оценки метода снятия слепков, так как он должен отрабатывать за относительно короткое время, чтобы оставаться практичным.

Что делать и стоит ли волноваться?

Итак, программный пакет Centauri может извлекать высокоэнтропийные и стабильные фингерпринты памяти с точностью около 99,91%, будучи надёжным и эффективным. Эта в некотором роде уязвимость фундаментальна и зависит от утечки электрического заряда, возникающей из-за малого размера и непосредственной близости конденсаторов в современных чипах памяти. Несмотря на существующие меры безопасности, вероятность усиления этой уязвимости будет увеличиваться по мере роста плотности микросхем и в будущем.

Тем не менее, кажется, что не следует рвать волосы на голове и посыпать её пеплом. В конце концов, чтобы это работало необходимо как-то запускать исполняемый код, требующий достаточно низкоуровневого системного доступа. Однако не стоит забывать о том, что это в принципе возможно, а так как самая уязвимая дыра безопасности устройства находится между монитором и спинкой кресла, не стоит недооценивать выявленной угрозы.


НЛО прилетело и оставило здесь промокод для читателей нашего блога:
-15% на заказ любого VDS (кроме тарифа Прогрев) — HABRFIRSTVDS

Комментарии (0)