Ataque à cadeia de suprimentos do Polyfill injeta malware em arquivos JavaScript de CDN
26 de junho de 2024
0 minutos de leitura
Em 25 de junho de 2024, a equipe de pesquisa de segurança e malware da Sansec anunciou que um popular projeto de polyfill para JavaScript havia sido tomado por uma empresa estrangeira identificada como de origem chinesa, que passou a inserir código malicioso em arquivos JavaScript obtidos da CDN em: cdn.polyfill.io. Segundo a Sansec, mais de 100 mil sites foram afetados por esse ataque ao polyfill, incluindo empresas de capital aberto como a Intuit, entre outras.
Perguntas frequentes
A Snyk foi afetada pelo ataque à cadeia de suprimentos do Polyfill?
Não. A plataforma Snyk, incluindo nossas ferramentas, não foi afetada pelo ataque atual à cadeia de suprimentos do Polyfill.
O Snyk consegue detectar o problema de segurança do Polyfill?
O Snyk Code, nosso mecanismo SAST em tempo real baseado em machine learning, consegue detectar vários usos de URLs em código funcional, incluindo JavaScript, PHP e muitas outras linguagens.
Veja um exemplo de regra personalizada do Snyk Code que você pode adicionar:
Essa regra detecta o uso de qualquer URL de cdn.polyfill.io em código JavaScript ou PHP. Por exemplo, neste trecho de código, a inclusão manual do script será detectada:
Observação: a regra personalizada corresponde apenas a código JavaScript ou PHP, não a tags <script src=“…”></script> simples em HTML.
Devo adicionar uma regra de lista de bloqueio apenas para o site cdn.polyfill.io?
Vários relatos registraram que o agente malicioso adicionou novos domínios, incluindo: polyfill[.]site, polyfill[.]com, bootcdn[.]net, bootcss[.]com, staticfile[.]net, staticfile[.]org, unionadjs[.]com, xhsbpza[.]com, union.macoms[.]la e newcrbpc[.]com. Recomendamos acompanhar esses relatos de perto e atualizar sua regra personalizada do Snyk Code de acordo.
O que aconteceu com a biblioteca polyfill maliciosa?
Em fevereiro de 2024, uma empresa chinesa anunciou que adquiriria o site polyfill.io de Jake Champion, criador da biblioteca Node.js polyfill-library, e do proprietário do site. A empresa chinesa Funnull, que oferecia serviços de CDN e hospedagem, assumiu o controle e, desde então, é proprietária do domínio, da organização no GitHub e do repositório.

Pouco depois do anúncio da aquisição, o domínio polyfill.io passou a apontar para um novo CNAME: polyfill.io.bsclink.cn.
Desenvolvedores já davam sinais de que uma catástrofe estava prestes a acontecer, como no comentário a seguir no GitHub, de Renaud Chaput:
O Polyfill.io pertencia à equipe web do Financial Times, depois passou a ser gerenciado pela comunidade, e o último mantenedor vendeu o projeto para uma empresa chinesa de CDN meio suspeita. Eles tiraram o serviço da Fastly (plataforma de CDN e computação de borda que hospedava o código aberto do serviço) e começaram a adulterar os arquivos enviados.
Renaud Chaput
Em abril e junho, membros da comunidade também deram outros sinais de irregularidades e alertaram sobre a transferência da propriedade para uma empresa terceirizada. As suspeitas aumentaram ainda mais quando os comentários foram apagados de uma issue no GitHub:

Andrew Betts, colega de Jake Champion na Fastly, foi o autor original do serviço web polyfill. Esse projeto permitia a inclusão automática de bibliotecas polyfill de JavaScript em sites, de acordo com o user agent ou outras propriedades. As declarações de Andrew remontam a fevereiro, quando ele alertou que não tinha qualquer envolvimento com o site oficial cdn.polyfill.io.
Não conhecemos nenhuma biblioteca polyfill específica no npm que faça parte dessa campanha de um agente malicioso para injetar código. Ainda assim, bibliotecas de diferentes ecossistemas de software, como sistemas de gerenciamento de conteúdo (CMS), incluindo o projeto Magento, podem conter código que insere scripts JavaScript estáticos provenientes de cdn.polyfill.io. Em particular, detectamos a CVE-2024-38526, um alerta de segurança referente à biblioteca pdoc, no registro PyPI, que fornece documentação de API para projetos Python. Quando a documentação é gerada com o comando pdoc --math, ela pode conter links para arquivos JavaScript de polyfill.io. Esse comportamento da biblioteca pdoc foi corrigido na versão 14.5.1 do pdoc. Recomendamos que os usuários atualizem o quanto antes.
Qual é a situação atual do site polyfill.io?
O site polyfill.io está, na prática, fora do ar. Para proteger os usuários, extensões de navegador que bloqueiam anúncios, como o uBlock, acompanharam os relatos sobre o site e agora impedem ativamente o acesso a ele.

Em 21 de junho, foi noticiado que o Google começou a exibir uma mensagem de erro de “site comprometido” no site do Google Ads. A situação se agravou após relatos de tentativas de falsificação de sites usando o domínio googie-anaiytics[.]com.
Qual é o impacto do malware do polyfill.io?
Em 2017, Andrew Betts, autor original do site polyfill.io, hospedado na Fastly, relatou que 91 milhões de navegadores por dia faziam solicitações para importar a biblioteca e que eram registradas até 700 milhões de solicitações por mês para atualizar navegadores antigos com padrões web modernos.

Relatos nas redes sociais e em outras fontes apontam que o site da Hulu incorpora a biblioteca JavaScript do site cdn.polyfill.io, identificada como maliciosa (relato de Theo).

Em outro relato, Germán Fernández também identificou o site da comunidade Atlassian como importador da biblioteca polyfill de JavaScript do domínio malicioso polyfill.io.

O Silent Push Labs também identificou sites governamentais que incluíam a origem maliciosa polyfill.io e os reportou à CISA.
O que é um polyfill de JavaScript?
Um polyfill de JavaScript é um trecho de código criado para oferecer recursos modernos em navegadores antigos que não os suportam nativamente. Historicamente, os polyfills foram essenciais para desenvolvedores web que buscavam criar aplicações compatíveis com diferentes versões de navegadores. Eles funcionam como uma ponte, permitindo que navegadores antigos executem recursos mais recentes do JavaScript e proporcionando uma experiência consistente, independentemente da idade ou dos recursos do navegador.
Nos primórdios do desenvolvimento web, os navegadores evoluíam em ritmos diferentes, criando um ambiente fragmentado em que o mesmo código podia não funcionar da mesma forma em todas as plataformas. Em geral, o suporte às APIs dos navegadores não era uniforme. Como os desenvolvedores não tinham controle sobre as versões de navegador usadas pelos usuários, não podiam garantir que uma mesma API estaria disponível durante a execução do código JavaScript. Os polyfills surgiram como solução para esse problema: com bibliotecas polyfill, os desenvolvedores podiam escrever código JavaScript moderno sem se preocupar com questões de compatibilidade. Por exemplo, métodos como Array.prototype.includes e Promise não eram compatíveis com navegadores antigos, como o Internet Explorer. Ainda assim, os desenvolvedores podiam disponibilizar esses recursos carregando uma biblioteca polyfill no navegador.
A função de uma CDN de JavaScript nas bibliotecas polyfill
Uma rede de distribuição de conteúdo (CDN) é um sistema de servidores distribuídos pelo mundo que entrega conteúdo web aos usuários com base em sua localização geográfica. No caso das bibliotecas polyfill de JavaScript, as CDNs têm um papel fundamental: hospedam e disponibilizam essas bibliotecas de forma eficiente em todo o mundo. Com elas, os desenvolvedores garantem que os polyfills cheguem aos usuários com rapidez e confiabilidade, reduzindo a latência e o tempo de carregamento. O uso de uma CDN também ajudava a evitar que os desenvolvedores precisassem incluir bibliotecas JavaScript no pacote da aplicação.
Um caso de uso comum de CDN que você provavelmente já encontrou é o de métricas na nuvem e desempenho de aplicações, como o Google Analytics, que recomenda oficialmente adicionar o seguinte código ao seu site:
No ataque que comprometeu o polyfill, cdn.polyfill.io era uma CDN amplamente usada que disponibilizava polyfills dinamicamente com base nos cabeçalhos HTTP das solicitações recebidas. Assim, o polyfill adequado era entregue de acordo com o navegador e a versão do usuário, garantindo compatibilidade ideal.
Riscos de segurança dos polyfills hospedados em uma CDN
Usar polyfills hospedados em uma CDN traz riscos significativos de segurança, principalmente pela possibilidade de execução de código JavaScript arbitrário no contexto da aplicação. Esse risco costuma ser classificado como uma vulnerabilidade de cross-site scripting (XSS) na aplicação web.
Quando uma aplicação obtém uma biblioteca polyfill de uma CDN, ela depende da integridade e da segurança do servidor externo — ou seja, da própria CDN. Se a CDN ou a biblioteca hospedada for comprometida, como no ataque recente a cdn.polyfill.io, o novo código malicioso poderá ser injetado e executado no navegador do usuário. Esse código pode realizar diversas ações prejudiciais, como redirecionar usuários para sites de phishing, roubar informações confidenciais ou até disseminar outros malwares. Em termos de segurança de navegadores, esse tipo de vulnerabilidade XSS é a consequência mais grave.
Como se proteger contra ataques à cadeia de suprimentos de CDNs
O ataque recente ao projeto polyfill de JavaScript destaca a importância fundamental dos recursos que sustentam o ecossistema web, e as CDNs são uma parte importante dele. As preocupações com a segurança da cadeia de suprimentos costumam se concentrar em registros de pacotes open source, como PyPI e npm, mas o ataque ao polyfill de JavaScript nos lembrou de que as CDNs também são um componente essencial da web.
Veja algumas práticas recomendadas que você pode adotar para se proteger contra ataques desse tipo:
Use CDNs confiáveis: use apenas CDNs de provedores de boa reputação. A Cloudflare, por exemplo, é conhecida por suas medidas robustas de segurança e confiabilidade.
Substitua o polyfill: a Cloudflare criou uma cópia do polyfill em https://cdnjs.cloudflare.com/polyfill, recomendada como substituta direta.
Monitore as dependências: faça auditorias regulares e monitore todos os scripts e dependências de terceiros.
Integridade de sub-recursos: ferramentas como Subresource Integrity (SRI) ajudam a garantir que o conteúdo entregue por uma CDN não tenha sido adulterado. Elas também permitem fixar uma versão ou hash esperado, que já tenha sido auditado e considerado livre de comportamentos maliciosos ou indesejados.
Política de Segurança de Conteúdo (CSP): implemente uma CSP rigorosa para restringir as origens das quais os scripts podem ser carregados. Isso pode impedir a execução de scripts maliciosos. Como os polyfills costumam fazer parte do caminho crítico de carregamento da aplicação, eles têm as mesmas permissões que qualquer outro JavaScript na página, o que os torna alvos prioritários para invasores que querem explorar essa confiança. Esse risco reforça a importância de usar CDNs seguras e confiáveis, implementar medidas robustas, como uma Política de Segurança de Conteúdo (CSP), e auditar regularmente as dependências de terceiros para se proteger contra essas vulnerabilidades.
Mantenha tudo atualizado: mantenha todas as bibliotecas e dependências atualizadas. Muitos ataques exploram vulnerabilidades conhecidas que já foram corrigidas em versões posteriores.
Considere alternativas: avalie se os polyfills ainda são necessários no seu projeto. Com a modernização dos navegadores, muitos recursos oferecidos por polyfills já são compatíveis nativamente. Considere fortemente incluir as dependências nos próprios arquivos do projeto, em vez de depender de provedores terceirizados, como as CDNs.



