Узнайте, почему изоляция между источниками необходима для использования мощных функций, таких как SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
и таймер высокого разрешения с большей точностью.
Введение
В статье «Как сделать ваш веб-сайт изолированным от перекрестного происхождения с помощью COOP и COEP» мы объяснили, как перейти в состояние «изолированного от перекрестного происхождения» с помощью COOP и COEP. В этой сопутствующей статье объясняется, почему изоляция между источниками необходима для включения мощных функций браузера.
Фон
Интернет построен на основе политики одного и того же источника : функции безопасности, которая ограничивает взаимодействие документов и сценариев с ресурсами из другого источника. Этот принцип ограничивает способы доступа веб-сайтов к ресурсам перекрестного происхождения. Например, документу из https://a.example
запрещен доступ к данным, размещенным по адресу https://b.example
.
Однако из этой политики одного и того же происхождения были некоторые исторические исключения. Любой сайт может:
- Встраивание iframe из разных источников
- Включите ресурсы из разных источников, такие как изображения или скрипты.
- Открытие всплывающих окон из разных источников со ссылкой на DOM.
Если бы сеть можно было разработать с нуля, этих исключений не было бы. К сожалению, к тому времени, когда веб-сообщество осознало ключевые преимущества строгой политики одного и того же происхождения, сеть уже полагалась на эти исключения.
Побочные эффекты безопасности такой слабой политики одного и того же происхождения были исправлены двумя способами. Одним из способов было введение нового протокола под названием Cross Origin Resource Sharing (CORS), цель которого — убедиться, что сервер позволяет совместно использовать ресурс с данным источником. Другой способ — неявно удалить прямой доступ сценария к ресурсам перекрестного происхождения, сохранив при этом обратную совместимость. Такие ресурсы с перекрестным происхождением называются «непрозрачными» ресурсами. Например, именно поэтому манипулирование пикселями изображения из разных источников с помощью CanvasRenderingContext2D
завершается неудачей, если к изображению не применяется CORS.
Все эти политические решения принимаются внутри группы контекста просмотра.
Долгое время комбинации CORS и непрозрачных ресурсов было достаточно, чтобы сделать браузеры безопасными. Иногда обнаруживались крайние случаи (например, уязвимости JSON ), и их нужно было исправлять, но в целом принцип запрета прямого доступа для чтения к необработанным байтам ресурсов перекрестного происхождения оказался успешным.
Все изменилось с появлением Spectre , который делает потенциально читаемыми любые данные, загружаемые в ту же группу контекста просмотра, что и ваш код. Измеряя время, затрачиваемое на определенные операции, злоумышленники могут угадать содержимое кэшей ЦП и, следовательно, содержимое памяти процесса. Такие атаки по времени возможны с помощью таймеров с низкой степенью детализации, которые существуют на платформе, но их можно ускорить с помощью таймеров с высокой степенью детализации, как явных (например, performance.now()
), так и неявных (например, SharedArrayBuffer
). Если evil.com
встраивает изображение из разных источников, они могут использовать атаку Spectre для чтения его пиксельных данных, что делает защиту, основанную на «непрозрачности», неэффективной.
В идеале все запросы между источниками должны явно проверяться сервером, владеющим ресурсом. Если проверка не обеспечивается сервером-владельцем ресурсов, то данные никогда не попадут в контекстную группу просмотра злоумышленника и, следовательно, останутся вне досягаемости любых атак Spectre, которые может осуществить веб-страница. Мы называем это изолированным состоянием перекрестного происхождения. Именно в этом и заключается суть COOP+COEP.
В изолированном состоянии между источниками запрашивающий сайт считается менее опасным, и это открывает мощные функции, такие как SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
и таймеры с высоким разрешением с большей точностью, которые в противном случае можно было бы использовать для атак, подобных Spectre. Это также предотвращает изменение document.domain
.
Политика в отношении перекрестного внедрения
Политика внедрения перекрестного происхождения (COEP) предотвращает загрузку документа любых ресурсов перекрестного происхождения, которые явно не предоставляют разрешение документа (с использованием CORP или CORS). С помощью этой функции вы можете объявить, что документ не может загружать такие ресурсы.
Чтобы активировать эту политику, добавьте в документ следующий HTTP-заголовок:
Cross-Origin-Embedder-Policy: require-corp
Ключевое слово require-corp
— единственное допустимое значение для COEP. Это обеспечивает соблюдение политики, согласно которой документ может загружать только ресурсы из того же источника или ресурсы, явно помеченные как загружаемые из другого источника.
Чтобы ресурсы можно было загружать из другого источника, они должны поддерживать либо совместное использование ресурсов между источниками (CORS), либо политику ресурсов между источниками (CORP).
Совместное использование ресурсов между источниками
Если ресурс перекрестного происхождения поддерживает совместное использование ресурсов перекрестного происхождения (CORS) , вы можете использовать атрибут crossorigin
, чтобы загрузить его на свою веб-страницу без блокировки со стороны COEP.
<img src="https://third-party.example.com/image.jpg" crossorigin>
Например, если этот ресурс изображения обслуживается с заголовками CORS, используйте атрибут crossorigin
, чтобы запрос на получение ресурса использовал режим CORS . Это также предотвращает загрузку изображения, если оно не устанавливает заголовки CORS.
Аналогичным образом вы можете получить данные перекрестного происхождения с помощью метода fetch()
, который не требует специальной обработки, если сервер отвечает правильными заголовками HTTP .
Политика использования ресурсов перекрестного происхождения
Политика ресурсов перекрестного происхождения (CORP) изначально была введена как добровольное согласие на защиту ваших ресурсов от загрузки из другого источника. В контексте COEP CORP может указать политику владельца ресурса в отношении того, кто может загружать ресурс.
Заголовок Cross-Origin-Resource-Policy
принимает три возможных значения:
Cross-Origin-Resource-Policy: same-site
Ресурсы, помеченные same-site
можно загружать только с одного и того же сайта.
Cross-Origin-Resource-Policy: same-origin
Ресурсы, помеченные same-origin
могут быть загружены только из одного и того же источника.
Cross-Origin-Resource-Policy: cross-origin
Ресурсы, помеченные как cross-origin
могут быть загружены с любого веб-сайта. ( Это значение было добавлено в спецификацию CORP вместе с COEP.)
Политика открытия кросс-происхождения
Политика открытия перекрестного происхождения (COOP) позволяет гарантировать, что окно верхнего уровня изолировано от других документов, помещая их в другую группу контекста просмотра, чтобы они не могли напрямую взаимодействовать с окном верхнего уровня. Например, если документ с COOP открывает всплывающее окно, его свойство window.opener
будет иметь null
. Кроме того, свойство .closed
ссылки на него открывателя вернет true
.
Заголовок Cross-Origin-Opener-Policy
принимает три возможных значения:
Cross-Origin-Opener-Policy: same-origin
Документы, помеченные same-origin
могут использовать одну и ту же группу контекста просмотра с документами того же происхождения, которые также явно отмечены same-origin
.
Cross-Origin-Opener-Policy: same-origin-allow-popups
Документ верхнего уровня с same-origin-allow-popups
сохраняет ссылки на любые всплывающие окна, которые либо не устанавливают COOP, либо отказываются от изоляции, устанавливая COOP unsafe-none
.
Cross-Origin-Opener-Policy: unsafe-none
unsafe-none
используется по умолчанию и позволяет добавлять документ в контекстную группу просмотра его открывающего устройства, если только само открывающее средство не имеет COOP same-origin
.
Краткое содержание
Если вам нужен гарантированный доступ к мощным функциям, таким как SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
или таймерам высокого разрешения с большей точностью, просто помните, что ваш документ должен использовать как COEP со значением require-corp
, так и COOP со значением same-origin
. В отсутствие того и другого браузер не будет гарантировать достаточную изоляцию для безопасного включения этих мощных функций. Вы можете определить ситуацию на своей странице, проверив, возвращает ли self.crossOriginIsolated
true
.
Узнайте, как реализовать это, в разделе «Как сделать ваш веб-сайт изолированным от перекрестного происхождения с помощью COOP и COEP» .