77% dos sites usam pelo menos uma biblioteca JavaScript vulnerável
Tim Kadlec
29 de março de 2017
0 minutos de leituraNa semana passada, foi publicado um estudo que apontou que cerca de 37% dos sites incluíam pelo menos uma biblioteca JavaScript com uma vulnerabilidade conhecida. Quando escrevemos sobre as descobertas, mencionamos que, na nossa opinião, a realidade era quase certamente pior.
E é. Muito pior, na verdade.
Fizemos nosso próprio teste com as 5.000 principais URLs da Alexa e descobrimos que impressionantes 76,6% delas incluem pelo menos uma biblioteca vulnerável. Se você quer saber como conduzimos o teste, os detalhes estão abaixo — ou fique à vontade para ir direto aos resultados.
O teste
Para realizar os testes, pegamos as 5.000 principais URLs da Alexa. Algumas apresentaram erros quando tentamos acessá-las, então continuamos descendo na lista da Alexa até reunir 5.000 páginas que carregaram corretamente.
Executamos o WebPageTest em cada URL. O WebPageTest carregou cada página no Chrome e, em seguida, executou um código JavaScript personalizado para identificar a versão de algumas bibliotecas JavaScript.
Por exemplo, para determinar qual versão do jQuery estava sendo usada, cada página executava o código a seguir após o carregamento:
Nesta primeira rodada, incluímos verificações para cada uma das bibliotecas a seguir:
jQuery
Handlebars
Mustache
React
Angular
Ember
jQuery UI
YUI
Dojo
Para cada versão detectada, consultamos o banco de dados de vulnerabilidades de código aberto da Snyk para descobrir quantas bibliotecas tinham uma vulnerabilidade conhecida.
Resultados nada animadores
Como mencionamos acima, a segurança das bibliotecas JavaScript está em um estado chocantemente ruim — não dá para dourar a pílula. Dos 5.000 sites, 3.831 (76,6%) incluem uma biblioteca JavaScript com pelo menos uma vulnerabilidade conhecida.

Pode parecer estranho dizer isso diante de uma porcentagem tão alta, mas, assim como no estudo original, a realidade provavelmente é pior. Testamos nove bibliotecas JavaScript. A lista de frameworks e bibliotecas JavaScript disponíveis para desenvolvedores inclui centenas e centenas de opções. As que testamos estão entre as mais populares, então é improvável que a porcentagem aumente muito; ainda assim, alguns pontos percentuais a mais são quase certos.
E, mais uma vez, verificamos apenas vulnerabilidades conhecidas em bibliotecas JavaScript de terceiros executadas no lado do cliente. O uso no lado do servidor não foi considerado, assim como o JavaScript escrito sob medida. Além disso, novas vulnerabilidades são adicionadas diariamente ao nosso banco de dados — existem outras, mesmo que ainda não sejam conhecidas publicamente.
jQuery
Sem surpresa, o jQuery é a biblioteca mais popular entre as que testamos — seu domínio impressionante já está bem documentado. Detectamos o jQuery em 79% das 5.000 principais URLs.
Embora não seja uma biblioteca particularmente vulnerável (há cinco vulnerabilidades conhecidas, todas corrigidas em versões posteriores), a popularidade do jQuery já causa bastante confusão por si só.
Como se constatou, mesmo que verificássemos apenas o jQuery, ainda encontraríamos 75,1% dos sites usando uma versão com pelo menos uma vulnerabilidade. Isso se deve, em grande parte, à idade das bibliotecas jQuery que estão em produção. 17,4% das versões do jQuery encontradas em produção têm mais de cinco anos. Isso combina bastante com o estudo inicial: as pessoas não atualizam com muita frequência.

O cenário é ainda mais complicado para quem usa jQuery, pois as únicas versões sem vulnerabilidades conhecidas são as >=3.0.0. Para muitos usuários atuais, isso significa que atualizar não é tão simples quanto instalar uma versão menor mais recente: há possíveis mudanças incompatíveis envolvidas. Cerca de 79% das bibliotecas jQuery detectadas eram da versão 1.x. Embora a versão final do jQuery 3.0.0 tenha sido lançada há quase um ano, apenas 3,6% dos sites usavam alguma versão 3.x.


Na próxima semana, vamos analisar o jQuery em mais detalhes, pois sua popularidade sem igual o torna especialmente interessante.
jQuery UI
O jQuery UI ficou em segundo lugar em popularidade: foi encontrado em 19,3% das URLs testadas. Mais uma vez, a maioria dos usuários do jQuery UI utiliza uma versão vulnerável, apesar de já haver atualizações disponíveis. Cerca de 91% das bibliotecas jQuery UI encontradas têm pelo menos uma vulnerabilidade.

Mais uma vez, boa parte disso se deve à falta de atualizações: 21,8% dos sites que usam jQuery UI estão em uma versão com mais de cinco anos.
Handlebars
O Handlebars foi detectado em 3,4% das URLs testadas. Entre elas, 68% usavam uma versão vulnerável do Handlebars. Mais uma vez, a principal causa é a adoção lenta de novas versões. À primeira vista, parece que o uso do Handlebars está um pouco mais atualizado. A versão mais recente da biblioteca (4.0.6) não foi detectada, mas a versão imediatamente anterior (4.0.5) também foi a mais comum em produção, representando 26,7% do uso do Handlebars.

No entanto, como o ritmo de lançamentos diminuiu (foram lançadas apenas duas versões menores desde novembro de 2015), esses sites ainda usam uma versão da biblioteca com quase dois anos. No geral, 40% das versões do Handlebars detectadas tinham mais de três anos.
React, Mustache, Angular, YUI e Dojo
React (1,7%), Mustache (1,6%), Angular (1,3%), YUI (0,7%) e Dojo (0,2%) foram detectados com pouca frequência para que fosse possível tirar conclusões confiáveis sobre o uso de cada um. Mas, considerando o uso combinado, as versões vulneráveis ainda são muito comuns: 56,3% das versões dessas bibliotecas encontradas nos dados têm pelo menos uma vulnerabilidade.
Uma conclusão otimista
Não há como negar: a situação atual não é boa. Embora esperássemos que o número do estudo original fosse otimista, não imaginávamos que 77% dos sites usariam pelo menos uma biblioteca vulnerável.
E, para deixar claro, não existe uma solução única para esse problema. Em vez disso, precisamos combinar mais conscientização, ferramentas melhores e uma maneira mais simples de manter as dependências JavaScript no front-end — a adoção de gerenciadores de pacotes não é tão ampla quanto no desenvolvimento de back-end. Esse é só o começo.
Mas, como já dissemos, continuamos otimistas. Proteger JavaScript de terceiros é um problema solucionável — só exige um pouco mais de esforço do que imaginávamos.
Devido à sensibilidade de um relatório como este, não vamos compartilhar os dados brutos — isso seria praticamente entregar uma lista de sites e possíveis vetores de ataque. No entanto, se você é responsável por um site, pode falar conosco para saber se ele aparece no relatório e, em caso afirmativo, se alguma vulnerabilidade foi descoberta. Se você usa pacotes npm, testar sua aplicação com a Snyk também pode ajudar a identificar possíveis brechas de segurança.
Comece a resolver desafios de capture the flag
Aprenda a resolver desafios de capture the flag assistindo sob demanda ao nosso workshop virtual introdutório.