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

Обзор

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> . SameSite cookie-файлы — это новый атрибут, который указывает, что cookie-файл должен быть прикреплен только к запросу, который исходит с того же сайта, отсюда и название. К сожалению, на момент написания статьи этот атрибут поддерживают только Chrome и Firefox 58+ .

HTTPOnly и document.cookie

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

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

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

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

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

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

V8

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

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

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