Esquecer ou usar indevidamente o cabeçalho Cache-Control pode afetar negativamente a segurança do seu site e a privacidade dos usuários.
Por padrão, os recursos sempre podem ser armazenados em cache por qualquer tipo de cache.
Não usar ou usar indevidamente o cabeçalho Cache-Control
pode afetar negativamente a
segurança do seu site e a privacidade dos usuários.
Para respostas personalizadas que você quer manter em sigilo, recomendamos:
- Impeça que os intermediários armazenem o recurso em cache. Defina
Cache-Control: private
. - Defina uma chave de cache
secundária adequada.
Se a resposta variar devido a cookies, o que pode acontecer quando o
cookie armazena credenciais, defina
Vary: Cookie
.
Continue lendo para saber por que isso é importante e descobrir:
- Problemas de segurança e privacidade que você talvez não conheça
- Diferentes tipos de caches HTTP e equívocos comuns
- Ações recomendadas para sites de alto valor
Riscos de segurança e privacidade relacionados ao cache
Recursos com vazamento de vulnerabilidades Spectre
A vulnerabilidade
Spectre
permite que uma página leia a memória de um processo do SO. Isso significa que um invasor pode
ter acesso não autorizado a dados de várias origens. Como consequência, os navegadores da Web
modernos restringiram o uso de alguns recursos, como
SharedArrayBuffer
ou timer de alta resolução,
para páginas com isolamento de origem
cruzada.
Os navegadores da Web modernos aplicam a política de incorporador entre origens (COEP, na sigla em inglês). Isso garante que os recursos de origem cruzada sejam:
- Recursos públicos solicitados sem cookies
- Recursos explicitamente permitidos para compartilhamento entre origens, via CORS ou o cabeçalho CORP.
A configuração de COEP não impede que um invasor explore o Spectre. No entanto, ele
garante que os recursos de origem cruzada não sejam valiosos para o invasor (quando carregados
pelo navegador como recurso público) ou que não possam ser compartilhados com o invasor (quando compartilhados com
CORP: cross-origin
).
Como o armazenamento em cache HTTP afeta o Spectre?
Se o cabeçalho Cache-Control
não estiver definido corretamente, um invasor poderá executar um
ataque. Exemplo:
- O recurso com credenciais é armazenado em cache.
- O invasor carrega uma página isolada entre origens.
- O invasor solicita o recurso novamente.
COEP:credentialless
é definido pelo navegador, para que o recurso seja buscado sem cookies. No entanto, um cache pode retornar a resposta de credencial.- O invasor pode ler o recurso personalizado usando um ataque Spectre.
Embora o cache HTTP de um navegador da Web não permita que esse tipo de ataque aconteça na prática, outros caches existem fora do controle imediato do navegador. Isso pode levar ao sucesso do ataque.
Equívocos comuns sobre caches HTTP
1. Os recursos são armazenados em cache apenas pelo navegador
Geralmente, há várias camadas de cache. Alguns caches são dedicados a um usuário, outros a vários usuários. Algumas são controladas pelo servidor, outras pelo usuário e outras por intermediários.
- Caches do navegador. Esses caches são de propriedade e dedicados a um único usuário, implementado no navegador da Web. Eles melhoram o desempenho evitando buscar a mesma resposta várias vezes.
- Proxy local. Ele pode ter sido instalado pelo usuário, mas também pode ser gerenciado por intermediários: a empresa, a organização ou o provedor de Internet. Os proxies locais geralmente armazenam em cache uma única resposta para vários usuários, o que constitui um cache "público". Os proxies locais têm várias funções.
- Cache do servidor de origem / CDN. Isso é controlado pelo servidor. O objetivo do cache do servidor de origem é reduzir a carga no servidor de origem armazenando em cache a mesma resposta para vários usuários. As metas de um CDN são semelhantes, mas estão espalhadas pelo mundo e atribuídas ao conjunto de usuários mais próximo para reduzir a latência.

2. O SSL impede que os intermediários armazenem em cache os recursos HTTPS
Muitos usuários usam regularmente proxies configurados localmente, seja para fins de acesso, como compartilhar uma conexão limitada, inspeção de vírus ou prevenção contra perda de dados (DLP, na sigla em inglês). O cache intermediário está realizando a interceptação de TLS.
Um cache intermediário geralmente é instalado nas estações de trabalho de um funcionário da empresa. Os navegadores da Web são configurados para confiar nos certificados do proxy local.
Alguns recursos HTTPS podem ser armazenados em cache por esses proxies locais.
Como o cache HTTP funciona
- Por padrão, os recursos são implicitamente permitidos de serem armazenados em cache.
- A chave de cache principal consiste no URL e no método. (URL, método)
- A chave de cache
secundária são
os cabeçalhos incluídos no cabeçalho
Vary
.Vary: Cookie
indica que a resposta depende doCookie
. - O cabeçalho
Cache-Control
oferece um controle mais granular.
Siga estas recomendações para seu site
Os desenvolvedores de sites de alto valor, que incluem sites com tráfego alto e que interagem com informações de identificação pessoal, precisam agir agora para melhorar a segurança.
O maior risco ocorre quando o acesso a um recurso varia de acordo com os cookies. Um cache intermediário pode retornar uma resposta solicitada com cookies para uma solicitação que não foi feita se nenhuma ação preventiva tiver sido realizada.
Recomendamos que você siga uma destas etapas:
- Impeça que os intermediários armazenem o recurso em cache. Defina
Cache-Control: private
. - Defina uma chave de cache
secundária adequada.
Se a resposta variar devido a cookies, o que pode acontecer quando o
cookie armazena credenciais, defina
Vary: Cookie
.
Especifique sempre Cache-Control
ou
Vary
.
Outras considerações
Há outros tipos de ataques semelhantes que usam o cache HTTP, mas eles dependem de um mecanismo diferente do isolamento entre origens. Por exemplo, Jake Archibald descreve alguns ataques em Como vencer o CORS.
Esses ataques são mitigados por alguns navegadores da Web que dividem o cache HTTP dependendo se a resposta do recurso foi solicitada com credenciais ou não. Em 2022, o Firefox divide o cache, mas o Chrome e o Safari não. O Chrome pode dividir o cache no futuro. Observe que esses ataques são diferentes e complementares para dividir por origem de nível superior.
Mesmo que esse problema possa ser mitigado para navegadores da Web, ele permanecerá nos caches de proxy locais. Portanto, ainda sugerimos que você siga as recomendações acima.
Foto do cabeçalho de Ben Pattinson no Unsplash.