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