Saiba por que o isolamento de origem cruzada é necessário para usar recursos avançados, como SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
e timer de alta resolução com mais precisão.
Introdução
Em Como tornar seu site "isolado de origem cruzada" usando COOP e COEP, explicamos como adotar a abordagem "cross-origin" isolada" usando COOP e COEP. Este é um artigo complementar que explica por que o isolamento de origem cruzada é necessário para ativar recursos avançados no navegador.
Contexto
A Web é criada com base na mesma origem
política: um recurso de segurança que restringe
como documentos e scripts podem interagir com recursos de outra origem. Isso
restringe as maneiras como os sites podem acessar recursos de origem cruzada. Para
exemplo, um documento do domínio https://a.example
é impedido de acessar dados
hospedado em https://b.example
.
No entanto, a política de mesma origem teve algumas exceções históricas. Qualquer site pode:
- Incorporar iframes de origem cruzada
- Inclua recursos de origem cruzada, como imagens ou scripts
- Abrir janelas pop-up de origem cruzada com uma referência do DOM
Se a Web pudesse ser projetada do zero, essas exceções não existiriam. Infelizmente, quando a comunidade da Web percebeu os principais benefícios de uma rígidas de mesma origem, a Web já contava com essas exceções.
Os efeitos colaterais de segurança dessa política flexível de mesma origem foram corrigidos em duas
de várias formas. Uma delas foi por meio da introdução de um novo protocolo chamado Cross
Compartilhamento de recursos de origem (CORS)
que tem como objetivo garantir que o servidor permita o compartilhamento de um recurso com uma
de acordo com a origem. Outra maneira é remover implicitamente o acesso direto ao script para
recursos entre origens, preservando a compatibilidade com versões anteriores. Essas
recursos de origem cruzada são chamados de "opacos" do Google Cloud. Por exemplo, é por isso que
manipular os pixels de uma imagem de origem cruzada usando CanvasRenderingContext2D
.
falhará, a menos que CORS seja aplicado à imagem.
Todas essas decisões sobre políticas acontecem dentro de um grupo de contexto de navegação.
Por muito tempo, a combinação de CORS e recursos opacos foi suficiente para tornar navegadores seguros. Às vezes, casos extremos (como JSON vulnerabilidades) foram descobertos e precisavam ser corrigidos, mas, no geral, o princípio de não permitir acesso de leitura direto aos bytes brutos de recursos entre origens era bem-sucedido.
Tudo isso mudou com
Spectre, que
faz com que todos os dados sejam carregados no mesmo grupo de contexto de navegação que seu código
possivelmente legíveis. Ao medir o tempo que certas operações levam, os atacantes
pode adivinhar o conteúdo dos caches da CPU e, por meio disso, o conteúdo da
processo" memória. Esses ataques de tempo são possíveis com timers de baixa granularidade
existentes na plataforma, mas que podem ser acelerados com timers de alta granularidade,
explícitos (como performance.now()
) e implícitos (como
SharedArrayBuffer
). Se evil.com
incorporar uma imagem de origem cruzada, será possível usar uma
Spectre para ler os dados de pixel, fazendo com que as proteções dependam
"opacidade" ineficaz.
O ideal é que todas as solicitações de origem cruzada sejam verificadas explicitamente pelo servidor que possui o recurso. Se a verificação não for fornecida pelo o servidor proprietário do recurso, os dados nunca vão chegar grupo de contexto de um agente malicioso e, portanto, ficará fora do alcance de qualquer Espectro que uma página da Web pode realizar. Ele é chamado de estado isolado de origem cruzada. É exatamente disso que se trata a COOP+COEP.
Em um estado isolado de origem cruzada, o site solicitante é considerado menos
perigoso e desbloqueia recursos avançados, como SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
e alta resolução
timers com melhor precisão, o que poderia
ser usada para ataques do tipo Spectre. Também evita alterações
document.domain
:
Política de incorporador de origem cruzada
Incorporador de origem cruzada (COEP) impede que uma documento de carregar qualquer recurso de origem cruzada que não conceda explicitamente a permissão do documento (usando CORP ou CORS). Com esse recurso, é possível declarar que um documento não possa carregar esses recursos.
Para ativar essa política, anexe o seguinte cabeçalho HTTP ao documento:
Cross-Origin-Embedder-Policy: require-corp
A palavra-chave require-corp
é o único valor aceito para o COEP. Isso impõe
a política de que o documento só pode carregar recursos da mesma origem ou
recursos explicitamente marcados como carregáveis de outra origem.
Para que os recursos possam ser carregados de outra origem, eles precisam oferecer suporte Compartilhamento de recursos entre origens (CORS, na sigla em inglês) ou Política de recursos entre origens (CORP, na sigla em inglês).
Compartilhamento de recursos entre origens
Se um recurso de origem cruzada for compatível com o Compartilhamento de recursos entre origens
(CORS), é possível usar o
crossorigin
atributo
para carregá-lo na sua página da Web sem ser bloqueado pelo COEP.
<img src="https://third-party.example.com/image.jpg" crossorigin>
Por exemplo, se este recurso de imagem for exibido com cabeçalhos CORS, use o
crossorigin
para que a solicitação de busca do recurso use o CORS
modo. Isso também
impede que a imagem seja carregada, a menos que defina cabeçalhos CORS.
Da mesma forma, busque dados de origem cruzada com o método fetch()
, que
não requer tratamento especial, desde que o servidor responda com o
HTTP
cabeçalhos.
Política de recursos de origem cruzada
Política de recursos de origem cruzada (CORP) foi originalmente apresentada como uma ativação para impedir que seus recursos sejam carregado por outra origem. No contexto do COEP, o CORP pode especificar o recurso do proprietário para quem pode carregar um recurso.
O cabeçalho Cross-Origin-Resource-Policy
aceita três valores possíveis:
Cross-Origin-Resource-Policy: same-site
Os recursos marcados como same-site
só podem ser carregados do mesmo site.
Cross-Origin-Resource-Policy: same-origin
Os recursos marcados como same-origin
só podem ser carregados da mesma origem.
Cross-Origin-Resource-Policy: cross-origin
Os recursos marcados como cross-origin
podem ser carregados por qualquer site. (Este
value foi adicionado ao
especificação CORP com COEP.)
Política de abertura de origem cruzada
Política de abertura de origem cruzada
(COOP) permite garantir
que uma janela de nível superior seja isolada de outros documentos colocando-os em um
grupo de contexto de navegação diferente, para que não possam interagir diretamente com o
janela de nível superior. Por exemplo, se um documento com COOP abrir um pop-up, o
A propriedade window.opener
será null
. Além disso, a propriedade .closed
do
a referência do opener a ela retornará true
.
O cabeçalho Cross-Origin-Opener-Policy
aceita três valores possíveis:
Cross-Origin-Opener-Policy: same-origin
Os documentos marcados como same-origin
podem compartilhar o mesmo contexto de navegação
grupo com documentos de mesma origem que também estão explicitamente marcados como same-origin
.
Cross-Origin-Opener-Policy: same-origin-allow-popups
Um documento de nível superior com same-origin-allow-popups
retém referências a qualquer
dos pop-ups que não definem COOP ou que recusam o isolamento
definindo um COOP de unsafe-none
.
Cross-Origin-Opener-Policy: unsafe-none
unsafe-none
é o padrão e permite que o documento seja adicionado ao bloco de
grupo de contexto de navegação, a menos que o próprio abridor tenha um COOP de same-origin
.
Resumo
Se você quiser ter acesso garantido a recursos avançados, como SharedArrayBuffer
,
performance.measureUserAgentSpecificMemory()
ou alta resolução
timers com melhor precisão, lembre-se
de que seu documento precisa usar COEP com o valor de require-corp
e
COOP com o valor de same-origin
. Na ausência de nenhum dos dois, o navegador
não garantem isolamento suficiente para ativar esses recursos avançados com segurança. Você
pode determinar a situação de sua página verificando se
self.crossOriginIsolated
retorna true
.
Saiba as etapas para implementar isso em Como tornar seu site "de origem cruzada" isolada" usando COOP e COEP.