В январе 2018 года была обнаружена огромная уязвимость системы безопасности по имени Spectre, затронувшая все современные микропроцессоры. Он позволял вредоносным программам считывать фрагменты компьютерной памяти, используемые посторонними программами, потенциально раскрывая ценную информацию хакерам.

Для этого использовалась особенность современных процессоров, называемая спекулятивным исполнением. Это метод оптимизации, при котором процесс ЦП в основном выполняет дополнительную работу в фоновом режиме, прогнозируя возможные результаты на основе инструкций в своем конвейере до их выполнения, чтобы избежать ожидания выполнения определенных инструкций и затем выполнение операций. Если прогноз оказался неверным, лишняя работа игнорируется и списывается. Если предсказание было правильным, то инструкции готовы к выполнению намного быстрее, чем они были бы при полностью пошаговом линейном режиме. Заранее подготовив часть работы, процессоры избегают небольших задержек и получают значительное повышение скорости однопоточных процессов.

Spectre раскрыл действительно умный способ использовать эту технику. По сути, это включало запуск программы, которая начинается с создания определенной серии инструкций для подготовки ЦП, «обучения» его, чтобы начать предсказывать будущие операции, идущие определенным образом. Тренируя спекулятивное выполнение таким очень контролируемым образом, Spectre может постоянно поддерживать эту ненужную дополнительную фоновую работу, выполняемую в определенной части кеш-памяти процессора. Расположение кэша соответствует адресному пространству памяти, используемому программным обеспечением, являющимся объектом атаки. Это выполнение инструкций и прослушивание в определенном назначенном месте кэша памяти известно как «скрытый канал микроархитектуры». В конце концов, умозрительные инструкции в кэше раскрывают данные по каналу, которые Spectre может записать и передать злоумышленнику.

Несмотря на то, что эту атаку сложно выполнить и она должна быть нацелена на чрезвычайно конкретные приложения, она может полностью подорвать любые операции на данном ЦП, независимо от используемых традиционных мер безопасности или криптографии. Тот факт, что процессоры Intel, AMD и ARM были уязвимы для этих атак, создал серьезную чрезвычайную ситуацию, когда они были обнаружены.

Производители процессоров быстро выпустили обновления прошивки, которые устранили атаку за счет производительности существующих чипов, и к концу года новый дизайн карты помешал Spectre на аппаратном уровне.

В дополнение к этому, различные операционные системы также исправляли исправления для Spectre, а программное обеспечение, которое было особенно уязвимо для него, также создавало свои собственные решения.

Javascript был особенно опасным вектором для использования этой атаки в Интернете, поэтому браузеры должны были вносить свои собственные исправления. Chrome реализовал функцию, называемую изоляцией сайта по умолчанию, которая перемещала каждую отдельную страницу и фрейм в браузере в их собственный отдельный процесс, который изолирован и ограничен определенными способами взаимодействия друг с другом. Firefox реализовал аналогичные изменения, также устранив разделяемую память между страницами и фаззинг всех таймеров с высоким разрешением (например, Firefox округляет вывод временной метки performance.now() с шагом 1 мс вместо чрезвычайно точного результата высокого разрешения, который он давал. ранее, поскольку спекулятивное выполнение таймеров высокого разрешения, подобных этому, ранее позволяло Spectre постоянно работать и следить за кешем памяти.)

В Firefox версии 79, выпущенной 29.07.20, Mozilla начала реализовывать некоторые действительно интересные новые функции, которые позволяют разработчикам снова использовать совместно используемую память и таймеры с высоким разрешением, впервые с тех пор, как в 2018 году были приняты меры Anti-Spectre.

Два новых заголовка: Cross-Origin-Opener-Policy и Cross-Origin-Embedder-Policy позволяют изолировать ваши процессы от злоумышленников и получать ресурсы с согласившихся веб-сайтов соответственно.

Они также реализуют JSExecutionManager в качестве встроенного средства защиты для механизма JS, содержащего «переключатель» для отключения всей разделяемой памяти. Это позволит Mozilla быстро и легко отключать новые уязвимые функции при обнаружении новой атаки.

Будет интересно посмотреть, будут ли эти функции приняты другими разработчиками браузеров и веб-сообществом в целом. Может ли это позволить Интернету снова начать использовать разделяемую память и таймеры с высоким разрешением? Насколько повысится производительность приложений JS и Webassembly? Это хоть что-нибудь изменит?

Каким бы ни был результат этих ранних изменений, всегда приятно видеть смелые дизайнерские решения в архитектуре Интернета, особенно когда безопасность является первоочередной задачей.