Исследователи из четырех университетов США опубликовали научную работу, в которой предложили интересную атаку на графическую подсистему компьютера, а конкретно — на распространенные интегрированные видеочипы AMD и Intel. Атаку назвали GPU.zip, таким образом намекая на две основные ее особенности: кражу секретов из графической системы и эксплуатацию особенностей алгоритмов сжатия данных. В этом посте мы, как обычно, постараемся рассказать о новом исследовании максимально просто. Но в основном мы будем здесь восхищаться тем, насколько эта атака красива, сложна и абсолютно (в существующем виде) непрактична.
Об алгоритмах сжатия
Прежде чем рассказывать о самой атаке GPU.zip, надо сказать несколько слов об особенностях алгоритмов сжатия. Их можно грубо поделить на алгоритмы сжатия с потерями (такие как MP3) и алгоритмы сжатия без потерь (такие как RAR, ну или ZIP). Последние, очевидно, сжимают данные так, чтобы их можно было полностью восстановить. Самый простой метод компрессии информации: можно записать повторяющиеся данные один раз, а дальше лишь указывать, что конкретный набор символов или цифр должен находиться в этом месте. Например, объем этого поста можно серьезно уменьшить, если записать все места, где находится слово «данные», а само слово сохранить только один раз.
С точки зрения информационной безопасности алгоритмы сжатия имеют своего рода уязвимость. Представим, что мы передаем данные через Интернет, используя сжатие. Объем информации в таком случае будет зависеть от того, насколько эффективен алгоритм компрессии, — чем лучше данные сжимаются, тем меньше их объем. Еще в 2002 году было показано, что эта особенность может быть использована для кражи секретов, даже если данные зашифрованы. Одна из более-менее практических атак, подтверждающих это, была продемонстрирована в 2012 году.
Оказалось, что в некоторых случаях, если информация между браузером и сервером передается одновременно в сжатом и зашифрованном виде, алгоритм сжатия может выдавать секретную информацию без взлома алгоритма шифрования. Если у атакующего есть возможность отправлять множество запросов к серверу, он сможет наблюдать за тем, как меняется объем сжатых данных в зависимости от содержимого. А уже из этого можно посимвольно вычислить секретную информацию. Осталось выяснить, может ли неотключаемая компрессия данных графической подсистемы также приводить к утечке секретов.
Об особенностях компьютерной графики
Сегодня речь идет о графической подсистеме, если проще — о видеокартах, хотя они часто бывают интегрированы прямо в процессор. Видеочипы представляют собой отдельные вычислительные модули, как правило, с собственной оперативной памятью. Любителям компьютерных игр знакома ситуация, когда самая свежая крутая игра на не самой мощной видеокарте работает с трудом: частота обновления кадров оказывается ниже оптимальной, изображение перестает быть плавным, а то и вовсе замирает на долю секунды. Причин такого поведения может быть две. Чаще всего видеокарта не справляется с вычислениями, необходимыми для создания трехмерного изображения. Но иногда возникает ситуация, когда требуемые данные слишком медленно передаются из основной оперативной памяти в память графической подсистемы.
Решить эту проблему можно с помощью алгоритма сжатия данных. В играх применяются алгоритмы компрессии с потерями — для сжатия текстур. Авторы работы выяснили, что как минимум в интегрированных видеочипах Intel и AMD также применяются алгоритмы сжатия без потерь, для передачи вообще любой графической информации, которую требуется отобразить на дисплее (рабочий стол, окна браузера и так далее). Они неотключаемы и к тому же проприетарны — никто, кроме производителя, толком не знает, как они работают. Авторы исследования изучали их в режиме «черного ящика»: само существование алгоритма сжатия было определено по косвенным признакам, например по количеству передаваемых данных из оперативной памяти в видеопамять, которое менялось в зависимости от изображения. Графические паттерны из сплошь черных пикселей, черных и белых пикселей в определенном или случайном порядке показали: когда в видеосистему передаются хорошо сжимаемые данные, информации между оперативной и видеопамятью передается меньше. Именно так, как должно происходить при компрессии.
Большая часть работы посвящена реверс-инжинирингу этих проприетарных алгоритмов сжатия данных. Эта работа была необходима, чтобы понять, как именно работают такие алгоритмы. Например, как графическая информация делится на блоки перед сжатием. Авторы выяснили, что алгоритмы применяются разные, в зависимости от производителя или даже модели графической подсистемы.
Проблема в том, что время, затрачиваемое на сжатие данных, также зависит от этих данных. Если мы имеем плохо сжимаемый набор информации (случайные данные без каких-либо повторяющихся элементов), время его обработки будет отличаться от случая с «простыми данными». А между тем его может измерять и атакующий, например — создатель специальной веб-страницы.
Красота и бесполезность атаки GPU.zip
Представьте, что некто создает «вредоносную» веб-страницу, которая также содержит запрос на встраивание другой страницы, данные с которой вам надо похитить. У него есть возможность измерять время, затрачиваемое на рендеринг своей страницы в браузере, но не более того. Если в страницу встроено, скажем, окно с рабочей почтой потенциальной жертвы, то атакующий не получит доступ к содержимому этого окна. Запрет на такое действие четко определен правилом same-origin policy — на сайте можно разместить код, отслеживающий, например, действия пользователя, но на встраиваемой «чужой» веб-странице он работать не будет. Есть, впрочем, одно исключение: к встраиваемой странице можно применить какие-то правила стилизации.
Авторы атаки GPU.zip воспользовались этим и начали накладывать на целевую страницу определенные графические паттерны, которые, в свою очередь, приводили к изменению времени, необходимого для обработки графических данных с компрессией, и, соответственно, немного меняли длительность отрисовки страницы. И это время мы можем измерять.
Наконец-то мы с вами добрались до практической реализации данной атаки. Работает она так: атакующий каким-то образом заманивает пользователя на вредоносную веб-страницу. Там содержится код для встраивания в нее другой страницы с совсем другого сайта, в данном случае — главной страницы «Википедии». Предположим, что пользователь браузера имеет учетную запись в «Википедии» и залогинен. Имя пользователя будет отображено на встраиваемой странице. Накладывая на нее эффекты и измеряя время, затрачиваемое на отрисовку, только по этому единственному параметру атакующий может восстановить содержимое целевой страницы. А точнее, самое интересное — имя пользователя. Таким образом он, например, может определить личность посетителя своего вредоносного сайта, даже если тот пытается сохранить анонимность.
Это типичная атака по сторонним каналам: мы используем какой-то косвенный параметр, который можем измерять (время рендеринга веб-страницы), чтобы похитить данные, к которым не имеем доступа. А теперь давайте обсудим непрактичность данной атаки. Содержимое целевой веб-страницы реконструируется попиксельно. У злоумышленника есть один очень грубый таймер и возможность слегка модифицировать внешний вид страницы в браузере. В результате на реконструкцию не всей страницы, а только небольшого куска, показанного на скриншоте выше, уходит полчаса на процессоре AMD Ryzen с интегрированной графикой. На процессоре Intel алгоритм работает еще хуже — реконструкция заняла три с лишним часа!
То есть потенциальная жертва должна открыть страницу и забыть про нее довольно надолго, но не закрывать. Все это время страница будет обновляться, довольно серьезно нагружая систему. Впрочем, точность реконструкции данных достаточно высока (97–98%), а главное — метод работает даже в том случае, когда через видеокарту пересылается большой объем других данных. В фоне у исследователей играло видео с YouTube. В отличие от предыдущих исследований, эта атака надежно работает даже при большом количестве вот такого «фонового шума».
Финальный аргумент против реалистичности данной конкретной атаки: большинство сайтов в принципе не допускает встраивания в чужие веб-страницы, если на них демонстрируется конфиденциальный контент. То есть не получится таким образом украсть «скриншот» со списком почтовых сообщений или переписки в чате. Пример со страницей «Википедии» был выбран потому, что это редкий случай, когда веб-сайт с видимым именем пользователя можно встроить.
Подведем итог. В отличие от других аппаратных уязвимостей, в данном исследовании очень сложно говорить о том, что разработчики графических видеочипов допустили какую-то ошибку. Речь идет о крайне сложном взаимодействии разных компонентов, особенности которых можно применить для кражи данных. Сама кража пока тоже не поражает воображение, но в дальнейших исследованиях вполне может быть предложен и более эффективный способ. Хочется надеяться, что разработчики видеочипов примут работу к сведению и адаптируют алгоритмы так, чтобы они не выдавали секретную информацию.
Недооценивать исследование тоже не стоит. Если обобщить и забыть на время про все объективные сложности, был показан метод удаленной кражи данных, практически снятие скриншотов секретной информации. И сделано это было благодаря детальному изучению одной мелкой особенности работы видеочипов, существование которой производители даже особо не афишируют. Высший пилотаж исследовательской работы, хотя пока и не имеющий никаких практических последствий.