Same Origin Policy

Eventualmente eu faço apresentações e treinamentos para clientes da Microsoft, e em muitos casos de segurança em desenvolvimento de código. E nestes casos uma das coisas curiosas que eu percebi é como é dificil para algumas pessoas entenderem como funciona um ataque de cross-site scripting , que talvez seja de longe a vulnerabilidade mais comum em sites Web.

Certamente um motivo deve estar nas minhas (falta de) qualidades como instrutor, mas uma outra causa é que desenvolvedores e técnicos em geral não sabem como funciona o modelo de segurança dos navegadores Web,  em especial o que chamamos de same-origin policy. A same-origin policy surgiu no Netscape Navigator 2.0 e define a fronteira de segurança um script JavaScript carregado por uma página Web, especificando o que o script pode ou não fazer. Ataques como cross-site scripting ou cross-site request forgery nada mais são do ataques uasdos para violar a same-origin policy.

A same-origin policy é muito simples de ser enunciada: quando o navegador carrega uma página vindo de uma determinada origem, os scripts carregados a partir de uma origem diferente não podem ter acesso a certas propriedades dessa página. Essas propriedades que só podem ser acessadas por scripts vindos da mesma origem incluem os cookies, dados de formulário, URL e título da página. Esta fronteira só pode ser ultrapassada por um script que esteja assinado digitalmente, o que na prática nunca acontece porque o Internet Explorer felizmente não suporta este recurso.

Mas como os navegadores fazem para determinar a origem do script? Em princípio, um script tem a mesma origem de uma página Web se ambos vêm do mesmo domínio, porta e protocolo. Por exemplo, vamos supor que um script seja carregado pela página https://store.company.com/dir/page.html. A tabela abaixo mostra o comportamento do navegador caso o script tente acessar as propriedades das páginas abaixo:

URL Resultado Motivo
 https://store.company.com/dir2/other.html
Sucesso
 https://store.company.com/dir/inner/another.html
Success
 https://store.company.com/secure.html
Falha Protocolo diferente
 https://store.company.com:81/dir/etc.html
Falha Porta diferente
 https://news.company.com/dir/other.html
Falha Domínio diferente

Parece simples então, mas não é. O blog The Art of Software Security Assessment, mantido pelos autores do excelente livro de mesmo nome, tem um ótimo post sobre este assunto onde são mostrados todos os problemas existentes na forma como os navegadores implementam a same-origin policy, incluindo problemas com domínios internacionais (como o .br) que são de particular importância aqui para o Brasil. Vale a pena ler.