Еще несколько дней назад недавно обнаруженный недостаток в современных микросхемах памяти был просто тревожным любопытством — изменение некоторых битов в одном месте определенным образом могло привести к тому, что другой отдельный бит изменит его состояние. Теперь исследователи Google показали, что это можно использовать для получения привилегий ядра.
Микросхемы памяти в течение некоторого времени упаковывают все больше и больше битов в одно и то же пространство, и мы склонны думать, что когда мы сохраняем битовый шаблон, он остается в памяти. Если вы немного разбираетесь в оборудовании, вы можете знать, что биты могут случайным образом переключаться из одного состояния в другое. Обычная причина — космический луч, который проходит через чип. Системы корпоративного класса часто используют память ECC с кодом исправления ошибок, которая обычно может исправлять однобитовые ошибки и обнаруживать двухбитовые ошибки. Однако на многих машинах нет функции обнаружения ошибок (четности), не говоря уже о коррекции ошибок.
Однако последние воспоминания высокой плотности восприимчивы к шаблонам доступа, которые могут привести к переворачиванию несвязанного бита — космические лучи не нужны. Причина в том, что DRAM организована в ряды ячеек памяти, и они становятся все ближе друг к другу. Немного хранится в виде небольшого заряда, который со временем утекает. Это причина того, что DRAM необходимо обновить, то есть вы читаете бит до того, как он полностью распался, и записываете его заново.
Было обнаружено, что возможно, что чтение из двух мест многократно может вызвать перевороты битов в третьем просто из-за утечки заряда между строками.
Итак, что вы делаете:
code1a:
mov (X),% eax // Читаем с адреса X
mov (Y),% ebx // Читаем с адреса Y
clflush (X) // Очистить кеш для адреса X
clflush (Y) // Очистить кеш для адреса Y
jmp code1a
Он считывает данные из двух местоположений X и Y миллионы раз, и, если адреса выбраны правильно, это приводит к переворачиванию бита в другой строке. Два адреса должны находиться в разных строках, и каждое чтение приводит к считыванию и сбросу всей строки перед обновлением до исходного состояния.
Два адреса должны быть в разных строках, потому что, если бы они были в одной строке, второй и последующие обращения просто прочитали бы буфер строки без обновления. С адресами в разных строках необходимо выполнить многократное считывание и обновление. Это электрическое возмущение может вызвать перевороты битов в соседних строках.
Восприимчивость к ударному молотку для DRAM DD3 от трех производителей (A, B и C)
По сути, это механизм, который был обнаружен в конце прошлого года группой исследователей из Университета Карнеги-Меллона и Intel Labs.
Это интересное и тревожное открытие, но идея о том, что оно может быть использовано злонамеренно, кажется надуманной. В худшем случае программа может внести в память машины «случайные» битовые ошибки, которые не были обнаружены или исправлены оборудованием.
Как можно использовать переворачивание одного бита для практической атаки, когда так сложно контролировать, какой бит переворачивается?
Отсюда неожиданное заявление Марка Сиборна и Томаса Дуллиена из команды Google Project Zero о том, что они не только практично, но и продемонстрировали эксплойт. Ключевыми проблемами, которые они решают, является выбор физического адреса.
Адреса, которые вы используете в программе, сопоставляются аппаратным обеспечением отображения памяти на реальные физические адреса. Если вы хотите настроить таргетинг на физические адреса в разных строках DRAM, вам необходимо знать отображение. Команда Project Zero предлагает различные подходы, начиная с попытки случайных адресов, времени доступа к памяти, чтобы определить, находятся ли они в одной или разных строках, и так далее. В конце концов они решили угадать расположение памяти и использовали схему под названием «двойной удар»:
для атаки на адрес x адрес молотка x + 256k и x-256k
Чтобы попытаться использовать это, команда написала собственный процесс и программу NaCl, работающую в песочнице Chrome.
Особого внимания заслуживает эксплойт NaCL. Программа динамически устанавливает 250 МБ непрямых последовательностей переходов, которые предназначены для безопасных адресов внутри песочницы и, следовательно, разрешены. Затем он обрабатывает область динамического кода и ищет перевороты битов, которые изменяют косвенные переходы, чтобы их можно было использовать для вызова кода оболочки, скрытого в проверенном коде NaCl.
Хорошей новостью является то, что этот эксплойт уже был устранен путем запрета команды Clfush в коде NaCl, но могут быть и другие способы реализации rowhammer.
Вторая атака заключается в том, что строка забивает запись в таблице страниц, заставляя ее указывать на физическую страницу, содержащую таблицу страниц атакующего процесса. Это более обобщенная атака, потому что она использует тот факт, что как только вы нашли бит, который вы можете перевернуть, он будет повторяемым, и это означает, что вы можете определить, какие битовые перевороты полезны, и использовать только их.
Идея состоит в том, чтобы заполнить память таблицами страниц, а затем забить память. Затем вы проверяете, были ли какие-либо таблицы страниц в памяти приняты системой в качестве действительных таблиц страниц, проверяя, указывают ли они на что-то новое. Если он найден, то процесс имеет доступ к таблице страниц и, следовательно, может получить доступ к любой ячейке памяти.
Фактические детали, как и следовало ожидать, немного сложнее, и возникает вопрос, что лучше всего делать с таблицей страниц, которой вы владеете, но, по сути, у вас есть машина в вашей власти.
Команда Project Zero протестировала 29 ноутбуков разного возраста с разной памятью DRAM, все с памятью DDR3, и обнаружила, что примерно на половине из них можно установить бит Rowhammer. Существует инструмент для тестирования Rowhammer-Test, который вы можете использовать для тестирования своих машин, если вы обеспокоены или просто любопытны. В сообщении блога представлены некоторые способы избежать атаки Rowhammer, но в основном это связано с заменой оборудования.