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 a esse processo. Essas vulnerabilidades foram nomeadas de Spectre e Meltdown. O que o Chrome está fazendo para manter a Web segura e o que os desenvolvedores da Web precisam fazer nos próprios sites?
Resumo
Como usuário que navega na Web, mantenha seu sistema operacional e seu 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 aconselha:
- Sempre que possível, evite que os cookies entrem na memória do processo de renderização
usando os atributos de cookie
SameSite
eHTTPOnly
e evitando a leitura dedocument.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. Assim, você vai aproveitar ao máximo o bloqueio de leitura entre origens para usuários que têm o isolamento de site ativado. - Ative o isolamento de sites e avise a equipe do Chrome se ele causar problemas para seu site.
Se você está se perguntando por que essas etapas ajudam, continue lendo.
O risco
Há uma grande variedade de explicações sobre essas vulnerabilidades, então não vou adicionar mais uma. Se você tem interesse em saber como essas vulnerabilidades podem ser exploradas, recomendo conferir a postagem do blog dos meus colegas da equipe do Google Cloud.
O Meltdown e o Spectre podem permitir que um processo leia a memória que
não deveria. Às vezes, vários documentos de sites diferentes
podem compartilhar um processo no Chrome. Isso pode acontecer quando uma página é aberta
pela outra usando window.open
, <a href="..." target="_blank">
ou iframes. Se um
site tiver dados específicos do usuário, é possível que outro site
use essas novas vulnerabilidades para ler esses dados.
Mitigações
A equipe de engenharia do Chrome e do V8 está fazendo vários esforços para mitigar 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 o código controlado pelo invasor. A equipe do Chrome está trabalhando em um recurso chamado Isolamento de sites para conseguir isso:
O isolamento de sites ainda não foi ativado por padrão porque há alguns
problemas conhecidos
e a equipe do Chrome quer fazer o máximo de testes em campo possível. Se você é um
desenvolvedor da Web, ative o isolamento de sites e verifique se o site
continua funcional. Se quiser ativar agora, ative
chrome://flags#enable-site-per-process
. Se você encontrar um site que não funciona,
ajude a registrar um bug e mencione que
o isolamento de site está ativado.
Bloqueio de documentos entre sites
Mesmo quando todas as páginas entre sites são colocadas em processos separados, elas ainda podem solicitar legitimamente alguns subrecursos entre sites, como imagens e JavaScript. Para evitar o vazamento de informações sensíveis, o isolamento do site inclui um recurso de bloqueio de documentos entre sites que limita quais respostas de rede são enviadas ao processo de renderização.
Um site pode solicitar dois tipos de dados de um servidor: "documentos" e "recursos". Aqui, os documentos são arquivos HTML, XML, JSON e 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 itens como imagens, JavaScript, CSS e fontes. Os recursos podem ser incluídos em qualquer site.
A política de bloqueio de documentos entre sites impede que um processo receba "documentos" de outras origens se:
- Eles têm um tipo MIME HTML, XML, JSON ou text/plain e
- 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. - 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 aconteça em segundo plano.
Por exemplo: imagine que um invasor cria uma tag <img>
que inclui um arquivo JSON
com dados sensíveis, como <img src="https://yourbank.com/balance.json">
.
Sem o isolamento de site, o conteúdo do arquivo JSON seria enviado para a
memória do processo do renderizador, momento em que ele percebe que não é um
formato de imagem válido e não renderiza uma imagem. Com o Spectre, no entanto, agora há
uma maneira de ler esse pedaço de memória. O bloqueio de documentos entre sites
impediria que o conteúdo desse arquivo entrasse 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, há muitos arquivos JavaScript e CSS que são
enviados com 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. Esse sniffing é imperfeito. 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 respostas.
Se você quiser tentar 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 o yourbank.com tiver
armazenado um cookie que faça o login do usuário automaticamente. Os cookies geralmente são enviados
para todas as solicitações ao site que define o cookie, mesmo que a solicitação seja
feita por terceiros usando uma tag <img>
. Os cookies SameSite são um novo atributo
que especifica que um cookie só pode ser anexado a uma solicitação que
origina do mesmo site, daí o nome. Infelizmente, no momento da redação deste artigo, somente o Chrome e o Firefox 58 ou mais recentes são 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,
há 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 ao cookie
por script do lado do cliente em navegadores compatíveis, como o Chrome. Se não for possível definir
HTTPOnly
, você poderá limitar a exposição de dados de carregamento de cookies
ao processo renderizado, não lendo document.cookie
, a menos que seja
absolutamente necessário.
Abrir links externos usando rel="noopener"
Quando você vincula a outra página usando target="_blank"
, a página aberta tem acesso ao seu objeto window
,
pode navegar para um URL diferente e, sem o isolamento do site, estará no
mesmo processo que sua página. Para proteger melhor sua página, os links para páginas externas
que são abertos em uma nova janela sempre precisam especificar rel="noopener"
.
Temporizadores 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 timer confiável e preciso.
Uma das APIs oferecidas pela plataforma da Web é
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 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 de instruções da CPU criada especificamente. A equipe do V8 implementou mitigações para provas de conceito de ataques conhecidos 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 prejudicar o desempenho.
Como manter a Web segura
Há muita incerteza em relação à descoberta do Spectre e do Meltdown e suas implicações. Esperamos 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 atuais. Se tiver dúvidas, entre em contato pelo Twitter.