Derretimento/Espectro

Visão geral

Em 3 de janeiro, o Project Zero revelou vulnerabilidades em CPUs modernas que um processo pode usar para ler (na pior das hipóteses) memória arbitrária, incluindo memória que não pertence ao processo. Essas vulnerabilidades foram chamadas de Spectre e Meltdown. O que o Chrome está fazendo para ajudar a manter a Web segura, e o que os desenvolvedores Web devem fazer pelos próprios sites?

Texto longo, leia o resumo

Como usuário que navega na Web, seu sistema operacional e navegador precisam estar atualizados. Além disso, os usuários do Chrome podem considerar ativar o isolamento de sites.

Se você é um desenvolvedor Web, a equipe do Chrome recomenda:

  • Sempre que possível, evite que os cookies entrem na memória do processo do renderizador usando os atributos de cookie SameSite e HTTPOnly e evitando a leitura de document.cookie.
  • Verifique se os tipos MIME estão corretos e especifique um cabeçalho X-Content-Type-Options: nosniff para todos os URLs com conteúdo confidencial ou específico do usuário. Assim, você aproveita ao máximo o bloqueio de leitura de várias origens para os usuários com o isolamento de sites ativado.
  • Ative o isolamento de sites e informe a equipe do Chrome se isso causar problemas no seu site.

Se você está se perguntando por que essas etapas foram úteis, continue lendo.

O risco

Há várias explicações sobre essas vulnerabilidades, então não vou adicionar outra. Se você tiver interesse em saber como essas vulnerabilidades podem ser exploradas, recomendo consultar a postagem do blog feita por meus colegas da equipe do Google Cloud.

Tanto o Meltdown quanto o Spectre podem permitir que um processo leia a memória que não deveria. Às vezes, documentos de sites diferentes podem acabar compartilhando um processo no Chrome. Isso pode acontecer quando um abre o outro usando window.open, <a href="..." target="_blank"> ou iframes. Se um site tiver dados específicos do usuário, há uma chance de que outro site use essas novas vulnerabilidades para ler os dados do usuário.

Mitigações

As equipes de engenharia do Chrome e do V8 estão implementando vários esforços para reduzir essa ameaça.

Isolamento de sites

O impacto da exploração bem-sucedida do Spectre pode ser bastante reduzido, impedindo que dados sensíveis compartilhem um processo com um código controlado pelo invasor. A equipe do Chrome está trabalhando em um recurso para fazer isso, chamado Isolamento de sites:

O isolamento de sites ainda não está ativado por padrão porque há alguns problemas conhecidos, e a equipe do Chrome quer o máximo de testes de campo possível. Se você é um desenvolvedor Web, ative o isolamento de sites e verifique se ele continua funcionando. Para aceitar agora, ative chrome://flags#enable-site-per-process. Se você encontrar um site que não funciona, registre um bug e informe que o isolamento de sites está ativado.

Bloqueio de documentos entre sites

Mesmo quando todas as páginas entre sites são colocadas em processos separados, as páginas ainda podem solicitar alguns sub-recursos entre sites, como imagens e JavaScript. Para evitar o vazamento dessas informações, o isolamento de sites inclui um recurso de bloqueio entre sites, que limita quais respostas de rede são entregues ao processo do renderizador.

Um site pode solicitar dois tipos de dados de um servidor: "documentos" e "recursos". Aqui, documentos são HTML, XML, JSON e arquivos de texto. Um site pode receber documentos do próprio domínio ou de outros domínios com cabeçalhos CORS permissivos. Os recursos incluem imagens, JavaScript, CSS e fontes. Os recursos podem ser incluídos de qualquer site.

A política de bloqueio de documentos entre sites impede que um processo receba "documentos" de outras origens se:

  1. Eles têm HTML, XML, JSON ou tipo MIME de texto/simples e
  2. Eles têm um cabeçalho de resposta HTTP X-Content-Type-Options: nosniff ou uma análise rápida de conteúdo ("sniffing") confirma que o tipo está correto.
  3. O CORS não permite explicitamente o acesso ao documento

Os documentos bloqueados por essa política são apresentados para o processo como vazios, embora a solicitação ainda aconteça em segundo plano.

Por exemplo: imagine um invasor criando uma tag <img> que inclui um arquivo JSON com dados sensíveis, como <img src="https://yourbank.com/balance.json">. Sem o isolamento de sites, o conteúdo do arquivo JSON chega à memória do processo do renderizador. Nesse momento, o renderizador percebe que esse não é um formato de imagem válido e não renderiza uma imagem. No entanto, com o Spectre, agora há uma maneira de ler potencialmente essa parte da memória. O bloqueio de documentos entre sites impede que o conteúdo desse arquivo entre na memória do processo em que o renderizador está sendo executado, porque o tipo MIME é bloqueado pelo bloqueio de documentos entre sites.

De acordo com as métricas do usuário, muitos arquivos JavaScript e CSS são enviados com os tipos MIME text/html ou text/plain. Para evitar o bloqueio de recursos marcados acidentalmente como documentos, o Chrome tenta detectar a resposta para garantir que o tipo MIME esteja correto. Essa detecção é imperfeita. Portanto, se você tiver certeza de que está definindo os cabeçalhos Content-Type corretos no seu site, a equipe do Chrome recomenda adicionar o cabeçalho X-Content-Type-Options: nosniff a todas as suas respostas.

Se você quiser testar o bloqueio de documentos entre sites, ative o isolamento de sites conforme descrito acima.

SameSite cookies

Vamos voltar ao exemplo acima: <img src="https://yourbank.com/balance.json">. Isso só funciona se yourbank.com tiver armazenado um cookie que faça login do usuário automaticamente. Os cookies geralmente são enviados para todas as solicitações ao site que os definem, mesmo que a solicitação tenha sido feita por um terceiro usando uma tag <img>. Os cookies SameSite são um novo atributo que especifica que um cookie só precisa ser anexado a uma solicitação originada do mesmo site, por isso têm esse nome. No momento, apenas o Chrome e o Firefox 58 e versões mais recentes eram compatíveis com esse atributo.

HTTPOnly e document.cookie

Se os cookies do seu site forem usados apenas no servidor, e não pelo JavaScript do cliente, existem maneiras de impedir que os dados do cookie entrem no processo do renderizador. É possível definir o atributo de cookie HTTPOnly, que impede explicitamente o acesso a ele pelo script do lado do cliente em navegadores compatíveis, como o Chrome. Se não for possível configurar HTTPOnly, limite a exposição do carregamento de dados dos cookies ao processo renderizado não lendo document.cookie, a menos que seja absolutamente necessário.

Quando você vincula outra página usando target="_blank", a página aberta tem acesso ao objeto window, pode direcionar a página para um URL diferente e, sem o isolamento de sites, o processo é o mesmo que a página. Para proteger melhor sua página, os links para páginas externas que são abertas em uma nova janela precisam sempre especificar rel="noopener".

Timers de alta resolução

Para explorar o Meltdown ou o Spectre, um invasor precisa medir quanto tempo leva para ler um determinado valor da memória. Para isso, é necessário um cronômetro confiável e preciso.

Uma API oferecida pela plataforma da Web é a performance.now(), que tem precisão de 5 microssegundos. Como mitigação, todos os principais navegadores diminuíram a resolução de performance.now() para dificultar a ativação dos ataques.

Outra maneira de ter um timer de alta resolução é usar um SharedArrayBuffer. O buffer é usado por um worker dedicado para incrementar um contador. A linha de execução principal lê esse contador e o usa como um timer. Por enquanto, os navegadores decidiram desativar o SharedArrayBuffer até que outras mitigações sejam aplicadas.

V8

Para explorar o Spectre, é necessária uma sequência especificamente criada de instruções de CPU. A equipe do V8 implementou mitigações para provas de conceito de ataques conhecidas e está trabalhando em mudanças no TurboFan, o compilador de otimização, que tornam o código gerado seguro mesmo quando esses ataques são acionados. No entanto, essas mudanças na geração de código podem afetar o desempenho.

Como manter a Web segura

Há muita incerteza sobre a descoberta de Spectre e Meltdown e suas implicações. Espero que este artigo esclareça o que as equipes do Chrome e do V8 estão fazendo para manter a plataforma da Web segura e como os desenvolvedores Web podem ajudar usando os recursos de segurança existentes. Se você tiver alguma dúvida, entre em contato comigo no Twitter.