O que é CSRF? Como Podemos Prevenir CSRF?

January 23, 2024

Technology

Na era digital, a Internet se entrelaçou no tecido de nossas vidas cotidianas. Migramos inúmeras atividades para o ambiente online, desde compras até interações sociais em várias plataformas e transações bancárias. À medida que as interações financeiras se tornam mais difundidas, as ramificações da segurança da rede se tornaram mais evidentes. Uma das ameaças cibernéticas mais prevalentes na Internet é o CSRF (Cross-site request forgery), e é essencial explorar suas nuances.

O que é CSRF?

Ataques CSRF exploram vulnerabilidades nos mecanismos de validação de solicitações de um site alvo. Em certas situações, os usuários executam inadvertidamente solicitações maliciosas enquanto estão logados no site alvo. Os atacantes geralmente empregam endereços semelhantes ao domínio do site alvo, atraindo os usuários a clicar. Eles incorporam códigos maliciosos ao disfarçá-los como carregamentos de imagens ou formulários ocultos, iniciando solicitações ao site alvo e executando ações não autorizadas de forma oculta. Objetivos como alterar senhas de usuários ou iniciar transferências bancárias não autorizadas podem resultar em perdas significativas para os usuários.

Exemplo da Vida Real

Imagine um site chamado e-bank.com que oferece serviços bancários eletrônicos, com uma página chamada /transfer para enviar solicitações de transferência. Quando os usuários acessam a página e-bank.com/transfer, um formulário exibindo os detalhes inseridos pelo usuário é apresentado. Após o preenchimento e envio do formulário, uma solicitação HTTP POST é enviada para o endereço da página, carregando parâmetros como o destinatário e o valor inserido pelo usuário.

Nesse momento, um atacante pode construir uma página maliciosa com um formulário invisível, direcionando o endereço de envio para e-bank.com/transfer. O atacante preenche o formulário com os parâmetros específicos de destinatário e valor. Quando os usuários são enganados a clicar nessa página maliciosa, o navegador executa o código JavaScript, enviando o formulário.

Se o usuário não estiver registrado ou logado no e-bank.com, a solicitação de transferência não pode ser executada. No entanto, se o usuário tiver usado o serviço recentemente e o status de login persistir, a solicitação de transferência pode ser executada com sucesso.

Isso encapsula os ataques CSRF—simples em princípio, mas com um potencial imenso de dano. Felizmente, existem vários métodos maduros para impedir tais ataques. Vamos explorá-los abaixo.

Como Podemos Prevenir o CSRF?

Abordar esse problema envolve medidas proativas e passivas.

Restrição de Método HTTP e Restrição de Referer

Como desenvolvedores, podemos impor restrições mais rígidas em endereços sensíveis dentro do serviço, como:

  • Para endereços que exigem envio de dados, proibir o uso de solicitações HTTP GET, obrigando o uso de solicitações POST. Isso aumenta a complexidade para os atacantes que tentam construir páginas maliciosas.

  • Além disso, podemos restringir o campo Referer no cabeçalho da solicitação HTTP (Referer), permitindo apenas de endereços legítimos conhecidos e bloqueando solicitações maliciosas.

Essa é uma medida protetiva proativa simples, com um custo menor, mas ainda com alguma suscetibilidade a ataques.

Token CSRF

O Token CSRF é uma solução amplamente adotada, combinando mecanismos de sessão do lado do servidor para impedir ataques CSRF. Especificamente, o programa do servidor incorpora um campo de entrada oculto em páginas que exigem proteção com um Token CSRF gerado aleatoriamente no formulário de saída. Simultaneamente, uma sessão é criada no lado do servidor, armazenando essa string aleatória com um tempo de expiração.

Quando um usuário solicita a página, o servidor inicializa a sessão, armazenando dados no lado do servidor e definindo um cookie no navegador do cliente contendo o ID da Sessão para associação. O Token CSRF é armazenado na sessão. Após o envio do formulário, o Token CSRF é enviado. O programa do servidor compara esse token com a parte armazenada na sessão. A validação bem-sucedida leva à execução da lógica subsequente; caso contrário, um erro é retornado. Simultaneamente, um novo Token CSRF é inserido no formulário para o próximo envio.

Essa é uma medida protetiva proativa, exigindo algum esforço, mas fornecendo proteção robusta.

Proteção de Origem Cruzada

Frequentemente encontramos uma tecnologia chamada CORS (Compartilhamento de Recursos de Origem Cruzada), uma especificação que indica se os navegadores permitem solicitações de origem cruzada. Navegadores modernos suportam essa especificação. Ao iniciar uma solicitação Fetch/XHR em uma página existente, o navegador envia uma solicitação HTTP OPTIONS para verificar previamente se o serviço alvo permite solicitações do endereço de origem atual. O servidor fornecerá uma lista de cabeçalhos de resposta, especificando origens permitidas, métodos de solicitação e cabeçalhos. O navegador adere a essas indicações, impedindo solicitações proibidas no lado do cliente.

Essa é outra medida protetiva proativa, configurável no lado do servidor, mas observe que, embora os usuários normais provavelmente não desativem esse recurso, isso ainda é possível no lado do cliente.

Bloqueio de Cookies de Terceiros

Os serviços que desenvolvemos às vezes armazenam IDs de Sessão de usuários em Cookies para manter o status de login. Os Cookies suportam configurações SameSite, impedindo que o navegador envie cookies para sites de origem cruzada. Tentativas de ataques CSRF resultam em um status não autenticado no site alvo.

Além disso, devido ao uso indevido de mecanismos de Cookies HTTP para rastreamento de clientes, os desenvolvedores de navegadores decidiram restringir e bloquear gradualmente cookies de terceiros (Contagem Regressiva de Cookies). Quando uma página no domínio A tenta fazer uma chamada para o domínio B, mesmo que passe pelas verificações das regras CORS, o navegador não enviará cookies para esse site de origem cruzada.

Exemplo de Linha do Tempo do Chrome

Resumo

Como gateways de API, tanto o Apache APISIX quanto o API7 Enterprise suportam Token CSRF e CORS—duas medidas protetivas mencionadas anteriormente—para impedir ataques CSRF.

Em conclusão, prevenir ataques CSRF exige uma abordagem multifacetada, incorporando várias técnicas no lado do servidor, navegador, protocolo HTTP e mais para alcançar proteção abrangente.

Tags: