Proteção CSRF com cabeçalho de origem CORS vs. token CSRF

103

Esta pergunta é sobre a proteção apenas contra ataques de Cross Site Request Forgery.

É especificamente sobre: ​​A proteção por meio do cabeçalho de origem (CORS) é tão boa quanto a proteção por meio de um token CSRF?

Exemplo:

  • Alice está logada (usando um cookie) com seu navegador em " https://example.com ". Presumo que ela use um navegador moderno.
  • Alice visita " https://evil.com ", e o código do lado do cliente do evil.com realiza algum tipo de solicitação para " https://example.com " (cenário CSRF clássico).

Assim:

  • Se não verificarmos o cabeçalho Origin (lado do servidor) e nenhum token CSRF, temos uma falha de segurança CSRF.
  • Se verificarmos um token CSRF, estamos seguros (mas é um pouco tedioso).
  • Se verificarmos o cabeçalho Origin, a solicitação do código do lado do cliente do evil.com deve ser bloqueada da mesma forma que seria ao usar um token CSRF - exceto se for possível de alguma forma para o código do evil.com definir o cabeçalho Origin.

Eu sei que isso não deveria ser possível com XHR (veja, por exemplo, Segurança para compartilhamento de recursos de origem cruzada ), pelo menos não, se confiarmos que a especificação W3C será implementada corretamente em todos os navegadores modernos (podemos?)

Mas e quanto a outros tipos de solicitações - por exemplo, envio de formulário? Carregando uma tag script / img / ...? Ou qualquer outra maneira que uma página possa usar para (legalmente) criar uma solicitação? Ou talvez algum hack JS conhecido?

Nota: não estou falando sobre

  • aplicativos nativos,
  • navegadores manipulados,
  • erros de cross site scripting na página de example.com,
  • ...
Chris Lercher
fonte
1
Acredito que muitos proxies retiram o cabeçalho de origem.
thefourtheye
E para as tags de envio de formulário e img / script, devemos confiar nos CSPs, mas não temos certeza sobre os navegadores antigos.
thefourtheye
3
@thefourtheye: Uma vez que a conexão é iniciada por TLS, o usuário tem um problema muito mais urgente do que CSRF se um proxy pode man-in-the-middle ele / ela.
Perseidas de
2
@thefourtheye, por que eles se despiriam Origin? Isso anularia a proteção CORS.
Paul Draper
1
Eu gosto dessa pergunta e de suas respostas porque são sobre algo específico, mas também me lembram da diferença entre CSRF e CORS. (Admito que esses conceitos não são facilmente confundíveis ... Mas ainda consigo confundi-los.)
The Red Pea

Respostas:

41

sabemos que isso não deveria ser possível com XHR (veja, por exemplo, Segurança para compartilhamento de recursos de origem cruzada), pelo menos não, se confiarmos que a especificação W3C será implementada corretamente em todos os navegadores modernos (podemos?)

No final do dia, você deve "confiar" no navegador do cliente para armazenar com segurança os dados do usuário e proteger o lado do cliente da sessão. Se você não confia no navegador do cliente, deve parar de usar a web para qualquer coisa que não seja conteúdo estático. Mesmo com o uso de tokens CSRF, você está confiando no navegador do cliente para obedecer corretamente à política da mesma origem .

Embora tenha havido vulnerabilidades de navegador anteriores, como aquelas no IE 5.5 / 6.0, onde era possível para os invasores contornar a política da mesma origem e executar ataques, você normalmente pode esperar que eles sejam corrigidos assim que descobertos e com a maioria dos navegadores sendo atualizados automaticamente , este risco será principalmente mitigado.

Mas e quanto a outros tipos de solicitações - por exemplo, envio de formulário? Carregando uma tag script / img / ...? Ou qualquer outra maneira que uma página possa usar para (legalmente) criar uma solicitação? Ou talvez algum hack JS conhecido?

O Origincabeçalho é normalmente enviado apenas para solicitações XHR entre domínios. Os pedidos de imagem não contêm o cabeçalho.

Nota: não estou falando sobre

  • aplicativos nativos,

  • navegadores manipulados,

  • erros de cross site scripting na página de example.com,

Não tenho certeza se isso cai em navegadores manipulados ou não, mas as versões antigas do Flash permitiam a configuração de cabeçalhos arbitrários que permitiriam a um invasor enviar uma solicitação com um referercabeçalho falsificado da máquina da vítima para executar um ataque.

SilverlightFox
fonte
O exemplo do Flash é bom - e talvez outros plug-ins possam ter uma vulnerabilidade semelhante. Só posso (infelizmente) proteger Alice de CSRF, se ela usar um navegador moderno etc, isso está claro. Mas não é irracional que, mesmo como um usuário preocupado com a segurança, ela possa ter instalado plug-ins de terceiros - especialmente quando eles são de grandes empresas (confiáveis). Mesmo que eles escrevam plug-ins seguros, não estou 100% convencido, se eles também pensam em CSRF! Portanto, a menos que os sandboxes do navegador restrinjam os plug-ins de violar o SOP (talvez eles?), Eu prefiro recomendar o token CSRF.
Chris Lercher
@ChrisLercher: Sim, os plug-ins modernos parecem um pouco mais robustos. No entanto, a qualquer momento, uma nova versão pode ser lançada, permitindo que um invasor a aproveite de forma a contornar as proteções do navegador. A melhor maneira de lidar com isso (por exemplo, token / cabeçalho) dependerá da sensibilidade de seus dados e se esse risco é aceitável. O Flash obedece a um SOP, mas a origem de um plugin do Flash é o site de onde foi carregado (em vez do site de chamada, como o JavaScript). Existe um crossdomain.xmlque pode permitir a comunicação entre domínios.
SilverlightFox
27

O conteúdo da web não pode interferir no cabeçalho Origin. Além disso, sob a mesma política de origem, uma origem não pode nem mesmo enviar cabeçalhos personalizados para outras origens. [1]

Portanto, verificar o cabeçalho Origin é tão bom para bloquear ataques quanto usar um token CSRF.

A principal preocupação em confiar é se isso permite que todas as solicitações legítimas funcionem. O autor da pergunta sabe sobre esse problema e configurou a questão para descartar os casos principais (sem navegadores antigos, apenas HTTPS).

Os fornecedores de navegadores seguem essas regras, mas e os plug-ins? Talvez não, mas a questão desconsidera "navegadores manipulados". E quanto aos bugs no navegador que permitem que um invasor falsifique o cabeçalho Origin? Pode haver bugs que permitem que o token CSRF vaze entre as origens também, então seria mais trabalhoso argumentar que um é melhor do que o outro.

convidado
fonte
5
Acabei de testar o Firefox 47 e ele não envia um cabeçalho de origem para uma postagem de formulário de origem cruzada (uma maneira comum de atacar serviços REST que não habilitam CORS para XHR), então não acho que uma verificação de cabeçalho de origem seria eficaz se o usuário estiver usando o Firefox.
Andy
3
Para referência, o problema de o Firefox não enviar um cabeçalho "Origin" é rastreado no Bugzilla: bugzilla.mozilla.org/show_bug.cgi?id=446344 Você poderia voltar a verificar o cabeçalho "Referer" neste caso, mas em minha experiência alguns Os usuários do Firefox bloqueiam o cabeçalho "Referer" por questões de privacidade (embora, IMHO, seja o suficiente para remover o caminho e a consulta).
Steffen