O que impede o código malicioso de falsificar o cabeçalho "Origem" para explorar o CORS?

142

Pelo que entendi, se um script do lado do cliente em execução em uma página do foo.com deseja solicitar dados do bar.com, na solicitação deve especificar o cabeçalho Origin: http://foo.come a barra deve responder Access-Control-Allow-Origin: http://foo.com.

O que existe para impedir que códigos maliciosos do site roh.com simplesmente falsifiquem o cabeçalho Origin: http://foo.compara solicitar páginas da barra?

Jay Lamont
fonte
2
Acredito que o ponto é que o domínio original de onde a página é veiculada (aqui foo.com) precisa fornecer o Access-Control-Allow-Origincabeçalho ou o navegador não permite a solicitação bar.com.
Chris Hayes
2
A leitura deste post realmente me ajudou a entender o processo cors entre o navegador, o servidor de origem e o servidor de destino. html5rocks.com/en/tutorials/cors
brendonparker
5
@ChrisHayes Não é assim que o CORS funciona. Você pode ler um pouco mais sobre isso, analisando as especificações ou esta ótima página wiki da MDN sobre o assunto .
precisa saber é o seguinte
1
@brendonparker Sim, esse é um ótimo artigo. Esse autor responde muitas perguntas do CORS no SO e também mantém o enable-cors.org .
precisa saber é o seguinte
4
@RayNicholus Interessante, eu estava claramente longe. Obrigado pelos links. A julgar pelos votos no meu comentário, não sou o único que sofre com essa ilusão. Espero que esses dois voltem e aprendam (e removem seus votos!).
Chris Hayes

Respostas:

149

Os navegadores controlam a configuração do Origincabeçalho e os usuários não podem substituir esse valor. Portanto, você não verá o Origincabeçalho falsificado em um navegador. Um usuário mal-intencionado pode criar uma solicitação de ondulação que defina manualmente o Origincabeçalho, mas essa solicitação viria de fora de um navegador e pode não ter informações específicas do navegador (como cookies).

Lembre-se: o CORS não é segurança. Não confie no CORS para proteger seu site. Se você estiver exibindo dados protegidos, use cookies ou tokens OAuth ou algo diferente do Origincabeçalho para proteger esses dados. O Access-Control-Allow-Origincabeçalho no CORS apenas determina quais origens devem ser permitidas para fazer solicitações de origem cruzada. Não confie nele para mais nada.

Monsur
fonte
3
Isso faz muitosentido. Se o navegador não permitir que o JavaScript substitua o cabeçalho Origin, não há problema. Se você estiver executando solicitações de fora do navegador, não terá os cookies. Acho que fiquei confuso porque em todos os documentos que estava lendo, em nenhum lugar ele disse explicitamente que o cabeçalho do Origin não podia ser substituído. Obrigado!
Jay Lamont
41
Se alguém quiser falsificar algo, pode fazê-lo. Usando praticamente qualquer linguagem de script, eles podem criar solicitações http. Perl e Python têm bibliotecas http, o que facilita bastante isso. As bibliotecas armazenam e enviam cookies, permitem adicionar cabeçalhos arbitrários e fornecer muitas informações de depuração. Portanto, os cabeçalhos do CORS servem apenas para dificultar o javascript mal-intencionado em um fórum que você lê para fazer algo desagradável na sua conta bancária em outro domínio quando estiver conectado aos dois no navegador.
Mnebuerquo 15/01
9
E só para esclarecer, o usuário mal-intencionado pode simplesmente gerar uma instância do navegador que foi corrigida para permitir controle manual sobre o cabeçalho Origin e, em seguida, representar perfeitamente um usuário normal, cookies, AJAX e tudo.
Jordan Rieger
10
"Os navegadores estão no controle da configuração do cabeçalho Origin e o usuário não pode substituir esse valor." Tenho certeza de que é muito fácil usar uma ferramenta como Fiddler2 ou Charles para modificar os cabeçalhos quando a solicitação sair do navegador.
Asa
3
o utilizador mal intencionado poderia simplesmente gerar uma instância de navegador que foi corrigido para permitir o controle manual sobre o cabeçalho de Origem Se você tiver acesso à máquina ao ponto onde você pode 'simplesmente gerar uma instância de navegador remendada' (na verdade não soar tão simples para mim), por que não apenas ler diretamente os cookies do disco? Eles são armazenados em texto simples que você conhece. Na vida real, o script entre sites é uma ameaça real, enquanto o cenário de ataque é apenas artificial e impraticável.
Stijn de Witt
35

TLDR: Não há nada que impeça o código malicioso de falsificar a origem. Quando isso acontece, seu servidor nunca saberá sobre isso e agirá de acordo com as solicitações. Às vezes, esses pedidos são caros. Portanto, não use o CORS no lugar de qualquer tipo de segurança.


Venho brincando com o CORS recentemente e me fiz a mesma pergunta. O que descobri é que o navegador pode ser inteligente o suficiente para conhecer uma solicitação CORS falsificada quando vê uma, mas o servidor não é tão inteligente.

A primeira coisa que descobri foi que o Origincabeçalho é um nome de cabeçalho proibido por HTTP que não pode ser modificado programaticamente. O que significa que você pode modificá-lo em cerca de 8 segundos usando Modify Headers for Google Chrome .

Para testar isso, configurei dois domínios de cliente e um de servidor. Eu incluí uma lista de permissões do CORS no servidor, que permitia solicitações do CORS do cliente 1, mas não do cliente 2. Testei os dois clientes e, de fato, as solicitações do CORS do cliente 1 foram bem-sucedidas enquanto as do cliente 2 falharam.

Então eu falsifiquei o Origincabeçalho do Cliente 2 para corresponder ao Cliente 1. O servidor recebeu o Origincabeçalho falsificado e passou com êxito na verificação da lista de permissões (ou falhou se você é do tipo meio vazio de vidro). Depois disso, o servidor teve um bom desempenho consumindo todos os recursos que foi projetado para consumir (chamadas ao banco de dados, enviando e-mails caros, enviando mensagens sms ainda mais caras, etc.). Quando isso foi feito, o servidor enviou o Access-Control-Allow-Origincabeçalho falsificado de volta para o navegador.

A documentação que li afirma que o Access-Control-Allow-Originvalor recebido deve corresponder Originexatamente ao valor enviado na solicitação. Eles combinaram, então fiquei surpreso ao ver a seguinte mensagem no Chrome:

XMLHttpRequest não pode carregar http://server.dev/test. O cabeçalho 'Access-Control-Allow-Origin' tem um valor http://client1.dev que não é igual à origem fornecida. http://client2.dev Portanto, a origem não é permitida.

A documentação que li não parece ser precisa. A guia de rede do Chrome mostra claramente os cabeçalhos de solicitação e resposta como http://client1.dev, mas você pode ver no erro que o Chrome sabe de alguma forma a origem real http://client2.deve rejeita a resposta corretamente. O que não importa neste momento, porque o servidor já aceitou a solicitação falsificada e gastou meu dinheiro.

Noturno
fonte
2
@ Noturno, obrigado pelo exemplo. Deixe-me adicionar minha observação. O CORS está relacionado aos recursos de segurança do navegador. Se um navegador seguro for modificado a partir de seu estado original, isso poderá ser interpretado como o navegador possivelmente não possui um recurso de segurança.
Luka Žitnik 4/03/2017
10
Não é nada brilhante. Perde completamente o objetivo do CORS. Se você estiver em posição de interceptar solicitações originárias da máquina do usuário, basta ler os cookies, instalar keyloggers, vírus e todas essas outras ameaças reais. O CORS existe para proteger usuários honestos conectados ao site A de um script mal-intencionado que de alguma forma foi injetado no site B. O script no site B (que pode ser um trecho de Javascript em uma postagem do fórum que não foi escapada corretamente pelo site B) é executado ações no site a sob a conta do usuário (por exemplo, material de exclusão etc), utilizando o cookie de sessão a partir do site A.
Stijn de Witt
3
Isso é chamado de script entre sites e sem o CORS poderia ser feito sem a necessidade de obter controle sobre a máquina do usuário. Esse é o ponto. Não foi necessário controle sobre a máquina do usuário porque, ao fazer solicitações ao site A, o navegador costumava adicionar automaticamente o cookie da sessão à solicitação, para que parecesse uma solicitação válida do próprio usuário quando, na verdade, vinha de um script em algum outro local. A política de mesma origem o impede e o CORS é usado para colocar na lista de permissões domínios que devem receber acesso, mesmo que eles estejam em uma origem diferente.
Stijn de Witt
3
@ Noturno Sim, eu estava talvez um pouco grosseiro, desculpe por isso. Seu ponto original permanece. A política de mesma origem é um recurso de segurança do navegador e o CORS é um mecanismo para enfraquecer essa segurança ao incluir alguns domínios na lista de permissões. O OP precisa entender que a falsificação do cabeçalho Origin não é realmente viável como um 'ataque', pois não traz nada que não possa ser obtido com, por exemplo, curl.
Stijn de Witt
3
@ Noturno Acho que sua declaração de abertura é um pouco enganadora. There's nothing stopping malicious code from spoofing the origin-> Sim, o javascript não pode ser definido Origin. Sim, um usuário pode modificar seu navegador / usar o violinista para alterar a origem, mas não é contra isso que o CORS está se defendendo; sites controlados por invasores não podem alterar a origem, o que importa.
precisa saber é o seguinte
12

Apenas um resumo humilde:

P: A mesma política de origem (SOP) é ​​aplicada apenas pelos navegadores?
A: sim Para todas as chamadas feitas dentro de um navegador, o SOP é definitivamente aplicado pelo navegador. O servidor pode ou não verificar a origem da solicitação.

P: Se uma solicitação não estiver em conformidade com o SOP, o navegador a bloqueia?
R: Não, está além da autoridade dos navegadores. Os navegadores apenas enviam solicitações de origem cruzada e aguardam a resposta para ver se a chamada é sinalizada como legítima pelo servidor através de Access-Control- * cabeçalhos. Se o servidor não enviar de volta o Access-Control-Allow-Origincabeçalho, não repetir a origem do chamador ou não enviar de volta *no cabeçalho, tudo o que o navegador fará será abster-se de fornecer a resposta ao chamador.

P: Isso significa que não posso falsificar Origin?
R: No navegador e usando scripts, você não pode substituir Origin, pois está no controle do navegador. No entanto, se você quiser se hackear, poderá violar as chamadas que saem do SEU navegador usando extensões do navegador ou outras ferramentas instaladas em sua máquina. Você também pode emitir HTTPchamadas usando curl, Python, C#, etc e alterar o Origincabeçalho para servidores truque.

P: Então, se eu posso enganar o servidor alterando Origin, isso significa que CORSnão é seguro?
R: CORS por si só é silencioso sobre segurança - isto é, autenticação e autorização de solicitações. Cabe aos servidores inspecionar solicitações e autenticar / autorizá-las por qualquer mecanismo com que trabalhem, como cookies e cabeçalhos. Dito isto, pode nos proteger um pouco mais em caso de ataques como o XSS:

Exemplo: digamos que você fez login no seu site e um script malicioso tenta enviar uma solicitação ao site do seu banco para obter informações sobre seu saldo: um ataque XSS refletido . O site do seu banco confia nas credenciais provenientes (aqui em nome do) do site, para que a solicitação seja autenticada e HTTPseja emitida uma resposta visando o código malicioso. Se o site do seu banco não se importar em compartilhar seus pontos de extremidade com outras origens, ele não incluiAccess-Control-Allow-Origincabeçalho na resposta. Agora, após a chegada da solicitação, o navegador percebe que a solicitação era entre origens, mas a resposta não mostra que o servidor estava feliz em compartilhar o recurso (aqui o ponto de extremidade da consulta de saldo) com seu site. Portanto, ele interrompe o fluxo, portanto, o resultado retornado nunca alcançará o código malicioso.

Alireza
fonte
Bom, melhor / mais claro que a resposta aceita IMO
3dGrabber 30/06