Segurança no navegador

Propaganda
Coluna do Kurt
COLUNA
Segurança
no navegador
Por mais feio e difícil de tornar seguro que seja o JavaScript, a
situação poderia ser pior – poderíamos estar usando ActiveX.
O
problema do JavaScript – impossível viver com
ele, impossível viver sem ele. A Web moderna
é incrível; consigo pagar minhas contas, comprar um laptop e pedir pizza a partir do meu navegador.
Pra todas essas atividades, preciso de um navegador web
com JavaScript ativado. Sem ele, não consigo ler meus
emails, pagar minhas contas, comprar nada ou visualizar
mais ou menos metade dos sites do planeta. Mas com
ele ativado, os bandidos conseguem:
➧d
escobrir quem eu sou por meio de códigos como
o do Google Analytics;
➧ e xplorar vulnerabilidades de segurança do Firefox
(mais de 120, e crescendo);
➧ r edirecionar-me para sites hostis; e
➧ s equestrar ações, como teclas do teclado e cliques
do mouse.
Eu acabei de dizer que o Firefox tem mais de 120
vulnerabilidades de segurança exploráveis com JavaScript? Sim. E esse número não conta aquelas que ainda
não foram oficialmente categorizadas ou solucionadas.
Um exemplo perfeito de uma delas é o CVE-2009-0253;
usando a ação onmouseover para colocar uma caixa de
2×2 pixels sobre um link clicável, um agressor consegue
redirecionar o visitante para um site arbitrário. Qualquer evento de clique do mouse (ou seja, clicar no que
parece um link ou imagem legítimos) num link resulta
num evento onmouseover que redireciona o visitante para,
bem, onde quer que o agressor deseje:
<div id=”mydiv”
onmouseover=”document.location=’http://www.milw0rm.
➥com’;”
style=”positions:absolute;width:2px;height:2px;
➥background:#FFFFFF;border:0px”></div>
<script>
function updatebox(evt) {
16
mouseX=evt.pageX?evt.pageX:evt.clientX;
mouseY=evt.pageY?evt.pageY:evt.clientY;
document.getElementById(‘mydiv’).style.
➥left=mouseX-1;
document.getElementById(‘mydiv’).style.top=mouseY-1;
}
</script>
Com esse código de exploit (e o Firefox 3.0.5), ao
passar o mouse sobre o link, a barra de status mostrará
o link da página web (porque o link em si não foi modificado de forma alguma), mas esse não é o que será
levado em consideração quando você clicar nele.
Segurança difícil
Em resumo, JavaScript é uma linguagem Turing-completa, o que significa que ela pode realizar qualquer
cálculo imaginável. Acrescente a isso uma gigantesca
biblioteca padrão de métodos que podem interagir com
o navegador web (como onmouseover, por exemplo) de
formas potencialmente inesperadas e temos uma receita para o desastre. Os agressores também podem usar
truques, como colocar o código JavaScript num arquivo em outro servidor e então chamá-lo com o método
document.write para carregar o arquivo remotamente.
Novamente, esse é um recurso legítimo que pode ser
fortemente abusado por agressores.
Pelo lado bom, temos sites como o Google. Se você
quiser usar seu serviço Analytics ou de anúncios, basta
inserir um pequeno trecho de código JavaScript nas suas
páginas, que por sua vez chamam programas JavaScript
bem maiores dos sites do Google. As vantagens incluem: a
possibilidade de clientes fazerem cache do JavaScript por
vir da mesma URL (o que significa que as páginas serão
carregadas mais rapidamente), o Google poder atualizar
seus programas JavaScript de forma centralizada, as pessoas
que o utilizam não precisarem atualizar suas páginas e as-
http://www.linuxmagazine.com.br
Insegurança | COLUNA
sim por diante. A desvantagem é que os agressores podem
incluir JavaScript em páginas web e servi-las a partir de
locais remotos. Dependendo das variáveis document.referrer, document.location e location.href, elas podem servir
código personalizado para cada site ou nenhum código.
Portanto, se você tentar copiar e examinar a página web
hostil numa sandbox, o código hostil não será caregado,
ou uma versão inofensiva será enviada.
Desligar
Espero que você não goste de banco online, compras
ou qualquer outro site “Web 2.0”, incluindo Gmail,
Facebook e StackOverflow.
Ligar seletivamente
Não é uma má ideia. As extensões do Firefox como
NoScript tornam essa experiência relativamente indolor
(pelo menos depois que você permitir o JavaScript de
todos os sites que costuma visitar e nos quais confia).
Após instalar o NoScript, ao visitar uma página que
tente carregar JavaScript (seja de seu próprio servidor
ou de outro), você receberá um alerta no canto inferior
direito do seu navegador. Quando isso acontecer, clique
no botão Opções e permita que o site carregue scripts
temporariamente (até o Firefox ser reiniciado) ou para
sempre, ou bloqueie-os inteiramente.
Entretanto, não é possível permitir seletivamente certos scripts dentro de um domínio e bloquear outros com
facilidade. Se um agressor conseguir realizar um ataque
de cross-site scripting contra um site em que você confia,
como seu banco, ele será capaz de executar seu Java­
Script hostil na máquina do visitante sem qualquer alerta.
Política de segurança de conteúdo
Por que não permitir que os domínios especifiquem o
que deve ser carregado a partir de seus sites? Essa ideia foi
proposta como uma “Política de Segurança de Conteúdo”
(Content Security Policy, [1]). Infelizmente, o projeto
ainda é novo e não ganhou muita atenção (no lado positivo, existe uma especificação em funcionamento e uma
extensão de exemplo para o Firefox implementar). No
futuro, espera-se que esse projeto ganhe mais momento.
Aí vem o Linux
Se não for possível desativar JavaScript globalmente e
se controlá-lo individualmente por domínio for impraticável, como se espera que você navegue na Web com
segurança e tenha acesso a sites baseados em JavaScript?
Usando o poder do Linux, é claro!
Se você está lendo esta revista, imagino que seja grande
a probabilidade de você estar usando Linux (se não, impressione-se com a simplicidade para se resolver um problema).
Linux Magazine #53 | Abril de 2009
SO multiusuário (Linux) + xhost
Se você usa o X Window System, seu desktop foi projetado para, entre outras coisas, permitir que diferentes
usuários e até sistemas usem e exibam programas no
desktop. O servidor X renderiza e exibe as informações
no desktop. O cliente X executa o programa e envia os
dados para exibição pelo servidor X. Para permitir que
usuários locais e sistemas remotos interajam com o servidor X de forma segura numa dada máquina, são usados
controles de acesso. Com o programa xhost é possível
manipular esses controles de acesso. Se você quiser
navegar na Web sem se preocupar se um site remoto
executar código hostil e apoderar-se da sua máquina,
simplesmente crie um novo usuário com o único propósito de executar o Firefox. O novo usuário terá permissão de executar e exibir programas no seu desktop:
(Como root, digite)
# adduser webuser
# passwd webuser
(E com seu próprio usuário)
$ xhost +SI:usuárioLocal:webuser
Esse código cria e define uma senha para o usuário
webuser e, em seguida, emprega o xhost para permitir
que essa nova conta use o seu monitor.
Então, faça login com o usuário webuser e execute
o Firefox.
Para navegar na Web, você pode abrir um terminal,
usar o comando su para adotar o usuário webuser e só
então executar o Firefox, que usará o seu monitor.
Conclusão
Às vezes é mais fácil evitar problemas do que tentar
solucioná-los de forma elegante. O Linux oferece muita
flexibilidade; por exemplo, múltiplos usuários podem
usar o mesmo sistema – na verdade, até a mesma tela,
teclado e mouse. A longo prazo, definir contêineres para
os aplicativos individuais serem facilmente restaurados
é o melhor caminho. Certamente não podemos esperar
que os softwares eliminem toda e qualquer falha. n
Mais informações
[1]Política de Segurança de Conteúdo:
http://people.mozilla.org/~bsterne/
content-security-policy/
Kurt Seifried é consultor de segurança da informação especializado
em redes e Linux desde 1996. Ele frequentemente se pergunta como
a tecnologia funciona em grande escala mas costuma falhar em
pequena escala.
17
Download