На днях по специализирующимся на «железе» айтишным изданиям промелькнуло сообщение, оставшееся, в общем, незамеченным широкой публикой: чипы оперативной памяти DDR4 — новейший стандарт, только вводимый в обращение — подвержены хакерской атаке Rowhammer, обнаруженной ранее на DDR3. То, что известие это осталось незаметным, не удивляет: слишком много в нём незнакомых терминов даже для сведущего в технике человека, да и все эти паникёрские вбросы про катастрофические ошибки и атаки уже порядком утомили даже следящих за ними людей. Всё это так, но в данном случае за сереньким фасадом скрывается интереснейшая история одного из самых необыкновенных компьютерных багов всех времён — и, право, она стоит того, чтобы её рассказать и послушать!
Но прежде давайте сделаем экскурс в технологию компьютерной памяти. Несмотря на то, что со времён выпуска первых микросхем RAM (начало 70-х, Intel) сменилось бесчисленное множество стандартов, а миниатюризация шагнула невероятно далеко, принцип, на котором основана оперативная память, не поменялся по сей день. Это так называемая динамическая память с произвольным доступом (DRAM), изобретённая IBM в 60-х. Устроена она очень просто (в чём и залог её успеха): каждый бит информации хранится в ячейке, образованной из конденсатора (собственно, единица памяти) и транзистора (играющего вспомогательную роль). Конденсатор постепенно теряет заряд, поэтому необходимо периодически его пополнять, прикладывая к ячейке электрическое напряжение. Этот процесс называется регенерацией и производится в современных цифровых устройствах каждые несколько десятков миллисекунд.
Важно знать и другую особенность DRAM. На уровне микросхемы любые операции (т.е. регенерация, запись и чтение; кстати, чтение из DRAM по сути не отличается от записи, потому что требует, чтобы содержимое ячейки было перезаписано) производятся не побитно, а построчно, причём, в зависимости от объёма конкретного чипа, строка может содержать десятки тысяч бит. Когда процессору нужно содержимое произвольной ячейки, он отправляет контроллеру памяти её адрес — тот разбивается на адрес строки и столбца, потом нужная строка копируется в промежуточный кэш и уже там выбирается нужная ячейка. Само собой, чтение и запись тоже предполагают приложение напряжения к строке.
И вот тут мы подходим к главному. Оказалось, что если достаточно быстро обращаться к одной строки, паразитные токи, возникающие в соседних строках, могут вызвать случайные изменения некоторых ячеек. Некоторые источники утверждают, что эффект этот (называвшийся до последнего времени DRAM disturbance error) был обнаружен ещё в начале 70-х, когда и были приняты первые меры для его минимизации (вроде улучшенной изоляции строк на чипах памяти друг от дружки). На какое-то время это помогло, потому что плотность размещения ячеек тогда ещё не была близка к физическим ограничениям полупроводников. Однако во втором десятилетии XXI века проблема всплыла вновь.
Я здесь немного сокращу таймлайн, но в целом события развивались следующим образом. Года три назад кто-то из исследователей обнаружил, что чипы DDR3 подвержены уже забытой проблеме. Тогда же она получила и своё современное имя: Row Hammer (букв. молоток для строк). Алгоритм остался совершенно тем же: если очень быстро и достаточно долго (время варьируется от нескольких минут до нескольких часов) обращаться к одному участку памяти, в соседних с ним могут происходить непредсказуемые изменения. Желаете проверить свою машину? Соответствующая опция встроена в Memtest86, есть и Linux-утилита от Google; но действуйте осторожно, прочтите инструкцию и предупреждения!
Лёгкая паника, охватившая тогда производителей, будет понятна, если вспомнить, что принципиально изменилось в компьютерной технике с 70-х годов: появилась защита памяти. Древние компьютеры не умели изолировать программы друг от друга в оперативной памяти, так что ошибка одной часто приводила к краху всей системы. Сегодня же приложения изолируются от соседей, и это — один из основополагающих механизмов, который делает возможным построение надёжных многозадачных многопользовательских сред. Однако вот незадача: «на страже» памяти стоит процессор и операционная система, Rowhammer же действует уровнем ниже — и ему на защиту наплевать!
Ещё в начале прошлого года исследователи продемонстрировали это практически — показав, как можно использовать RH для несанкционированного поднятия привилегий в современных ОС. А прошлым летом был сделан и следующий шаг: показана возможность проведения атаки RH не программой в машинных кодах, а скриптом на Javascript, исполняющимся в браузере! Попросту говоря, возникла реальная угроза пандемии вредоносных программ, эксплуатирующих Rowhammer. И противопоставить ей как будто бы нечего!
Вопрос защиты от Rowhammer и вправду трудный. Если коротко, способы предотвращения атаки есть, но не без побочных эффектов. На уровне программного обеспечения обнаружить RH сложно, почти невозможно. Необходимо противопоставить что-то на уровне аппаратном. А там до последнего времени методов было два. Во-первых, увеличить частоту регенерации оперативной памяти. Это действительно снизит вероятность случайных сбоев, но и сильно ударит по производительности системы и энергопотреблению. Во-вторых, положиться на механизм встроенной автоматической коррекции ошибок (ECC), имеющийся в чипах памяти для серверов. К сожалению, ECC корректирует чаще всего только искажения одного бита на каждое 64-битное слово, тогда как RH вызывает «мутации» сразу во множестве ячеек.
Надежду дала появившаяся в DDR4 «умная» регенерация. Попросту, контроллер памяти следит, к каким строкам обращались, и старается подзаряжать в первую очередь строки соседние с ними. Однако, возвращаясь к тому, с чего мы начали, тесты на «живых» системах с DDR4 показали, что и это не помогло. Даже чипы DDR4 по-прежнему подвержены атаке Rowhammer! Что же дальше?
Прежде всего, не стоит паниковать. Применение RH в реальности — экстремально трудная задача. Успех её зависит от множества неизвестных: чипов памяти, установленных в конкретной системе, их конфигурации, операционной системы, применяемого софта, нагрузки на машину и многого другого, включая и чистое везение («мутации» ведь случайны). То есть вероятность, что Rowhammer применят, скажем, для создания массового компьютерного вируса, ничтожно мала.
Вместе с тем применение RH в единичных случаях — например, для вычисления конкретного пользователя TOR спецслужбами — выглядит реальным. Ведь эффективной защиты по-прежнему не существует. И, пожалуй, единственная реальная возможность от такой атаки защититься — пересесть на вычислительную технику, скажем, образца 90-х годов. Которая ещё не подошла к барьеру возможностей полупроводников слишком близко…
P.S. В статье использована иллюстрация Antonio Thomas Oliveira.