Легко представить себе такую ситуацию: вы переходите по ссылке, попадаете на вредоносную страницу, вводите на ней что-то, злоумышленник крадет ваши данные. А возможен ли более сложный вариант? Вы переходите по ссылке, попадаете на вредоносную страницу, которая для кражи данных использует фундаментальную особенность вашего процессора — уязвимость, которую нельзя или очень тяжело исправить.
В 2018 году исследователи доказали, что такое теоретически возможно, представив первые два варианта уязвимости Spectre. Спустя три года, в сентябре 2021-го, была показана первая реалистичная атака с использованием Spectre v1, названная Spook.js. Разобраться в особенностях подобных атак очень сложно, но мы постараемся объяснить возможности Spook.js максимально просто.
Необходимая предыстория: Spectre v1
Информация о первых двух варианта атак этого семейства — Spectre и Meltdown — была обнародована в 2018 году. Атаки эксплуатировали систему предсказания ветвлений (branch prediction), используемую абсолютно во всех современных процессорах. Данная система призвана ускорить выполнение команд.
Как работает предсказание ветвлений: представьте, что в коде программы есть условный переход. Например (максимально упрощенно), пользователь вводит пароль для доступа к данным. Если пароль окажется правильным, то будет выполнен один набор инструкций. Если пароль неверный, то выполнится другой набор. Однако, не дожидаясь того момента, когда уже будет известен ответ на этот вопрос, процессор выполняет тот набор инструкций, который, как он считает, потребуется с наибольшей вероятностью.
В нашем примере — если пароль до этого сто раз вводился правильно, можно предположить, что и в этот раз он будет верным. Если процессор угадал правильно, мы получаем прибавку в производительности. Если нет, отбрасываем бесполезные вычисления и выполняем другой набор инструкций.
В атаке с использованием уязвимости Spectre делается попытка прочитать область данных, доступа к которой у программы нет. Перед этим производится множество обращений к областям данных с открытым доступом, тем самым система предсказания переходов «тренируется» так, чтобы выполнить и запрещенную операцию чтения. Используя предсказание ветвлений, процессор выполняет эту операцию «на опережение», ведь он уже привык, что программа чаще всего не просит доступ зря. Но по результатам проверки оказывается, что доступ к этим данным программе запрещен, — поэтому выполненные вычисления отбрасываются. Все вроде бы хорошо, но прочитанные процессором данные при этом на какое-то время сохраняются в кэш-памяти — собственной памяти процессора.
Дальше происходит самое интересное: у вредоносного процесса нет возможности прочитать секрет из кэш-памяти процессора напрямую. Поэтому для кражи данных используется так называемая атака по сторонним каналам. Для этого измеряется скорость доступа к определенной информации, и, если она относительно мала, значит, они находятся в кэш-памяти. Если велика — данные загружаются из обычной оперативной памяти. Определенная последовательность попыток чтения обеспечивает утечку секретной информации.
В результате получается фундаментальная уязвимость процессора, которую нельзя полностью исправить, разве что путем полного выключения системы предсказания ветвлений, что обеспечит серьезный удар по производительности. У атаки Spectre, впрочем, есть много ограничений:
- Нужно иметь возможность выполнения программного кода на атакуемом компьютере или мобильном устройстве.
- Требуется конкретная программа-жертва, код которой написан так, что создает условия для успешной атаки.
- Данные извлекаются крайне медленно — десятки или сотни байт в секунду, также возможны ошибки чтения.
- В целом необходимо сочетание условий для проведения атаки, чтобы можно было украсть секретные данные и именно те, что представляют ценность для атакующего: пароль, ключ шифрования и так далее.
Несмотря на то, что с момента обнаружения уязвимости прошло больше трех лет, полностью решить проблему не удалось: есть только методы снижения риска эксплуатации, причем для Spectre v1 они преимущественно программные.
Spook.js — реальное применение Spectre v1
Можно сделать вывод, что Spectre — не самая опасная штука. Если злоумышленник смог выполнить код на атакуемом компьютере, гораздо проще воспользоваться одной из многочисленных уязвимостей в операционной системе или установленных программах для повышения привилегий и кражи данных.
Это так, но есть один нюанс: не стоит забывать, что современные веб-страницы тоже в больших количествах содержат программный код, который выполняется на компьютере пользователя, в браузере. Атака Spook.js использует уязвимость Spectre v1 именно в таком сценарии: загружается зараженная страница, браузер выполняет код, злоумышленник получает секретные данные.
Подробно исследование описано на специальном сайте, мы же приведем практические результаты. Во-первых, авторам работы удалось украсть пароль пользователя от соцсети Tumblr. Во-вторых, они смогли похитить данные из менеджера паролей Lastpass. Наконец, получилось перехватить изображение, загружаемое пользователем в приватное хранилище на сервере Google.
Как это получилось? Исследователи использовали особенность браузера Google Chrome. После обнародования информации о Spectre разработчики этого браузера применили меры, усложняющие потенциальные атаки путем принудительной изоляции загружаемых веб-сайтов. Работает это так: для каждого веб-сайта создается свой собственный процесс, так чтобы вредоносный код на одной странице не мог быть использован для кражи данных с другого ресурса. Но есть одно исключение: несколько страниц с одного сайта или домена группируются в одном общем процессе браузера. Если на одной из них выполняется вредоносный код (написанный на языке Javascript, отсюда .js в названии атаки), данные на других страницах можно украсть.
Атака Spook.js на Tumblr
Tumblr — коллективный блог, разместить на нем вредоносный код теоретически вполне возможно. В одной вкладке браузера открыта «подготовленная страница». В другой вкладке пользователь пытается войти в собственную учетную запись на сервисе. Логин и пароль сохранены в браузере и подставляются автоматически. Вот эти автоматически введенные данные вредоносный код и может похитить.
Используя уязвимость Spectre, данная атака косвенно взаимодействует с другой вкладкой с того же сайта и похищает данные не напрямую. Важной особенностью такого подхода является то, что успешная атака практически не оставляет следов!
Атака Spook.js на Lastpass
Атака на менеджер паролей Lastpass проведена иначе: код для кражи данных с использованием Spectre v1 был встроен во вредоносное расширение для браузера Google Chrome. В нем же работало и расширение LastPass. В некоторых случаях код расширений также выполняется в общем процессе браузера, что делает возможным кражу данных.
Атака Spook.js на облачное хранилище Google
Еще один пример: атака на облачное хранилище Google. В одной вкладке браузера открыта вредоносная страница, загруженная на хостинг sites.google.com. В другом пользователь загружает в свое приватное облако на сервисе G Suite изображение. С помощью вредоносного кода удается получить доступ к изображению.
Здесь хорошо заметны ограничения атаки Spectre. Во-первых, это низкая скорость «похищения» данных (в зависимости от процессора — 400–600 байт в секунду), из-за чего в примере использовано очень маленькое изображение. Во-вторых, хорошо заметно значительное количество ошибок чтения секретов из кэш-памяти: до 4% данных были ошибочными — отсюда артефакты в выкраденной копии картинки.
Ограничения метода
Исследователи показали возможность атаки на разных процессорах — нескольких современных от Intel и даже на новом процессоре Apple M1 на базе архитектуры ARM. Во всех случаях атака выполнялась в браузере Google Chrome. Spook.js в принципе стал возможен благодаря особенностям работы этого браузера. Уязвимы для этой атаки также и другие браузеры на основе движка Chromium, например Microsoft Edge.
Не удалось провести атаку на процессорах AMD. Кроме того, в браузере Mozilla Firefox обработчик кода на Javascript реализован иначе. В обоих случаях исследователи не исключают возможности проведения успешной атаки, однако для проверки этого требуются дополнительные исследования. Напомним, речь идет об эксплуатации особенностей работы процессора.
Наконец, атака реализуема, только если злоумышленник сможет загрузить вредоносный код на страницу с тем же доменным именем. В случае коллективных блогов или хостинга это возможно. А вот, например, применить данный метод к сайту банка, скорее всего, не получится.
Нет поводов для паники
Исследование Spook.js важно потому, что впервые исследователям удалось продемонстрировать достаточно реалистичный сценарий эксплуатации одной из уязвимостей Spectre. Несмотря на это, шансов на применение атаки в реальных условиях немного. Во-первых, разработчики браузера Google Chrome по следам исследования усилили механизм изоляции загруженных сайтов друг от друга. Во-вторых, у реальных злоумышленников есть масса способов украсть данные пользователя — от традиционного вредоносного ПО до социальной инженерии, — не прибегая к таким сложным методам, требующим высокой квалификации и знания особенностей работы современных процессоров на низком уровне.
Spook.js — научная работа, по следам которой будут внедрены изменения в софте, предложены новые рекомендации по усилению безопасности сайтов (к примеру, авторы предлагают выносить страницы авторизации на отдельное доменное имя). Не исключено, что в следующих исследованиях удастся еще немного облегчить проведение атаки, но, скорее всего, это приведет к еще одному витку усиления защитных средств. Даже если уязвимости типа Spectre получится использовать массово, защититься от них получится так же, как от любого другого вредоносного ПО. Разработчики защитных решений просто добавят новые виды атак в список отслеживаемых и блокируемых еще до исполнения.
Нельзя исключать, что исследователи рано или поздно наткнутся на такую особенность Spectre-подобных уязвимостей, которая потребует серьезной переделки всей современной IT-экосистемы. Вероятность подобного, впрочем, не очень высока: не будем забывать, что от теоретической уязвимости до первой практической атаки (да и то со множеством ограничений) прошло целых три года.
Можно допустить, что Spectre будут взяты на вооружение для таргетированных атак, где потенциальная выгода от полученных данных будет превышать затраты на разработку и организацию операции. Даже если такой сценарий для вас актуален, усложнить жизнь атакующим просто: разделяйте веб-страницы между разными браузерами — не открывайте страницы и веб-сервисы с чувствительной информацией там же, где вы смотрите «развлекательный контент». В идеале — работайте с секретами в изолированном окружении, в виртуальной машине или просто на отдельном устройстве.