Крах/Призрак

Обзор

3 января Project Zero выявил уязвимости в современных процессорах, которые процесс может использовать для чтения (в худшем случае) произвольной памяти, включая память, которая не принадлежит этому процессу. Эти уязвимости получили названия Spectre и Meltdown . Что делает Chrome для обеспечения безопасности в Интернете и что веб-разработчикам следует делать для своих сайтов?

ТЛ; ДР

Как пользователь, просматривающий Интернет , вы должны постоянно обновлять свою операционную систему и браузер. Кроме того, пользователи Chrome могут рассмотреть возможность включения изоляции сайта .

Если вы веб-разработчик , команда Chrome советует :

  • Там, где это возможно, предотвращайте попадание файлов cookie в память процесса рендеринга, используя атрибуты файлов cookie SameSite и HTTPOnly и избегая чтения из document.cookie .
  • Убедитесь, что ваши MIME-типы верны, и укажите заголовок X-Content-Type-Options: nosniff для любых URL-адресов с пользовательским или конфиденциальным содержимым, чтобы максимально эффективно использовать блокировку чтения из разных источников для пользователей, у которых включена изоляция сайта.
  • Включите изоляцию сайта и сообщите команде Chrome, если это вызовет проблемы на вашем сайте.

Если вам интересно, почему эти шаги помогают, читайте дальше!

Риск

Существует множество объяснений этих уязвимостей, поэтому я не буду добавлять еще одно. Если вас интересует, как можно эксплуатировать эти уязвимости, рекомендую взглянуть на запись в блоге моих коллег из команды Google Cloud.

И Meltdown, и Spectre потенциально позволяют процессу читать память, чего он не должен делать. Иногда несколько документов с разных сайтов могут в конечном итоге использовать общий процесс в Chrome. Это может произойти, когда один открыл другой с помощью window.open или <a href="..." target="_blank"> или iframes. Если веб-сайт содержит данные пользователя, существует вероятность того, что другой сайт может использовать эти новые уязвимости для чтения этих пользовательских данных.

Смягчения

Команда инженеров Chrome и V8 предпринимает множество усилий для смягчения этой угрозы.

Изоляция сайта

Влияние успешного использования Spectre можно значительно снизить, если запретить использование конфиденциальных данных в процессе совместного использования с кодом, контролируемым злоумышленником. Команда Chrome работает над функцией для достижения этой цели, которая называется « Изоляция сайта »:

Изоляция сайта пока не включена по умолчанию, поскольку существует несколько известных проблем , и команда Chrome хотела бы провести как можно больше полевых испытаний. Если вы веб-разработчик, вам следует включить изоляцию сайта и проверить, продолжает ли ваш сайт работать. Если вы хотите принять участие сейчас, включите chrome://flags#enable-site-per-process . Если вы обнаружили сайт, который не работает, помогите нам, сообщив об ошибке и упомянув, что у вас включена изоляция сайта.

Межсайтовая блокировка документов

Даже если все межсайтовые страницы помещены в отдельные процессы, страницы все равно могут законно запрашивать некоторые межсайтовые подресурсы, такие как изображения и JavaScript. Чтобы предотвратить утечку конфиденциальной информации, Site Isolation включает функцию « межсайтовой блокировки документов », которая ограничивает количество сетевых ответов, доставляемых процессу рендеринга.

Веб-сайт может запрашивать с сервера два типа данных: «документы» и «ресурсы». Здесь документами являются HTML, XML, JSON и текстовые файлы. Веб-сайт может получать документы из своего собственного домена или из других доменов с разрешительными заголовками CORS. Ресурсы включают в себя такие вещи, как изображения, JavaScript, CSS и шрифты. Ресурсы могут быть включены с любого сайта.

Политика межсайтовой блокировки документов не позволяет процессу получать «документы» из других источников, если:

  1. Они имеют тип HTML, XML, JSON или текстовый/обычный MIME и
  2. У них есть либо HTTP-заголовок ответа X-Content-Type-Options: nosniff , либо быстрый анализ контента (« обнюхивание ») подтверждает правильность типа.
  3. CORS явно не разрешает доступ к документу

Документы, заблокированные этой политикой, представляются процессу как пустые, хотя запрос по-прежнему выполняется в фоновом режиме.

Например: представьте, что злоумышленник создает тег <img> , который включает файл JSON с конфиденциальными данными, например <img src="https://yourbank.com/balance.json"> . Без изоляции сайта содержимое файла JSON попадет в память процесса обработки, после чего средство визуализации заметит, что это недопустимый формат изображения, и не будет отображать изображение. Однако благодаря Spectre теперь есть способ потенциально прочитать этот фрагмент памяти. Межсайтовая блокировка документов предотвратит попадание содержимого этого файла в память процесса, в котором работает средство визуализации, поскольку тип MIME блокируется межсайтовой блокировкой документов.

Согласно пользовательским показателям, существует множество файлов JavaScript и CSS, которые поставляются с типами MIME text/html или text/plain . Чтобы избежать блокировки ресурсов, случайно помеченных как документы, Chrome пытается прослушать ответ, чтобы убедиться в правильности типа MIME. Этот анализ несовершенен, поэтому, если вы уверены, что устанавливаете правильные заголовки Content-Type на своем веб-сайте, команда Chrome рекомендует добавить заголовок X-Content-Type-Options: nosniff ко всем вашим ответам.

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

Файлы cookie SameSite

Вернемся к примеру выше: <img src="https://yourbank.com/balance.json"> . Это работает только в том случае, если yourbank.com сохранил файл cookie, который автоматически осуществляет вход пользователя в систему. Файлы cookie обычно отправляются для всех запросов на веб-сайт, который устанавливает файл cookie, даже если запрос сделан третьей стороной с использованием тега <img> . Файлы cookie SameSite — это новый атрибут, который указывает, что файл cookie должен быть прикреплен только к запросу, исходящему с того же сайта, отсюда и название. К сожалению, на момент написания этот атрибут поддерживают только Chrome и Firefox 58+ .

HTTPOnly и document.cookie

Если файлы cookie вашего сайта используются только на стороне сервера, а не клиентским JavaScript, есть способы предотвратить попадание данных файлов cookie в процесс рендеринга. Вы можете установить атрибут cookie HTTPOnly , который явно запрещает доступ к файлу cookie через клиентский сценарий в поддерживаемых браузерах, таких как Chrome. Если установка HTTPOnly невозможна, вы можете ограничить воздействие загрузки данных cookie на процесс визуализации, не читая document.cookie без крайней необходимости.

Когда вы ссылаетесь на другую страницу с помощью target="_blank" , открытая страница имеет доступ к вашему объекту window , может перейти с вашей страницы на другой URL-адрес и без изоляции сайта будет находиться в том же процессе, что и ваша страница. Чтобы лучше защитить вашу страницу, ссылки на внешние страницы, открывающиеся в новом окне, всегда должны указывать rel="noopener" .

Таймеры высокого разрешения

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

Одним из API, который предлагает веб-платформа, является performance.now() , точность которого составляет 5 микросекунд. В качестве меры по смягчению последствий во всех основных браузерах уменьшено разрешение performance.now() , чтобы затруднить проведение атак.

Другой способ получить таймер с высоким разрешением — использовать SharedArrayBuffer . Буфер используется выделенным исполнителем для увеличения счетчика. Основной поток считывает этот счетчик и использует его в качестве таймера. На данный момент браузеры решили отключить SharedArrayBuffer до тех пор, пока не будут приняты другие меры по смягчению последствий.

V8

Для использования Spectre необходима специально созданная последовательность инструкций процессора. Команда V8 реализовала меры по смягчению последствий известных атак и работает над изменениями в TurboFan, их оптимизирующем компиляторе, которые делают сгенерированный код безопасным даже при запуске этих атак. Однако эти изменения в генерации кода могут привести к снижению производительности.

Обеспечение безопасности в Интернете

Вокруг открытия Spectre и Meltdown и их последствий было много неопределенности. Я надеюсь, что эта статья прольет свет на то, что делают команды Chrome и V8 для обеспечения безопасности веб-платформы и как веб-разработчики могут помочь, используя существующие функции безопасности. Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне в Twitter .