Опубликовано: 4 мая 2020 г.
В статье «Как сделать ваш веб-сайт «изолированным от других источников» с помощью COOP и COEP» мы объяснили, как перейти в состояние «изолированности от других источников» с помощью COOP и COEP. Эта статья является дополнением и объясняет, почему изоляция от других источников необходима для включения мощных функций в браузере.
Глоссарий
В этом документе используется множество похожих по названию и сокращений терминов. Для ясности мы подготовили небольшой глоссарий:
- COEP: Политика внедрения перекрестного происхождения
- COOP: Политика открытия сделок между странами происхождения
- КОРПОРАЦИЯ: Политика использования ресурсов из разных источников
- CORS: Межстрановое совместное использование ресурсов
- CORB: блокировка чтения из разных источников.
Фон
В основе веб-технологий лежит политика одного источника (same-origin policy) , функция безопасности, которая ограничивает взаимодействие документов и скриптов с ресурсами из других источников. Этот принцип ограничивает способы доступа веб-сайтов к ресурсам из разных источников. Например, документу с https://a.example запрещен доступ к данным, размещенным по адресу https://b.example .
Однако в истории существовали некоторые исключения из политики единого источника. Любой веб-сайт может:
- Встраивание iframe из разных источников
- Включите в список ресурсы из разных источников, такие как изображения или скрипты.
- Открытие диалоговых окон, работающих в разных источниках, с использованием ссылки на DOM.
К тому времени, когда веб-сообщество осознало преимущества строгой политики ограничения доступа из одного источника, интернет уже полагался на подобные исключения.
Последствия для безопасности, вызванные такой нестрогой политикой определения источника происхождения данных, были устранены двумя способами:
- Протокол Cross Origin Resource Sharing (CORS) гарантирует, что сервер разрешает совместное использование ресурса с заданным источником.
- Разработчики неявно исключают прямой доступ скриптов к ресурсам из других источников, сохраняя при этом обратную совместимость. Такие ресурсы из других источников называются «непрозрачными» ресурсами. Именно поэтому манипуляции с пикселями из других источников с помощью
CanvasRenderingContext2Dзавершаются неудачей, если к изображению не применена CORS.
Все эти политические решения принимаются в рамках определенной контекстной группы при просмотре веб-страниц.

Долгое время этой комбинации было достаточно для обеспечения безопасности браузеров, за исключением редких случаев, требующих прямого исправления (например, уязвимости в JSON ).
Ситуация изменилась с появлением уязвимости Spectre , которая делает потенциально читаемыми любые данные, загруженные в ту же группу контекста просмотра, что и ваш код. Измеряя время выполнения определенных операций, злоумышленники могут угадать содержимое кэшей ЦП, а следовательно, и содержимое памяти процесса. Такие атаки возможны с помощью таймеров с низкой детализацией, существующих на платформе, и могут быть ускорены с помощью таймеров с высокой детализацией, как явных (например, performance.now() ), так и неявных (например, SharedArrayBuffer ).
Если evil.com встраивает изображение из другого источника, он может использовать атаку Spectre для чтения пиксельных данных встроенного изображения. Это делает неэффективными средства защиты, основанные на «непрозрачности».

В идеале все междоменные запросы проверяются сервером, которому принадлежит ресурс. Если проверка не проводилась, данные никогда не должны попасть в контекстную группу просмотра злоумышленника. Таким образом, данные остаются вне досягаемости возможных атак Spectre. Мы называем это состоянием междоменной изоляции .
Когда встроенный код находится в изолированном состоянии между источниками, запрашивающий сайт считается менее опасным. Это позволяет запрашивающему сайту использовать SharedArrayBuffer , performance.measureUserAgentSpecificMemory() и таймеры с высоким разрешением с большей точностью, предотвращая при этом возможные атаки Spectre. Это состояние также предотвращает изменение document.domain .
Политика встраивания из разных источников
Политика встраивания из разных источников (COEP) предотвращает загрузку документом любых ресурсов из других источников, для которых документ явно не предоставляет разрешение в соответствии с CORP или CORS. С помощью этой функции вы можете указать, что документ не может загружать такие ресурсы.

a.example , установил политику COEP на require-corp . a.example пытается встроить 3 ресурса с b.example , но успешно удаётся встроить только два. Два успешных встраивания включают файл JavaScript с политикой CORP для междоменных встраиваний и изображение с разрешенным CORS. Третий ресурс — это видео, для которого политика CORP требует встраивания ресурса только с того же источника, поэтому видео не будет загружено на a.example .Для активации этой политики добавьте в документ следующий HTTP-заголовок:
Cross-Origin-Embedder-Policy: require-corp
Параметр COEP принимает единственное значение require-corp . Это обеспечивает соблюдение политики, согласно которой документ может загружать ресурсы только из того же источника или ресурсы, явно помеченные как загружаемые из другого источника.
Для того чтобы ресурсы могли быть загружены из другого источника, они должны поддерживать либо протокол совместного использования ресурсов между источниками (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 установлен по умолчанию и позволяет добавить документ в группу контекста просмотра открывающего его пользователя, если только у самого открывающего пользователя нет группы контекста просмотра same-origin .
Краткое содержание
Если вам нужен доступ к таким функциям, как SharedArrayBuffer , performance.measureUserAgentSpecificMemory() или таймерам с высокой точностью, ваш документ должен использовать COEP со значением require-corp и COOP со значением same-origin . В отсутствие любого из них браузер не гарантирует достаточной изоляции для безопасного включения этих мощных функций. Вы можете определить ситуацию на вашей странице, проверив, возвращает ли self.crossOriginIsolated true .
Узнайте, как это реализовать, в разделе «Как сделать ваш веб-сайт "изолированным от других источников" с помощью COOP и COEP» .