Derretimento/Espectro

Visão geral

Em 3 de janeiro, o Projeto Zero revelou vulnerabilidades em CPUs modernas que um processo pode usar para ler (ou pior) memória arbitrária, incluindo memória que não pertence a esse 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 da Web devem fazer nos seus próprios sites?

Texto longo, leia o resumo

Como um usuário que navega na Web, mantenha o sistema operacional e o navegador atualizados. Além disso, os usuários do Chrome podem ativar o Isolamento de sites.

Se você é um desenvolvedor da 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 sensível ou específico do usuário para aproveitar ao máximo o bloqueio de leitura entre origens para os usuários que ativaram o isolamento de sites.
  • 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 ajudam, continue lendo.

O risco

Houve muitas explicações para essas vulnerabilidades, então não vou adicionar outra. Se você tiver interesse em saber como essas vulnerabilidades podem ser exploradas, recomendo conferir a postagem do blog (em inglês) de meus colegas da equipe do Google Cloud.

Tanto o Meltdown quanto o Spectre permitem que um processo leia uma memória que ele não deveria conseguir. Às vezes, vários 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 contém dados específicos do usuário, há uma chance de que outro site possa usar essas novas vulnerabilidades para ler esses dados do usuário.

Mitigações

As equipes de engenharia do Chrome e do V8 estão implementando várias ações para mitigar essa ameaça.

Isolamento de sites

O impacto da exploração do Spectre pode ser bastante reduzido ao impedir que dados sensíveis compartilhem um processo com 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 foi ativado por padrão porque há alguns problemas conhecidos, e a equipe do Chrome quer a maior quantidade possível de testes de campo. Se você é um desenvolvedor da Web, ative o isolamento de sites e verifique se ele continua funcionando. Se você quiser ativar agora, ative chrome://flags#enable-site-per-process. Se você encontrar um site que não funciona, informe 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 que informações confidenciais vazem essas informações, o isolamento de sites inclui um recurso de bloqueio de documentos 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, os 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 texto/tipo MIME simples e
  2. Eles têm um cabeçalho de resposta HTTP X-Content-Type-Options: nosniff ou uma análise de conteúdo rápida ("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 ao processo como vazios, embora a solicitação ainda ocorra em segundo plano.

Por exemplo: imagine que um invasor crie uma tag <img> que inclua um arquivo JSON com dados confidenciais, como <img src="https://yourbank.com/balance.json">. Sem o Isolamento de sites, o conteúdo do arquivo JSON chegaria à memória do processo do renderizador. Nesse momento, o renderizador percebe que 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 esse pedaço de 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 acidentalmente marcados como documentos, o Chrome tenta detectar a resposta para garantir que o tipo MIME esteja correto. Essa detecção é imperfeita. Portanto, se você tem 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 seubanco.com tiver armazenado um cookie que faz login do usuário automaticamente. Os cookies normalmente são enviados para todas as solicitações feitas ao site que define o cookie, mesmo que a solicitação seja feita por terceiros usando uma tag <img>. Cookies SameSite são um novo atributo que especifica que um cookie só deve ser anexado a uma solicitação originada no mesmo site. Por isso, ele recebe esse nome. No momento em que este artigo foi escrito, apenas o Chrome e o Firefox 58 ou versões mais recentes têm suporte a esse atributo.

HTTPOnly e document.cookie

Se os cookies do seu site forem usados apenas no lado do servidor, 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 que o cookie seja acessado pelo script do lado do cliente em navegadores compatíveis, como o Chrome. Se não for possível definir HTTPOnly, você poderá ajudar a limitar a exposição do carregamento de dados de cookies ao processo renderizado não lendo document.cookie, a menos que seja absolutamente necessário.

Quando você vincula a outra página usando target="_blank", a página aberta tem acesso ao seu objeto window, pode navegar na sua página para um URL diferente e, sem o isolamento de sites, o processo será o mesmo. Para proteger melhor sua página, os links para páginas externas que são abertas em uma nova janela sempre precisam 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 que a plataforma da Web oferece é a performance.now(), que tem precisão de cinco microssegundos. Como mitigação, todos os principais navegadores diminuíram a resolução de performance.now() para dificultar a montagem dos ataques.

Outra maneira de conseguir 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 implementadas.

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 ataque conhecidas e está trabalhando em mudanças no TurboFan, o compilador de otimização dele, 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 a performance.

Como manter a Web segura

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