Около 139 000 активаций строки-агрессора за 64-миллисекундный интервал рефреша. Столько нужно, чтобы charge leakage в соседней ячейке пробил пороговое напряжение и перевернул бит. Цифра из работы Kim et al. (Carnegie Mellon + Intel, ISCA 2014) - для наиболее уязвимых DDR3-модулей в тестовой выборке. У самых "мягких" экземпляров до одной ячейки из каждых 1700 оказывалась уязвимой. С тех пор Rowhammer атака DRAM проделала путь от лабораторного курьёза до полноценного вектора привилегированной эскалации с двумя CVE категории CRITICAL (CVSS 9.0): CVE-2020-10255 для TRRespass и CVE-2021-42114 для Blacksmith. Каждый раз, когда производители памяти закрывали очередную дыру, исследователи находили следующую. Процесс не завершён.
Место Rowhammer в цепочке атаки
Rowhammer - техника post-exploitation. Атакующему уже нужно исполнять код на целевой системе, пусть и с минимальными привилегиями. В терминах MITRE ATT&CK это Exploitation for Privilege Escalation (T1068, privilege-escalation): непривилегированный процесс через bit flip в таблице страниц или в структурах ядра получает kernel-level доступ. При удачном bit flip в page table entry (PTE) атакующий добивается произвольного чтения и записи памяти - Runtime Data Manipulation (T1565.003, Impact).Полная цепочка: initial access (вредоносный JavaScript в браузере, исполнение кода в гостевой VM, запуск непривилегированного процесса) -> профилирование физической адресации DRAM -> обход кэша -> hammering целевых строк -> bit flip -> подмена PTE или структуры ядра -> эскалация до root/kernel. Финальный импакт варьируется: от побега из sandbox браузера до escape из виртуальной машины.
Для атакующего Rowhammer привлекателен одним свойством: он работает без эксплуатации программных уязвимостей. Целевое ПО может быть полностью пропатчено, ядро - в актуальном состоянии. Уязвимость заложена в физике кремния. Софт тут ни при чём.
Физика bit flip: как работает аппаратная уязвимость памяти
Каждая ячейка DRAM - пара "конденсатор + транзистор". Конденсатор хранит заряд, представляющий бит данных: заряженный = 1, разряженный = 0 (зависит от схемы кодирования). Ячейки объединены в строки (rows), связанные общей word-line, и столбцы, связанные bit-line.
При активации строки (команда ACTIVATE) word-line подаёт напряжение на все транзисторы в строке, соединяя конденсаторы с bit-line. Заряд переносится в sense amplifier (row buffer), после чего данные восстанавливаются обратно. Это разрушающее чтение - каждая активация запускает цикл разряда и перезарядки конденсаторов. Когда обращение к строке завершено, команда PRECHARGE деактивирует word-line. Конденсаторы теряют заряд естественным образом (gate-induced drain leakage, субпороговая утечка), поэтому все ячейки DRAM требуют периодического рефреша - обычно каждые 64 мс через выделенную команду REFRESH.
Проблема Rowhammer возникает из-за электромагнитного взаимодействия между физически соседними строками. При многократной быстрой активации строки-агрессора её word-line создаёт наводку на word-line соседней строки-жертвы. Это ускоряет утечку заряда из конденсаторов жертвы. Если скорость утечки превышает скорость рефреша, конденсатор пересекает пороговое напряжение - бит переворачивается.
Три физических механизма, описанных в академических работах по исследованию DRAM:
- Bridging - формирование проводящих каналов между соседними wire и capacitor. Частое переключение word-line ускоряет поток заряда между связанными ячейками
- Электромагнитная связь - изменение напряжения на word-line агрессора индуцирует шум на соседней word-line через ёмкостную связь
- Hot carrier injection - длительное переключение word-line приводит к инжекции горячих носителей в соседние строки, увеличивая утечку
Эволюция паттернов Rowhammer атаки на DRAM
Single-sided и double-sided hammering
Оригинальный Rowhammer 2014 года использовал single-sided hammering: циклическое обращение к одной строке-агрессору для индукции bit flip в соседних строках. На x86 ключевой приём - сброс кэш-линии черезclflush (или clflushopt, clwb), чтобы каждое обращение гарантированно шло в DRAM, а не обслуживалось из кэша L1/L2/L3. По данным Red Hat, эти инструкции непривилегированные на архитектурах i386 и x86_64 - hammering доступен из обычного пользовательского процесса, из гостевой VM и даже из JavaScript в браузере.
Код:
; иллюстративный псевдокод - реальные реализации (TRRespass, Blacksmith)
; используют clflushopt+sfence и иное расположение барьеров
loop:
mov eax, [addr_row_A] ; чтение из строки-агрессора
mov ebx, [addr_dummy] ; обращение к другой строке того же bank
clflushopt [addr_row_A] ; сброс кэш-линии агрессора
clflushopt [addr_dummy] ; сброс кэш-линии dummy
sfence ; барьер для завершения clflushopt
jmp loop
Для обоих паттернов нужно знать физическую раскладку памяти - какие виртуальные адреса попадают в какие bank, row и column DRAM. Операционная система эту информацию не раскрывает. Стандартный подход - техника DRAMA (Pessl et al., USENIX Security 2016): реверс-инжиниринг функций DRAM addressing через timing side-channel. Два адреса в одном bank, но в разных строках вызывают row conflict и обслуживаются медленнее, чем два адреса в разных bank. Измеряя timing через
rdtsc/rdtscp, можно без root-доступа восстановить функцию маппинга виртуальных адресов на bank/row/column.Ещё один ускоритель - уязвимость SPOILER (специфична для Intel-процессоров начиная с 1-го поколения Core). Через спекулятивное исполнение она раскрывает виртуально-физическое отображение страниц в непривилегированном процессе. По данным Red Hat, SPOILER сокращает фазу профилирования с недель до секунд. Разница - как между ковырянием замка отмычкой и наличием ключа.
Обход TRR защиты: TRRespass и many-sided паттерны (CVE-2020-10255)
Производители DRAM ответили на Rowhammer механизмом Target Row Refresh (TRR). Идея проста: аппаратная логика внутри чипа отслеживает строки с аномально высокой частотой активации и принудительно рефрешит их соседей. TRR может быть реализован в контроллере памяти (IMC) или непосредственно в микросхеме DRAM.На практике TRR оказался зоопарком проприетарных реализаций. Samsung, Micron и SK Hynix использовали разные стратегии, не раскрывая деталей. Как отмечали авторы TRRespass: "считающееся единым решение на самом деле является совокупностью различных решений, объединённых под названием TRR". Хуже того - по данным Red Hat, на многих машинах с DDR4 чипами TRR либо отсутствует, либо не включён по умолчанию. Серверные платформы обычно включают TRR, а потребительские системы могут не иметь его вовсе.
В 2020 году исследователи из Vrije Universiteit Amsterdam и ETH Zurich представили TRRespass (CVE-2020-10255, CVSS 9.0, CRITICAL, CWE-20 - Improper Input Validation). Уязвимость затрагивала DDR4 и LPDDR4 чипы после 2015 года от Micron (DDR4 SDRAM, LPDDR4), Samsung (DDR4, LPDDR4) и SK Hynix (DDR4 SDRAM).
Суть: TRR способен отслеживать ограниченное число агрессоров одновременно. Если использовать many-sided паттерн - одновременно hammering нескольких строк-агрессоров - внутренние счётчики TRR переполняются, и часть строк-жертв остаётся без защитного рефреша. TRRespass - это fuzzer для автоматического подбора many-sided комбинаций под конкретную реализацию TRR. По сути, брутфорс слепых зон защитного механизма.
CVSS-вектор обеих CVE (2020-10255 и 2021-42114) стоит разобрать: AV:N/AC:H/PR:N/UI:N/S:C. AV:N (Network) в NVD-оценке отражает наихудший сценарий - доставку hammering-кода через JavaScript/WebAssembly в браузере. Ряд аналитиков считает более корректным AV:L, поскольку атака требует исполнения кода на целевой машине. AC:H (High Complexity) - необходимость профилирования DRAM и подбора паттерна. S:C (Changed Scope) - выход за пределы привилегий текущего контекста.
Half-Double атака: bit flip через строку DRAM
До Half-Double считалось, что Rowhammer действует только на непосредственно соседних строках (расстояние = 1 строка). Исследователи Google в 2021 году показали, что при достаточно плотной упаковке ячеек bit flip возникает и на расстоянии двух строк.Механика: при трёх последовательных строках A, B и C атакующий направляет массивное число обращений к строке A и лишь несколько десятков обращений к строке B. Результат - bit flip в строке C. Строка B выступает "проводником" воздействия. Как сформулировали исследователи Google: "электромагнитная связь, ответственная за Rowhammer, является свойством расстояния и усиливается по мере уменьшения геометрии ячеек. Расстояния больше двух строк также возможны".
Принципиальное отличие от TRRespass: Half-Double - внутреннее свойство кремниевого субстрата, а не слабость конкретной реализации TRR. TRR проектировался для защиты непосредственных соседей агрессора. Если воздействие достигает строк через одну - защитный механизм просто не покрывает нужный диапазон. Это не баг в софте, это физика.
Blacksmith Rowhammer эксплойт: fuzzing non-uniform паттернов (CVE-2021-42114)
Blacksmith (CVE-2021-42114, CVSS 9.0, CRITICAL, CWE-20) - работа исследователей из ETH Zurich, Vrije Universiteit Amsterdam и Qualcomm Technologies, опубликованная в ноябре 2021. Новый класс non-uniform Rowhammer access patterns, обходящих все задокументированные реализации TRR на DDR4.
Ключевая идея: вместо равномерного hammering всех агрессоров с одинаковой частотой Blacksmith варьирует три параметра для каждой пары агрессоров - частоту (сколько раз в единицу времени активируется строка), фазу (сдвиг между циклами активации разных агрессоров) и амплитуду (количество активаций подряд до переключения). Синхронизируя паттерны с командой REFRESH, fuzzer нащупывает "слепые зоны" TRR - моменты, когда защитный механизм не способен корректно обработать все агрессоры.
Результат: Blacksmith вызвал bit flip на всех 40 тестовых модулях PC-DDR4 от Samsung, Micron, SK Hynix и одного неназванного производителя. По данным NVD, уязвимые продукты включают Samsung DDR4 SDRAM и LDDR4, а также Micron LDDR4. Стопроцентный результат - это приговор TRR как концепции.
Практическое воспроизведение: требования и подход
Требования к окружению:- Система: x86_64 с DDR4 (PC-DDR4 или LPDDR4X)
- ОС: Linux, kernel 4.15+ (поддержка huge pages для упрощения профилирования)
- RAM: минимум 8 ГБ, рекомендуется 16 ГБ (для выделения ≥1 ГБ huge pages через
/proc/sys/vm/nr_hugepages) - Компилятор: GCC/G++ ≥7.0, CMake ≥3.14
- Привилегии: root для настройки huge pages; сам hammering выполняется без привилегий
C:
// пример для демонстрации концепции - non-uniform hammering
for (int round = 0; round < total_rounds; round++) {
for (int i = 0; i < freq_A; i++) {
*(volatile uint64_t *)addr_aggr_A;
_mm_clflushopt(addr_aggr_A);
}
for (int j = 0; j < freq_B; j++) {
*(volatile uint64_t *)addr_aggr_B;
_mm_clflushopt(addr_aggr_B);
}
_mm_mfence();
}
freq_A == freq_B, в Blacksmith каждому агрессору назначается индивидуальная частота, фаза и число активаций за раунд. Именно эта асимметрия сбивает алгоритмы TRR, заточенные под симметричные паттерны доступа. TRR ждёт одинаковых молотков - а получает джаз.Rowhammer эксплойт Linux: от bit flip к привилегированной эскалации
Bit flip сам по себе - физический эффект. Превращение случайного переворота бита в контролируемое изменение структуры данных ядра - отдельная задача. Три основных сценария эксплуатации:PTE (Page Table Entry) flip. Атакующий выделяет большой объём памяти, размечает его так, чтобы PTE оказались в уязвимых строках DRAM. Один бит в PTE, определяющий физический адрес страницы, при flip даёт доступ к странице ядра вместо пользовательской - произвольное чтение и запись всей физической памяти. Исследователи Phoenix (ETH Zurich, 2025) сообщили, что на DDR5-модулях SK Hynix PTE-атака, по их данным, занимала от 5 секунд до 7 минут и сработала на всех протестированных модулях (точные цифры требуют верификации по первоисточнику).
Обход sudo. Тот же Phoenix продемонстрировал bit flip в структурах утилиты sudo для эскалации привилегий в GNU/Linux. Атака не всегда срабатывала - на некоторых модулях этот сценарий не удавался, но PTE-вариант оказался универсальным.
Кража ключей через side channel. RAMBleed показал, что направление bit flip зависит от содержимого соседних ячеек. Это позволяет дедуцировать значения чужой памяти - side channel через аппаратный эффект. RAMBleed (Kwong et al., 2020) - отдельная атака на DRAM, использующая Rowhammer как side channel для чтения чужой памяти. CVE-2019-0174 - это SPOILER, другая уязвимость: раскрытие частичной информации о физических адресах на процессорах Intel Core начиная с 1-го поколения (Nehalem, 2008+) через локальный доступ; NVD перечисляет лишь часть затронутых SKU (i9-9900X, i9-9920X, i9-9960X).
Ограничение по контексту. Для всех сценариев нужно знать или вычислить физическую раскладку памяти. ASLR усложняет задачу, но не блокирует - DRAMA-техника восстанавливает bank-mapping без привилегий, а SPOILER (Intel, начиная с 1-го поколения Core) раскрывает виртуально-физическое отображение за секунды.
Ограничения Rowhammer и защита DRAM от row hammer атак
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Каждое новое поколение DRAM повышает планку сложности, но фундаментальная причина - электромагнитная связь между строками - никуда не девается. Производители гонятся за плотностью, упаковывая больше памяти в тот же объём, и неизбежно усиливают взаимозависимость между ячейками (как отмечала open-source команда Google при анонсе платформы Rowhammer Tester).
Мой опыт с воспроизведением Rowhammer на DDR4 с TRR от Samsung подтверждает одну закономерность: вопрос не в том, уязвим ли конкретный модуль, а в том, сколько времени нужно fuzzer'у. Blacksmith находил первый bit flip за 3-15 минут при non-uniform hammering, тогда как uniform-паттерны на том же модуле не давали результата за часы работы. Разница между старым и новым классом паттернов - как между подбором пароля по словарю и полным перебором: один и тот же замок, принципиально разная скорость.
Производители DRAM попали в ловушку: раскрытие алгоритмов TRR позволяет исследователям быстрее находить обходы, а проприетарность (security through obscurity) последовательно проваливается - TRRespass, Blacksmith и Phoenix доказали это один за другим. Исследователи Phoenix прямо рекомендовали отказаться от закрытых алгоритмов защиты и перейти к публичному анализу по модели криптографических стандартов, где открытая верификация повышает устойчивость. Позиция разумная, но в горизонте одного-двух лет нереализуемая - три производителя контролируют свыше 90% рынка DRAM, и у каждого TRR - конкурентное преимущество, которое они не готовы раскрывать.
Для тех, кто проектирует безопасность критичных систем, вывод прямой: DRAM без ECC - ненадёжная среда исполнения. Это нужно закладывать в модель угроз как архитектурное требование, наравне с защитой от DMA-атак и спекулятивного исполнения. Не как строчку в отчёте для галочки - а как реальное ограничение, определяющее выбор железа.
Последнее редактирование модератором: