O Origin em que ele confiou: uma reflexão de CORS com credenciais
O desafio
A API de contas da Halcyon responde a requisições do navegador vindas do próprio app web e, para funcionar em alguns domínios, a equipe deixou o servidor decidir a cada requisição. Ele lê o header Origin que o navegador envia e, se parecer um dos seus, devolve esse valor direto como a origem permitida e diz que credenciais são bem-vindas. A página de um atacante pode enviar qualquer Origin que quiser. Mude o Origin para o site do atacante e leia o que a API devolve para ele.
O que você vai aprender
- Explicar o que Access-Control-Allow-Origin e -Allow-Credentials fazem juntos
- Reconhecer que refletir um Origin arbitrário junto com credenciais equivale a permitir todos os sites
- Reproduzir a leitura enviando um Origin do atacante
- Explicar por que o navegador então deixa a página do atacante ler a resposta
- Indicar a correção baseada em allowlist e a proibição de wildcard combinado com credenciais
Habilidades testadas
Pré-requisitos
- A same-origin policy em linhas gerais
- O que é o cabeçalho Origin
Como funciona
O CORS permite que um servidor autorize outras origens específicas a ler suas respostas. O servidor informa a origem permitida em Access-Control-Allow-Origin e pode adicionar Access-Control-Allow-Credentials: true para permitir cookies. O navegador aplica o que o servidor disser.
Refletir o Origin da requisição literalmente nesse cabeçalho, junto com a permissão de credenciais, diz ao navegador que qualquer site que fez a requisição pode ler a resposta com os cookies da vítima. Isso significa todas as origens, que é exatamente o que a regra explícita contra Allow-Origin: * com credenciais pretendia impedir; a reflexão contorna a regra e produz o mesmo efeito.
Uma vítima logada que visita a página do atacante dispara uma requisição com credenciais, e o script do atacante tem permissão para ler o corpo privado.
Erros comuns
- Deixar o origin real do app. Também funciona, mas o ponto é que um site sob seu controle também é aceito.
- Remover o cookie. Sem a sessão da vítima a API retorna 401; o ataque depende de o navegador anexá-lo automaticamente.
- Responder com o valor de um cabeçalho. O prêmio são os dados da conta no corpo, especificamente o email.
- Achar que a same-origin policy protege isso. O servidor a dispensou explicitamente ao refletir o origin e permitir credenciais.
Como se proteger
Valide o origin; nunca o reflita às cegas junto com credenciais.
- Compare o
Origincom uma allowlist estrita e devolva apenas um valor conhecido que tenha correspondido. - Nunca combine
Access-Control-Allow-Credentials: truecom um origin refletido ou wildcard. - Mantenha leituras sensíveis atrás de uma autorização que não dependa da same-origin policy do navegador e restrinja bem o escopo dos cookies.